Service和IntentService区别

作者: 世道无情 | 来源:发表于2018-04-23 14:47 被阅读0次

    1. Service


    1>:Service服务是长期运行在后台;
    2>:它不是单独的进程,因为它和应用程序在同一个进程;
    3>:也不是单独的线程,它跟线程没有任何关系,所以不能进行耗时操作;
    4>:如果直接把耗时操作放在Service中的onStartCommand()中,可能发生ANR,如果有耗时操作,就必须开启一个单独的线程来处理;

    为了解决这样的问题,就引入了IntentService;

    2. IntentService


    1>:启动方式和Service一样,都是startService();
    2>:继承于Service,包含Service所有特性,包括生命周期,是处理异步请求的一个类,;
    3>:一般自定义一个InitializeService继承Service,然后复写onHandleIntent()方法,在这个方法中初始化这些第三方的,来执行耗时操作;
    4>:可以启动多次IntentService,每一个耗时操作以工作队列在onHandleIntent()方法中执行,执行完第一个再去执行第二个,以此类推;
    5>:所有的请求都在单线程中,不会阻塞主线程,同一个时间只处理同一个请求;
    6>:不需要像在Service中一样,手动开启线程,任务执行完成后不需要手动调用stopSelf()方法来停止服务,系统会自动关闭服务;

    3. IntentService使用


    1>:一般用于App启动时在BaseApplication中初始化一些第三方的东西,比如腾讯Bugly、腾讯X5WebView、OkhttpUtils等,目的就是为了防止BaseApplication中加载东西过多,导致App启动速度过慢,所以就自定义一个 InitializeService,继承Service,然后重写 onHandleIntent()方法,在这个方法中初始化这些第三方的;

    BaseApplication代码如下:
    public class BaseApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            //initLeakCanary();                //Square公司内存泄漏检测工具
            //在子线程中初始化
            InitializeService.start(this);
        }
    }
    
    InitializeService代码如下:
    /**
     * Email: 2185134304@qq.com
     * Created by JackChen 2018/4/12 15:35
     * Version 1.0
     * Params:
     * Description:
    */
    public class InitializeService extends IntentService {
    
        private static final String ACTION_INIT = "initApplication";
    
        public static void start(Context context) {
            Intent intent = new Intent(context, InitializeService.class);
            intent.setAction(ACTION_INIT);
            context.startService(intent);
        }
    
        public InitializeService(){
            super("InitializeService");
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
            if (intent != null) {
                final String action = intent.getAction();
                if (ACTION_INIT.equals(action)) {
                    initApplication();
                }
            }
        }
    
        private void initApplication() {
            initBugly();                                    //初始化腾讯bug管理平台
    //        BaseConfig.INSTANCE.initConfig();               //初始化配置信息
            LogUtils.logDebug = true;                       //开启日志
        }
    
        /**
         * 初始化腾讯bug管理平台
         */
        private void initBugly() {
            /* Bugly SDK初始化
            * 参数1:上下文对象
            * 参数2:APPID,平台注册时得到,注意替换成你的appId
            * 参数3:是否开启调试模式,调试模式下会输出'CrashReport'tag的日志
            * 注意:如果您之前使用过Bugly SDK,请将以下这句注释掉。
            */
            CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(getApplicationContext());
            strategy.setAppVersion(AppUtils.getAppVersionName());
            strategy.setAppPackageName(AppUtils.getAppPackageName());
            strategy.setAppReportDelay(20000);                          //Bugly会在启动20s后联网同步数据
    
            /*  第三个参数为SDK调试模式开关,调试模式的行为特性如下:
                输出详细的Bugly SDK的Log;
                每一条Crash都会被立即上报;
                自定义日志将会在Logcat中输出。
                建议在测试阶段建议设置成true,发布时设置为false。*/
    
            CrashReport.initCrashReport(getApplicationContext(), "126dde5e58", true ,strategy);
    
            Log.e("TAG" , "初始化bugly111") ;
    
        }
    }
    

    相关文章

      网友评论

        本文标题:Service和IntentService区别

        本文链接:https://www.haomeiwen.com/subject/istllftx.html