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

  • 相关阅读:
    [SSRS] Use Enum values in filter expressions Dynamics 365 Finance and Operation
    Power shell deploy all SSRS report d365 FO
    display method in Dynamics 365 FO
    How To Debug Dynamics 365 Finance and Operation
    Computed columns and virtual fields in data entities Dynamics 365
    Azure DevOps for Power Platform Build Pipeline
    Create readonly entities that expose financial dimensions Dynamics 365
    Dataentity call stack dynamics 365
    Dynamics 365 FO extension
    Use singletenant servertoserver authentication PowerApps
  • 原文地址:https://www.cnblogs.com/afei123/p/13786948.html
Copyright © 2011-2022 走看看