IntentService是service的子类
IntentService执行如下操作:
创建一个与应用程序主线程分开worker thread用来处理所有通过传递过来的Intent请求
创建一个work queue,一次只传递一个intent到onHandleIntent()方法中,从而不用担心多线程带来的问题
当处理完所有请求后自动停止服务,而不需要我们自己调用stopSelf()方法
默认实现了onBind()方法,返回值为null
默认实现了onStartCommand()方法,这个方法将会把我们的intent放到work queue中,然后在onHandleIntent()中执行。
public class MyServiceActivity extends Activity { protected static final String TAG = "MyServiceActivity"; private Button btnStartNormalService; private Button btnStartIntentService; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnStartNormalService=(Button)findViewById(R.id.btnStartNormalService); btnStartIntentService=(Button)findViewById(R.id.btnStartIntentService); btnStartIntentService.setOnClickListener(listener); btnStartNormalService.setOnClickListener(listener); } private OnClickListener listener=new OnClickListener() { @Override public void onClick(View v) { Intent intent; switch (v.getId()) { case R.id.btnStartNormalService: //自己写的多线程 service简括四中,有详细代码 intent=new Intent(MyServiceActivity.this, mService.class); Log.i(TAG, "主线程ID:"+Thread.currentThread().getId()); startService(intent); break; case R.id.btnStartIntentService://android中intentservice类的多线程 intent=new Intent(MyServiceActivity.this, ExampleIntentService.class); Log.i(TAG, "主线程ID:"+Thread.currentThread().getId()); startService(intent); break; default: break; } } }; }public class ExampleIntentService extends IntentService {
private static final String TAG = "ExampleIntentService"; public ExampleIntentService() { super("ExampleIntentService"); // TODO Auto-generated constructor stub } @Override protected void onHandleIntent(Intent intent) { try { Log.i(TAG,"Myservices线程Id"+Thread.currentThread().getId()); Log.i(TAG,"正在下载中..."); Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
当点击 btnStartIntentService时,会先把主线程ID等于多少打印出来,然后会在把Myservices线程Id打印出来,如果多次点击,会先把多次点击的主线程ID等于多少打印出来,然后把Myservices放到一个队列中,再一次一次的把队列中的Myservices线程Id等于多少打印出来,不知道解释清楚没有。。。直接上图
另外补充:
为什么要用多线程,从service简括一中,知道,activity和service是在同一个线程中,如果是一些耗时的操作时,在同一线程下非出现很多问题,同时客户端体验也不是很好,所以用多线程.
自己写多线程代码麻烦,所以就用IntentService
如果不要求数据同步,异步执行,就可以用IntentService ,当然如果要是数据同步的话,就要继承service,并且重写onstartCommand()方法