onDestroy():在activity销毁前调用。这是activity接收的最后一个调用。这可能发生在activity结束(调用了它的 finish() 方法)或者因为系统需要空间所以临时的销毁了此acitivity的实例时。你可以用isFinishing() 方法来区分这两种情况。
协调activity
当一个activity启动了另外一个的时候,它们都会经历生命周期变化。一个会暂停乃至停止,而另一个则启动。这种情况下,你可能需要协调好这些activity:
生命周期回调顺序是已经定义好的,尤其是在两个activity在同一个进程内的情况下:
1. 调用当前activity的 onPause() 方法。
2. 接着,顺序调用新启动activity的onCreate()、 onStart()和onResume()方法。
3. 然后,如果启动的activity不再于屏幕上可见,则调用它的onStop()方法。
总之:1、Activity 从创建到进入运行态所触发的事件 onCreate()-->onStart-->onResume()
2、从运行态到停止态所触发的事件 onPause()--->onStop()
3、从停止态到运行态所触发事件 onRestart()-->onStart()--->onResume()
4、从运行态到暂停态所触发事件 onPause()
5、从暂停态到运行态所触发事件 onResume()
横竖屏幕切换生命周期
1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次.
2.设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次.
3.设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法.
service的生命周期
启动Service时可调用startService和bindService()方法来启动,用这两种方法启动的Service的生命周期是不同的。
Service的生命周期只有onCreate,onStart和onDestroy,没有onResume,onPause和onStop,大多数时间Service都是运行的,但在严重的内存压力下它也可能被系统kill,如果被kill,系统会在稍后尝试重新启动这个Service
Service的调用
途径一:
调用Context.startService()启动Service,调用Context.stopService()或Service.stopSelf()或Service.stopSelfResult()关闭Service的调用。
Service生命周期分析:
注:onCreate,onStart(),onDestroy()是Service生命周期相关的方法
当Context.startService()启动Service时,如果Service本身没有运行,则调用onCreate()->onStart()完成Service启动。如果Service已经运行,则只调用onStart(),onStart()可以多次被调用。
Service关闭必须调用Context.stopService()或Service.stopSelf()或Service.stopSelfResult()方法,关闭之前调用onDestroy()方法,否则如果Context直接退出而没有停止Service的话,Service会一直在后台运行。该Service的调用者只能再启动后通过stopService关闭Service。
生命周期顺序为:onCreate()->onStart()->onDestroy()
途径二:
调用Context.bindService()进行初始化绑定,使用Context.unbindService()取消绑定,由于Service和Context是绑定关系,当Context退出或被销毁时,Service也会相应退出。
Service生命周期分析:
调用Context.bindService()时,Service会经历onCreate->onBind(),onBind将返回给客户端一个IBind实例,IBind允许客户端回调服务的方法。此时Context和Service是绑定在一起的,Context退出了,Service调用onUnbind()->onDestroy()相应退出。
生命周期顺序为:onCreate->onBind(只一次,不可多次绑定)->onUnbind->onDestroy()
BroadcastReceiver只能通过startService启动Service,因为广播本身生命周期很短,bind的话没有意义
果不是通过bindService创建的服务(但仍然通过bindService得到了服务对象),就可能unbindService后还在运行,否则应该是结束掉了。