android学习(2)service的使用以及个人理解
众所周知,android有四大组件,service,activity,Content provider和BroadCast Recevicer。
activity应该是最先接触到,也是接触的最多的一个组件了。说起来,我到现在还没有用过广播,其他三个或多或少接触了一下。
今天重点讲一下service,这一块看了之后个人感觉很简单,就是一些概念理解了就很好了。
贴一下关于service官方文档的地址:https://developer.android.google.cn/guide/components/services
service为后台服务,一开始看到这个的时候,我以为是跟thread差不多的东西,实际上这两个完全一样。service其实还是在主线程里的,如果在service中加了耗时操作,还是会引起anr的。他这个正确理解应该是应用在后台时调用的操作,因为此时ui无需渲染。
在service中可以创建thread来执行耗时任务,那既然如此为什么不直接在activity创建一个thread呢,就省的去创建service了。的确有些场景是可以这么做的,但是,如果你的应用在后台,开了一个thread在执行,然后被系统杀死了。任务进行到一半就没了,但是service相比于thread和activity更不容易被系统杀死,大多数情况下,service还是存在的。当然如果是希望thread和activity共存亡的情况下,还是不需要要新建一个service的。
然后android还有一种特殊的thread,叫做handlerThread,这个东西继承自Thread,加了looper。对于android来说用起来是比thread好用的。
官方文档在讲service的时候推荐了IntentService,这个东西比较神奇。相当于上面说的handlerThread+service,也就是说你无需在service中添加thread了。他跟service相比有了工作队列的概念,比如你启动了四次intentservice,他就会按照顺序,一个执行完执行下一个,然后执行完毕之后自动退出。且后执行的任务有可能会收到前面执行的任务的影响。如下图
如果你过分一点,开启四个然后马上点击关闭服务,他会把当前的任务做完,然后关闭服务。如下图
这里i am killed是在ondestory中打印的。这个任务其实是耗时五秒打印一下,然后结束。也就是是说他虽然会先执行onDestory,但是正在执行的任务还是会执行完。知道了这个机制的话,就要注意不要在这里搞个死循环就好了。
然后就是和activity之间的交互了,IntentService启动需要用intent来,所以activity传递数据就直接放在Intent里就好了。那么IntentService怎么通知activity呢,这方面和service相同。我粗略的找了一下有三种,自身的binder机制,广播,eventbus。着实懒得写这个了,感兴趣的可以自己看下我的代码。
然后这边看下代码。
IntentService怎么说都算是service,所以需要startService和StopService。
Intent intent = new Intent(this,StudyIntentService.class); //启动服务 this.startService(intent); //停止服务 this.stopService(intent);
其中intent可以夹带数据。
IntentService比较简单就直接把代码贴上。
public class StudyIntentService extends IntentService { int i = 0; /** * @deprecated */ public StudyIntentService() { super("name"); Log.i("Tag","name:"); } @Override protected void onHandleIntent(@Nullable Intent intent) {try { i++; Log.i("Tag","onHandleIntent"+i); Thread.sleep(5000); Log.i("Tag","onHandleIntent5000"); } catch (InterruptedException e) { // Restore interrupt status. Thread.currentThread().interrupt(); } } @Override public void onDestroy() { super.onDestroy(); Log.i("Tag","i am killed!"); } }
这里定义了一个全局变量i,用以证明多次启动IntentService启动的是同一个service。然后在onHandleIntent中有个参数intent,这里可以解析从activity传过来的数据,然后进行处理。
然后一些生命周期可以自行翻文档去熟悉,也没别的好说的。
贴一下项目地址:https://github.com/libo1223/androidStudy,没看明白的可以直接看代码。应该比较好懂