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

  • 相关阅读:
    HUE配置HBase
    HUE配置HIVE
    HUE配置hadoop
    HUE的安装
    CM (Cloudera Manager) 的安装,便于CDH的离线部署
    MapReduce -- 最短路径
    Mapreduce -- PageRank
    CentOS 建立本地yum源服务器
    js移动设备手机跳转地址代码
    离线存储
  • 原文地址:https://www.cnblogs.com/afei123/p/13786948.html
Copyright © 2020-2023  润新知