应用实例一中介绍过service服务不会主动创建线程,默认是运行在主线程中的,所以如果在service中处理一些耗时的应用则会出现ANR(application not responding)的情况,所以往往需要在服务的onStartCommand方法中手动创建子线程来处理具体逻辑
但是常常程序员会忘记创建开启线程或者忘记停止服务(stopself()),为了简单的创建异步的、会自动停止的服务,android专门提供了一个IntentService类,该类已帮我们封装了开启线程以及停止服务的方法,具体实例如下:
一.创建mainactivity:
public class MainActivity extends Activity {
Button startButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startButton = (Button)findViewById(R.id.StartService);
startButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this, MyIntentService.class);
startService(intent);
//打印主线程的id,用来对比判断MyIntentService服务中的逻辑是否运行在不同的线程中
Log.d("MainActivity", "Thread id is "+ Thread.currentThread().getId());
}
});
}
}
二.创建MyIntentService:
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
//打印当前线程的id,对比下主线程id,看是否一致
Log.d("MyIntentService", "Thread id is "+ Thread.currentThread().getId());
}
public void onDestroy(){
super.onDestroy();
//打印线程停止的log,若有log,则可判断当前服务在运行完成后会自动停止服务
Log.d("MyIntentService", "onDestroy executed");
}
}
三.在manifest中进行注释:
<service
android:name=".MyIntentService"
android:enabled="true"
android:exported="true" >
</service>
运行后的代码如下:
点击start IntentService 按钮,即可出现以下log:
从log中可判断onHandleIntent方法是运行在子线程中的,且在服务执行完毕后会自动运行onDestroy方法来停止服务