2020-10-09

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传过来的数据,然后进行处理。

然后一些生命周期可以自行翻文档去熟悉,也没别的好说的。

原文转载:http://www.shaoqun.com/a/480866.html

zozotown:https://www.ikjzd.com/w/2180

trax:https://www.ikjzd.com/w/1489

巨鲸:https://www.ikjzd.com/w/1986


众所周知,android有四大组件,service,activity,Contentprovider和BroadCastRecevicer。activity应该是最先接触到,也是接触的最多的一个组件了。说起来,我到现在还没有用过广播,其他三个或多或少接触了一下。今天重点讲一下service,这一块看了之后个人感觉很简单,就是一些概念理解了就很好了。贴一下关于service官方文档的地址:https
zen cart:https://www.ikjzd.com/w/1282
特许金融分析师:https://www.ikjzd.com/w/1396
just launched卖家:https://www.ikjzd.com/w/599
店铺销量不好?你可能忽略了这个!:https://www.ikjzd.com/home/21572
亚马逊小卖、中卖、大卖、都有啥区别? :https://www.ikjzd.com/home/99272

No comments:

Post a Comment