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,没看明白的可以直接看代码。应该比较好懂

posted @ 2020-10-09 17:24  阿飞飞啊飞  阅读(653)  评论(0编辑  收藏  举报