Activity和Service的生命周期详解

       有些东西似懂非懂的时候,还是要仔细去搞明白,比如这个onNewIntent(),由于涉及到activity的生命周期,所有还是仔细说清楚,首先要对activity的四大启动方式有一定的了解,我们这里将singTask和非singleTask两种情况,我们都知道activity的生命周期onCreate->onStart->onRestart->onResume-.onPause->onStop->onDestory,如下图

                                                          


当我们启动一个activity时会依次调用它的onCreate->onStart->onResume,退出时依次调用onPause->onStop->onDestory,这里我们举一个例子,MainActivity是应用首先启动的activity,启动模式为singleTop,同时它的一个点击事件会启动SecondActivity,我们看一下启动过程:

04-24 17:35:01.615: D/-->MainActivity(8000): onCreate
04-24 17:35:01.645: D/-->MainActivity(8000): onStart
04-24 17:35:01.645: D/-->MainActivity(8000): onResume
04-24 17:35:03.555: D/-->MainActivity(8000): onPause
04-24 17:35:03.575: D/-->SecondActivity(8000): onCreate
04-24 17:35:03.575: D/-->SecondActivity(8000): onStart
04-24 17:35:03.575: D/-->SecondActivity(8000): onResume
04-24 17:35:04.025: D/-->MainActivity(8000): onStop
和开头提到的差不多,不同的是在Activity里面启动另一个Activity时会先调用第一个的onPause方法,第二个activity的onResume方法调用完之后才回去调用第一个activity的onStop方法,这时候我们返回的时候应该都知道先调用SecondActivity的onPause,紧接着调用MainActivity 的onRestart->onStart->onResume,然后在调用SecondActivity的onStop->onDestory方法,如下:
04-24 18:19:48.285: D/-->SecondActivity(10451): onPause
04-24 18:19:48.305: D/-->MainActivity(10451): onRestart
04-24 18:19:48.305: D/-->MainActivity(10451): onStart
04-24 18:19:48.305: D/-->MainActivity(10451): onResume
04-24 18:19:48.655: D/-->SecondActivity(10451): onStop
04-24 18:19:48.655: D/-->SecondActivity(10451): onDestroy

加入我们在MainActivity的点击事件中,让它启动MainActivity会怎么样,熟悉singleTop模式的话应该会知道它不会调用MainActivity的onCreate,onStart方法,它的调用栈情况如下,也就是说Intent在不启动新的Activity的情况下会调用onNewIntent这个方法,并且当前activity启动模式为singleTop、singleTask或singleInstance;standard模式启动当前与启动新的activity都是上面讲到的第一种情况:

04-25 08:40:18.837: D/-->MainActivity(18905): onCreate
04-25 08:40:18.847: D/-->MainActivity(18905): onStart
04-25 08:40:18.847: D/-->MainActivity(18905): onResume
04-25 08:40:20.297: D/-->MainActivity(18905): onPause
04-25 08:40:20.297: D/-->MainActivity(18905): onNewIntent
04-25 08:40:20.297: D/-->MainActivity(18905): onResume
04-25 08:40:22.457: D/-->MainActivity(18905): onPause
04-25 08:40:22.797: D/-->MainActivity(18905): onStop
04-25 08:40:22.797: D/-->MainActivity(18905): onDestroy

还有一种情况,非standrad模式下,MainActivity启动SecondActivity,然后在SecondActivity中启动MainActivity,调用栈情况如下,可以看出在先是SecondActivity的onPause,然后调用MainActivity的onNewIntent->onRestart->onStart->onResume,最后是SecondActivity的onStop方法:

04-24 18:19:43.735: D/-->MainActivity(10451): onStop
04-25 08:55:54.347: D/-->SecondActivity(21757): onPause
04-25 08:55:54.357: D/-->MainActivity(21757): onNewIntent
04-25 08:55:54.357: D/-->MainActivity(21757): onRestart
04-25 08:55:54.357: D/-->MainActivity(21757): onStart
04-25 08:55:54.357: D/-->MainActivity(21757): onResume
04-25 08:55:55.167: D/-->SecondActivity(21757): onStop

      总之就是onNewIntent这个方法在非standrad模式下,启动一个已经启动过的activity的时候调用,onNewIntent中应该和onCreate调用同一数据的处理方法,保证activity和上次的内容一致,activity的生命周期就讲到这,具体涉及到启动模式的情况可以自己动手测试一遍。


下面说一说Service的生命周期,如下图:

                                                                           

使用context.startService() 启动Service:
其生命周期为context.startService() ->onCreate()- >onStartCommand()->Service running-->(如果调用context.stopService() )->onDestroy() ->Service shut down,
如果Service还没有运行,则先调用onCreate()然后调用onStartCommand();如果Service已经运行,则只调用onStartCommand(),所以一个Service的onStartCommand方法可能会重复调用多次。 调用者自己调用stopSelf()或其他组件调用stopService()的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopSelf的话,Service会一直在后台运行。所以调用startService的生命周期为:onCreate --> onStartCommand(可多次调用) --> onDestroy,还有一点注意,新的API中onStart方法被onStartCommand代替了。

对于bindService()启动Service:
context.bindService()->onCreate()->onBind()->Service running-->onUnbind() -> onDestroy()
onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。如果想客户端下次绑定的时候不用再去onBind(),这时候只要在onUnbind()中返回true,那么下次客户端绑定的时候则调用onRebind。所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。并且bindService的生命周期随组件的生命周期结束而结束。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值