最近仔细的看了看IntentService 和Service的区别,这里主要说一下IntentService 。
1.Service 不用多说 大家都经常用的 但是IntentService可能不是经常用到,但是在特定的情况下IntentService用起来要比Service方便不少。
1.1例如,我们的程序里边有俩个耗时的操作,第一个耗时操作命名为first ,第二个耗时操作命名为second,执行逻辑是first执行完毕以后second才能执行,这个时候用IntentService就特别方便了。可能只这样说大家不太明白,上代码加解释大家就会很容易看懂。
package com.example.zxy.android60test.service;
import android.app.IntentService;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
/**
* Created by ZhangXueYang on 2016-8-29.
* IntentService 1.启动以后 完成执行的任务 服务自动关闭,2.多任务的时候 会形成任务队列 会按顺序逐个去执行
*/
public class ServiceIntentDemo extends IntentService {
/**
* 必须实现方法的重构 而且不能有参数 否则Manifest 注册时会找不到该类
*/
public ServiceIntentDemo() {
super("test");
Log.e("181", "test");
}
@Override
protected void onHandleIntent(Intent intent) {//IntentSerivce核心回调方法 主要的代码逻辑都在这里
//Intent是从Activity发过来的,携带识别参数,根据参数不同执行不同的任务
String msg = intent.getStringExtra("msg");
if (msg.equals("first")) {
Log.e("181", "执行第 一 个任务");
} else if (msg.equals("second")) {
Log.e("181", "执行第 二 个任务");
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onStart(Intent intent, int startId) {
Log.e("181", "启动服务1");
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("181", "启动服务2");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
super.onCreate();
Log.e("181", "创建服务");
}
@Override
public IBinder onBind(Intent intent) {
return super.onBind(intent);
}
@Override
public void onDestroy() {//当所有线程执行完毕,IntentService会自动关闭,不用我们子调取一次销毁方法,是不是很方便啊!
Log.e("181", "销毁服务");
super.onDestroy();
}
}
package com.example.zxy.android60test;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
/**
* Created by ZhangXueYang on 2016-8-11.
*/
public class AAAA extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//可以启动多次,每启动一次,就会新建一个work thread,但IntentService的实例始终只有一个
//启动第一个耗时服务
Intent intentf = new Intent("com.test.intentservice");
intentf.putExtra("msg", "first");
startService(intentf);
//启动第二个耗时服务
Intent intents = new Intent("com.test.intentservice");
intents.putExtra("msg", "second");
startService(intents);
}
}最后别忘了在Manifest注册IntentionService
下面是运行截图,由截图可以看出虽然我们调用了俩次startService 但是IntentService 只创建了一个实例,而且执行完毕work队列以后自动销毁了IntentService.