1.Activity的启动流程
2.Activity生命周期
onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart
3.如何保存Activity的状态?
Activity的状态通常情况下系统会自动保存,只有当我们需要保存额外的数据时才需要使用到这样的功能。一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity 的所有信息和状态数据不会消失, 当 activity 重新回到前台之后,所有的改变都会得到保留。
但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了。如果之后这个activity重新回到前台, 之前所作的改变就会消失。为了避免此种情况的发生, 我们可以覆写 onSaveInstanceState()方法。onSaveInstanceState()方法接受一个 Bundle类型的参数, 开发者可以将状态数据存储到这个 Bundle对象中, 这样即使 activity 被系统摧毁, 当用户重新启动这个 activity 而调用它的onCreate()方法时, 上述的Bundle对象会作为实参传递给onCreate()方法, 开发者可以从Bundle对象中取出保存的数据, 然后利用这些数据将activity恢复到被回收之前的状态。
需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下BACK键退出activity时, 用户显然想要关闭这个 activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调用 onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前。
4.onSaveInstanceState方法会在什么时候被执行?
1.当用户按下HOME键时。
系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则。
2.长按HOME键,选择运行其他的程序时。
3.按下电源按键(关闭屏幕显示)时。
4.从activity A中启动一个新的activity时。
5.屏幕方向切换时,例如从竖屏切换到横屏时。
在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行
总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。
5.两个 Activity 之间跳转时必然会执行的是哪几个方法?
一般情况下比如说有两个activity,分别叫A,B,当在A里面激活B组件的时候,A会调用 onPause()方法,然后B调用onCreate() ,onStart(), onResume()。这个时候B覆盖了窗体,A会调用onStop()方法. 如果B是个透明的,或者是对话框的样式, 就不会调用A的onStop()方法。
6.横竖屏切换时Activity的生命周期
此时的生命周期跟清单文件里的配置有关系。
1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期默认首先销毁当前activity,然后重新加载。
2.设置Activity android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
7.如何将一个Activity设置成窗口的样式
只需要给我们的Activity配置如下属性即可。android:theme="@android:style/Theme.Dialog"
8.如何退出 Activity?如何安全退出已调用多个 Activity的Application?
1.调用finish():
通常情况用户退出一个Activity 只需按返回键,我们写代码想退出activity直接调用finish()方法就行。
2.记录打开的Activity:
在Application创建全局变量List<Activity>,通过ActivityLifecycleCallbacks记录每一个打开的Activity,在需要退出时,关闭每一个Activity即可。
3.发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。给某个activity 注册接受广播的意图 registerReceiver(receiver, filter)。如果接受到的是关闭 activity 的广播,就调用 finish()方法把当前的activity finish()掉。
4.递归退出
在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
5.通过 intent的flag 来实现
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity。此时如果该任务栈中已经有该Activity,那么系统会把这个Activity上面的所有Activity干掉。其实相当于给Activity配置的启动模式为SingleTask。
9.Activity的四种启动模式
1.standard
标准模式,默认配置。每次都会创建一个新的实例。可以有多个相同的实例,相同Activity可以叠加。
2.singleTop
栈顶复用模式,可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
3.singleTask
栈内复用模式,只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例。若存在,则会把task中在其之上的其它Activity全部干掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存。
4.singleInstance
单例模式,只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
10.Android 中的 Context, Activity,Appliction 有 什么区别?
相同:Activity和Application都是Context的子类。
Context从字面上理解就是上下文的意思,在实际应用中它也确实是起到了管理上下文环境中各个参数和变量的作用,方便我们访问各种资源。
不同:维护的生命周期不同。
Context维护的是当前的Activity的生命周期,Application维护的是整个应用的生命周期。
使用Context要防止内存泄露,注意以下几个方面:
1. 不要让生命周期长的对象引用Activity context,即保证引用activity的对象要与activity本身生命周期是一样或短于activity的生命周期。
2. 对于生命周期长的对象,可以使用application,context。
3. 避免非静态内部类,尽量使用静态类,避免内部类对外部对象的引用而导致的生命周期问题。
11.两个Activity之间传递数据,有哪些方式?
1.intent
2.广播接收者
3.ContentProvider
4.利用static静态数据,public static成员变量
5.利用外部存储的传输,如File文件存储、SharedPreferences首选项、Sqlite数据库等
12.Context是什么?
1.它描述的是一个应用程序环境的信息,即上下文。
2.该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(ContextIml)。
3.通过它我们可以获取应用程序的资源和类。也可以进行应用级别操作,如:启动一个Activity,发送广播,接受Intent信息等。