Android生命周期绑定

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android生命周期绑定相关的知识,希望对你有一定的参考价值。

参考技术A 最近封装了几个View,都和生命周期有关,比如BannerView、和我们公司的ARView,那他们的生命周期怎么绑定呢?刚开始我是直接告诉别人,你自己在哪个activity使用的,就在哪个activity绑定,结果使用的时候被甲方对接人员打回来说这是低级处理方式,wtm这暴脾气,谁tm低级了,但是没办法别人是甲方只能听他的,直接将生命周期的绑定绑在view里面。下面就介绍几个常用的生命周期绑定。

Application.ActivityLifecycleCallbacks是android自带的生命周期绑定接口,他有注册与解除方法,当我们进入一个activity的时候就可以注册绑定他了。

简单demo。比如我们要讲一个自定义的View绑定生命周期。
1、先定义一个Application.ActivityLifecycleCallbacks的实现类,为什么这样呢?是因为用户可以要什么选什么,就不用被迫每次都实现全部。

2、定义一个测试用的view,在构造方法绑定注册生命周期,

((Activity)context).getApplication().registerActivityLifecycleCallbacks(lifecycleCallbacks);这句话是注册生命周期当然他也对应了一个((Activity)context).getApplication().unregisterActivityLifecycleCallbacks(lifecycleCallbacks);解绑方法。
在ActivityLifecycleCallbacks 的实现中判断了返回的activity是否为这个view所在的acrivity因为很多activity都会走这个方法,如果不做判断,其他activity的生命周期也会影响这个view,所以加判断是个好习惯。

这次我们模拟一个普通类绑定生命周期这个类名叫Test,哈哈,是不是很高大上?但是写Test类之前先定义我们要绑定的生命周期接口LifecycleListener

这里我们监听下常用的onResume、onPause、onDestroy。
然后是Test类

然后写LifecycleDetector,尝试将test类的实例与fragment绑定

定义没有布局的fragment实例

然后保存fragment和Requestmanager关系

还有一个遗漏的接口

上面这些完成后,就可以使用了,我们随便搞个activity试试名字就叫LeftDemoActivity非常好听了有没有!

当你运行起来的时候,就是成功的时候。

有个东西忘啦,getSnapshot是做保存的,直接把源码拿过来的。

还有其他的方法我没试过,但是这样的生命周期绑定可以解决挺多bug的,玩过哔哩哔哩的应该会遇到他们的一个bug,就是进入一个视频播放页,然后还没加载完成就息屏,他这个时候异步回调回来视频数据了就会在息屏或锁屏界面播出音频来,这是典型的生命周期bug,我遇到过几次了,如果加入这个绑定轻松就能解决问题啦。

android四大基础组件--Service生命周期详解

android四大基础组件--ServiceService

生命周期详解


1、Service的生命周期:


I> 在非绑定Service情况下,只有oncreate(),onStartCommand(),onDestory()方法情况下:

    

  操作方法对应生命周期一:

   a、【执行startService(Intent)

   执行生命周期方法:oncreate()--->onStartCommand();

   b、【执行stopService(Intent)】 

   执行生命周期方法:onDestory();


  操作方法对应生命周期二: 

   a、【执行startService(Intnet)

   执行生命周期方法:oncreate()--->onStartCommand();

   b、【执行返回键】--->【执行startService(Intnet)

   执行生命周期方法:onStartCommand();

   c、【执行stopService(Intent)

   执行生命周期方法:onDestory();

   d、【执行startService(Intnet)

   执行生命周期方法:oncreate()--->onStartCommand();

   e、【执行stopService(Intent)】--->【执行返回键】--->【执行startService(Intnet)】    执行生命周期方法:oncreate()--->onStartCommand()

 

  总结:

  只有当service被首次创建的时候才会执行oncreate()方法,同个service被多次启动的时候就不会调用oncreate()方法,但是每次的启动都会调用onstartCommand()方法;


II> 在绑定Service情况下,只有onCreate(),onBind(Intent intent),onUnbind(Intent intent),onDestroy()方法情况下:


  操作方法对应生命周期:

  a、【执行bindService(intent,conn, Service.BIND_AUTO_CREATE)

  执行生命周期方法:oncreate()--->onBind()---> ServiceConnection类的onServiceConnected()(作用:activity与service建立连接的方法);

  b、【执行unbindService(conn)

  执行生命周期方法:onUnbind()--->onDestory();


技术分享

技术分享

技术分享



III>绑定service和非绑定service混合使用执行的生命周期


  操作方法:

  a、【执行startService

  执行生命周期方法:onCreate()-->onStartCommand();

  b、【执行bindService

  执行生命周期方法:onBind()--->onServiceConnected();

  c、【执行onUnbindService

  执行生命周期方法:onUnbind();

  d、【执行bindService

  执行生命周期方法:onServiceConnected()-->onRebind();

  e、【执行onUnbindService

  执行生命周期方法:onUnbind;

  f、【执行stopService

  执行生命周期方法:onDestory()


技术分享


调用Service如下:


技术分享

执行的打印结果如下:

技术分享


总结:

1、当service执行startService操作以后,执行bindService,在service被绑定以后没有解绑的情况下,去执行stopService,此时不会触发Service的onDestory方法,但是解除绑定以后,继续执行stopService将触发onDestory方法。

2、ServiceConnection类中,如果service意外的发生中断,则此类中的onServiceDisconnected方法将会被调用执行;正常的中断(如:执行unbindService方法),则此类中的onServiceDisconnected方法不会被调用。

3、如果一个Service使用两种模式开启(bindService和startService),则必须保证两个生命周期都结束,才能执行onDestory方法。例如:bindxx--》startxx--》stopxx 或者 startxx--》bindxx--》stopxx,以上两种情况均不会执行onDestory()方法。

4、service与activity使用bindService进行绑定,并不能将service 的生命周期与activity的生命周期绑定。在部分情况下,取消绑定的时候也仅仅是取消service与activity之间的关系,并不能停止该service。

5、service中并不能够执行耗时操作,因为service与所在的应用位于同一个进程,并且service也并不是一条新的线程,如果执行耗时操作,将会出现ANR(Application Not Responding)异常。



2、IntentService执行原理


a>使用队列来管理Intent请求,每当客户端代码通过Intent请求启动IntentService时,IntentService将会把Intent加入队列,然后开启一条新的线程来处理该Intent;


b>对于异步 的startService()请求,IntentService会按次序一次处理队列中的Intent,该线程保证同一时刻只处理一个Intent;


c>IntentService会创建单独的线程来处理onHandleIntent()方法实现的代码,因此开发者无需处理多线程的问题;


d>当消息请求处理完以后IntentService会自动停止,开发者无需调用stopSelf()方法停止service;


e>为Service的onBind()方法提供了默认的实现,默认实现的onBind()返回null;


f>为Service的onstartCommand()方法也提供了默认的实现,该实现会将请求Intent添加到队列中。


3、Service和IntentServiceActivity的最主要区别

IntentService里面能够执行耗时操作,而不会造成UI线程阻塞。



总结:

   上述文章通过在android studio中的运行,完整的展现了Service常用生命周期方法的执行过程,通过了解以上的过程能够方便我们程序的开发,在适当的生命周期,执行对应的方法,这样有助于程序的优化、方便后期的维护和减少内存不必要的浪费,更有助于我们对android底层学习。同时也对Service和IntentService进行了比较,以及IntentService的执行原理。不足之处,请大家不惜赐教。



本文出自 “In the eyes of the sun” 博客,请务必保留此出处http://wang963825.blog.51cto.com/8695943/1869281

以上是关于Android生命周期绑定的主要内容,如果未能解决你的问题,请参考以下文章

android四大基础组件--Service生命周期详解

四大组件之Service生命周期

Vue生命周期与单向、单次、双向绑定

Android 生命周期

Maven命令列出生命周期阶段以及绑定目标?

Android 的生命周期