Android_Activity生命周期全解
写在前面: 写这篇文章,主要的目的是为了理清下自己的思路,服务好自己的同时,更好的服务于大家。
我们需要注意的应该是,我们在什么时候用哪个生命周期回调方法做什么事情。
印象笔记地址,点击
不像其他编程范式一样:程序从main()方法开始启动。Android系统根据生命周期的不同阶段唤起对应的回调函数来执行代码。系统存在启动与销毁一个activity的一套有序的回调函数。
Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。—By Google
Activity 基本上以三种状态存在:
-
继续/运行
- 此 Activity 位于屏幕前台并具有用户焦点。(有时也将此状态称作“运行中”。)
-
暂停
- 另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 暂停的 Activity 处于完全活动状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接),但在内存极度不足的情况下,可能会被系统终止。
-
停止
- 该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。 已停止的 Activity 同样仍处于活动状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,但未与窗口管理器连接)。 不过,它对用户不再可见,在别处需要内存时可能会被系统终止。
- 如果 Activity 处于暂停或停止状态,系统可通过要求其结束(调用其 finish() 方法)或直接终止其进程,将其从内存中删除。(将其结束或终止后)再次打开 Activity 时,必须重建。
生命周期图(经简单翻译后):
生命周期方法详解
onCreate()
执行“全局”状态设置(例如定义布局),创建视图、将数据绑定到列表等等。
应该在实现内初始化 Activity 的必需组件。
最重要的是,您必须在此方法内调用 setContentView(),以定义 Activity 用户界面的布局。
onRestart()
在 Activity 已停止并即将再次启动前调用。 始终后接 onStart()。
onStart()
可见。
onResume()
可与用户交互。
onPause()
通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。
做一些必要的操作,比如你想存储一些数据到数据库,以方面第二个界面Activity调用,则应在 onPause() 而不是 onStop() 执行期间向数据库写入数据。
onStop()
不可见/隐藏。
onDestroy()
释放所有资源。
答疑
1
Android Studio
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
据说在一个APP里面没有主Activity入口,程序安装后,手机程序列表上会没有应用的那么在设备的主界面列表里面不会呈现你的app图标。这个我还真没有测试出来,因为删掉后,智能的Android Studio不给运行。Eclipse待测~~~
2
也有网上说,如果直接finish,其会直接调用ondestroy方法,不会调用onPause,onStop,经我测试,分情况,如果是在生命周期回调里直接finish,比如onCreate,那就会直接调用ondestroy方法,如果是在onstart里, 会调用onStop,在调用ondestroy,如果是在onResume里finish, 还是会调用onPause,onStop,最后 调用ondestroy 。如果在其它方法里面调用的话,比如按钮点击finish,也还是会调用onPause,onStop。
3
需要特别注意: 一个activity跳转到另一个activity(完全覆盖),自身先只调用onPause,等第二个activity生命周期进入运行状态了,它才会调用自身的onStop方法(注意,如果没有完全遮挡,不会调用onStop)。所以在这里需要注意的是,不管在哪个activity里,onPause都不能执行太耗时的操作,不然会延缓跳转页面的打开,同理,可以在onStop方法里执行善后操作。
4
onSaveInstanceState、onRestoreInstanceState方法并不属于Android的生命周期回调方法,需要理清。
-
onRestoreInstanceState
-
其执行一般在onStart之后,onResume之前。
-
调用时机:它并不是与 onSaveInstanceState成对出现,它出现的时机是activity被系统销毁了( 人为的不算 ),在创建时会调用。
-
-
onSaveInstanceState
-
其执行一般在onPause之后,onStop之前。
-
调用时机:如果是要销毁当前activity,它不会调用。跳转到另一个activity会调用;跳转到桌面会调用;在跳转到一个没有完全覆盖的activity(透明、半透明)时,也会调用onSaveInstanceState,但不会调用onStop,因为其处在暂停状态;横竖屏切换时会调用。
-
5
保存Activity的状态
当系统为了恢复内存而销毁某项 Activity 时,Activity 对象也会被销毁,因此系统在继续 Activity 时根本无法让其状态保持完好,而是必须在用户返回 Activity 时重建 Activity 对象。但用户并不知道系统销毁 Activity 后又对其进行了重建,因此他们很可能认为 Activity 状态毫无变化。 在这种情况下,您可以实现另一个回调方法对有关 Activity 状态的信息进行保存,以确保有关 Activity 状态的重要信息得到保留:onSaveInstanceState()。
系统会先调用 onSaveInstanceState(),然后再使 Activity 变得易于销毁。系统会向该方法传递一个 Bundle,您可以在其中使用 putString() 和 putInt() 等方法以名称-值对形式保存有关 Activity 状态的信息。然后,如果系统终止您的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将 Bundle 同时传递给 onCreate() 和 onRestoreInstanceState()。您可以使用上述任一方法从 Bundle 提取您保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则传递给您的 Bundle 是空值(如果是首次创建该 Activity,就会出现这种情况,所以如果要从Bundle取值的话,建议在 onRestoreInstanceState() ,因为其被调用时,Activity百分百被销毁了,所以Bundle不会为空,否则在onCreate()里还要判断是否为空)。
如果你什么都不做
不过,即使您什么都不做,也不实现 onSaveInstanceState(),Activity 类的 onSaveInstanceState() 默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,CheckBox 小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过 android:id 属性)。如果小部件没有 ID,则系统无法保存其状态。(所以我认为,在有数据的UI控件里都需要提供一个唯一的 ID,显示UI看情况)
由于 onSaveInstanceState() 的默认实现有助于保存 UI 的状态,因此如果您为了保存更多状态信息而替换该方法,应始终先调用 onSaveInstanceState() 的超类实现,然后再执行任何操作。 同样,如果您替换 onRestoreInstanceState() 方法,也应调用它的超类实现,以便默认实现能够恢复视图状态。
上一篇: 面试系列(二):JVM工作原理
下一篇: I/O流 技术 学习笔记