activity的生命周期
oncreate(Bundle savedInstanceState):在activity第一次被创建的时候调用。这里是你做所有初始化设置的地方──创建视图、绑定数据至列表等。如果曾经有状态记录,则调用此方法时会传入一个包含着此activity以前状态的包对象做为参数。
onRestart():在activity停止后,在再次启动之前被调用。
onStart():当activity正要变得为用户所见时被调用。
onResume():在activity开始与用户进行交互之前被调用。此时activity位于堆栈顶部,并接受用户输入。
onPause():当系统将要启动另一个activity时调用。此方法主要用来将未保存的变化进行持久化,停止类似动画这样耗费CPU的动作等。这一切动作应该在短时间内完成,因为下一个activity必须等到此方法返回后才会继续。
onStop():当activity不再为用户可见时调用此方法。这可能发生在它被销毁或者另一个activity(可能是现存的或者是新的)回到运行状态并覆盖了它。
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的话没有意义