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") ;
}
}