Service是Android中的四大组件之一,它是在后台运行的,被用来处理比较耗时或长时间运行的操作。现在我们有一个需求:下载一个大的文件。根据Service的特性,我们很容易想到用开启一个Service来进行下载。Service有两种启动方式,startService和bindService,那么问题来了,我们用哪种方式启动呢?方案1:用一个程序组件startService,用该方法启动Service后,Service会一直在后台运行,即使该组件被终止,Service仍然继续运行,但是当文件下载完成,我们不希望Service继续运行,比较消耗资源。方案2:用一个程序组件bindService,用该方法绑定一个Service,如果该组件被终止,Service也会停止运行,我们不希望用户点击完下载就不能进行其他操作。那么该怎么办呢?接下来就是IntentService表现的时候了。IntentService是Service的一个子类,他本质上就是一个Service,它的特点是在完成操作后会自动的停止,并且它会自动开启一个线程。使用的时候我们编写一个类继承IntentService,同时,我们需要在清单文件中注册,如同Service。
public class MyIntentService extends IntentService {
public MyIntentService() {
this("MyThread");
}
// IntentService会自动建立一个子线程,并在其中执行,name为子线程的名称
public MyIntentService(String name) {
super(name);
// TODO Auto-generated constructor stub
}
// 要做的操作写在这个方法中,方法执行结束执行onDestory(),可以通过Intent来接受传递过来的数据
@Override
protected void onHandleIntent(Intent intent) {
String extra = intent.getStringExtra("url");
System.out.println(extra);
// 模拟耗时操作,注意不用开启子线程
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("ThreadName:" + Thread.currentThread().getName());
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("onDestory");
}
}
这样一个IntentService就完成了,接下来开始编写调用他的组件。
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), MyIntentService.class);
// 传递的数据
intent.putExtra("url", "http://www.baidu.com");
startService(intent);
}
});
}
}
我们在Activity里面添加了一个Button,点击这个Button之后开启一个IntentService,并通过Intent传递数据。可以看出IntentService使用起来还是很简单的。