startService和bindService混合使用分析
2015-11-05 23:20
337 查看
转载自:http://m.blog.csdn.net/blog/ben0612/45192145#
startService、bindService相信很多人都用过,但一般都只是用其中一种,很少有人会混起来使用。
最近在开发项目时,遇到这样的需求:在activity中要得到service对象进而能调用对象的方法,但同时又不希望activity finish的时候service也被destory了。
startService和bindService混合使用就派上用场了。
首先我们先分析下startService以及bindService后,service的生命周期:
startService()以后,会执行onCreate()--->onStartCommand()这两个生命周期方法,重复调用startService的话,onStartCommand()也会重复执行。
stopService()以后,就会执行onDestory()方法。
大致的生命周期是:onCreate()--->onStartCommand()--->onDestory();
bindService()以后,会执行onCreate()--->onBind()这两个生命周期方法,重复调用bindService(),onCreate(),onBind()这两个方法不会再执行。
unbindService()以后,就会执行onUnbind()-->onDestory()方法。
大致的生命周期是:onCreate()--->onBind()--->onUnbind()-->onDestory();
那么startService以及bindService混合使用,Service的生命周期会怎么样呢????
在activity onCreate()中调用startService():
如果在activity onCreate()调用bindService(),onStart()方法调用startService(),会出现什么情况呢?看log打印日志
看起来只是onStartCommand以及onBind的执行顺序换了一个位置而已。
估计有人会纳闷,这样调用了startService又调用了bindService,他们对应的是同一个service对象吗?
1.我们先假设不是同一个service对象,那么在startService时,应该会执行onCreate()--->onStartCommand(),而在bindService时,应该会执行onCreate()--->onBind(),
onCreate()应该会执行两遍才对,但是看日志onCreate()只执行了一遍。
2.我们再用一个方法来判断是否是同一个service对象,在执行service onStartCommands时把service.this加入到ArrayList中;在执行onBind时,把service.this加入到ArrayList,然后判断两个对象是否是同一个。
打印的结果是:
综合1和2得到的结果是,混合启动方式对应的是同一个对象。
以上是关于启动的,下面来讨论下退出:
要实现这样的需求:在activity中要得到service对象调用对象的方法,但同时又不希望activity finish的时候service也被destory了。
那么在onPause方法中,执行unbindService()即可,只有onUnbind方法会执行,onDestory不会执行(Service依然存在,可通过isDestory方法判断),因为还有一个startService的启动方式存在。
如果要完全退出Service,那么就得执行unbindService()以及stopService(或者stopSelf)。
也许有人会问,那如果先执行stopService,会出现什么情况呢?
答案是:Service依然存在,可通过isDestory方法判断,因为还有一个bindService的启动方式存在。
无论是先startService后bindService,或者先bindService后startService,得到的结果跟上述的一样。
这种实现方法的原理就是:只要还有一种启动方法存在,Service就会继续存活。
以上有不对的地方请各位指正,多谢。
startService、bindService相信很多人都用过,但一般都只是用其中一种,很少有人会混起来使用。
最近在开发项目时,遇到这样的需求:在activity中要得到service对象进而能调用对象的方法,但同时又不希望activity finish的时候service也被destory了。
startService和bindService混合使用就派上用场了。
首先我们先分析下startService以及bindService后,service的生命周期:
startService()以后,会执行onCreate()--->onStartCommand()这两个生命周期方法,重复调用startService的话,onStartCommand()也会重复执行。
stopService()以后,就会执行onDestory()方法。
大致的生命周期是:onCreate()--->onStartCommand()--->onDestory();
bindService()以后,会执行onCreate()--->onBind()这两个生命周期方法,重复调用bindService(),onCreate(),onBind()这两个方法不会再执行。
unbindService()以后,就会执行onUnbind()-->onDestory()方法。
大致的生命周期是:onCreate()--->onBind()--->onUnbind()-->onDestory();
那么startService以及bindService混合使用,Service的生命周期会怎么样呢????
在activity onCreate()中调用startService():
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startService(new Intent(this, TestService.class)); }在activity onStart()中调用bindService():
@Override protected void onStart() { super.onStart(); bindService(new Intent(this, TestService.class), mServiceConnection, Context.BIND_AUTO_CREATE); }以下是log打印的日志,可以看出Service生命周期:
如果在activity onCreate()调用bindService(),onStart()方法调用startService(),会出现什么情况呢?看log打印日志
看起来只是onStartCommand以及onBind的执行顺序换了一个位置而已。
估计有人会纳闷,这样调用了startService又调用了bindService,他们对应的是同一个service对象吗?
1.我们先假设不是同一个service对象,那么在startService时,应该会执行onCreate()--->onStartCommand(),而在bindService时,应该会执行onCreate()--->onBind(),
onCreate()应该会执行两遍才对,但是看日志onCreate()只执行了一遍。
2.我们再用一个方法来判断是否是同一个service对象,在执行service onStartCommands时把service.this加入到ArrayList中;在执行onBind时,把service.this加入到ArrayList,然后判断两个对象是否是同一个。
@Override public void onCreate() { super.onCreate(); Log.i(CPMainActivity.TAG, "TestService onCreate"); servicesList.add(this); }
@Override public IBinder onBind(Intent arg0) { servicesList.add(this); if(servicesList.get(0)==servicesList.get(1)){ Log.i(CPMainActivity.TAG, "同一个对象"); }else{ Log.i(CPMainActivity.TAG, "不同一个对象"); } return testBinder; }
打印的结果是:
综合1和2得到的结果是,混合启动方式对应的是同一个对象。
以上是关于启动的,下面来讨论下退出:
要实现这样的需求:在activity中要得到service对象调用对象的方法,但同时又不希望activity finish的时候service也被destory了。
那么在onPause方法中,执行unbindService()即可,只有onUnbind方法会执行,onDestory不会执行(Service依然存在,可通过isDestory方法判断),因为还有一个startService的启动方式存在。
如果要完全退出Service,那么就得执行unbindService()以及stopService(或者stopSelf)。
也许有人会问,那如果先执行stopService,会出现什么情况呢?
答案是:Service依然存在,可通过isDestory方法判断,因为还有一个bindService的启动方式存在。
无论是先startService后bindService,或者先bindService后startService,得到的结果跟上述的一样。
这种实现方法的原理就是:只要还有一种启动方法存在,Service就会继续存活。
以上有不对的地方请各位指正,多谢。
相关文章推荐
- json学习笔记_01_json语法基本格式并s会用java读取json
- i2c--2.6.34文档:如何枚举产生i2c_client
- j2ee web.xml 中url-pattern匹配
- Caused by: java.io.EOFException: Can not read response from server.
- mysql 学习记录(二十三)--mysql安装时相关优化
- opencv3 寻找亚像素角点-cornerSubPix函数-滚动条
- Linux下创建桌面快捷方式
- 【笔记】程序员的思维修炼4
- spring hadoop系列一
- Ubuntu环境下sublime3 nodejs安装与插件配置
- NSPredicate 谓词
- java进阶-创建和销毁对象
- 初学java的一些小结
- opencv3 寻找亚像素角点-cornerSubPix函数
- Java 总结教程
- NOIP2015
- 【笔记】程序员的思维修炼5
- 正则 js截取时间
- 黑马程序员——集合类(一)
- Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure