Service的种类
按照进程分类
本地服务
- 主进程上运行
- 主进程结束时,服务也结束
远程服务
- 独立进程
- 主进程结束时,服务不受影响
- 使用aidl作为通信方式
按运行类型分类
前台服务
在通知栏会常驻,随着服务的结束,通知栏也会消失
后台服务
用户看不到效果,通常作为同步的服务
启动方式分类
- startService 启动的服务
主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService - bindService 启动的服务
通过binder通信,停止服务使用unbindService - startService 同时也 bindService 启动的服
停止服务应同时使用stepService与unbindService
Service 与 Thread 的区别
1.Thread独立于Activity,不随着Activity的结束而终止,service会随着Activity的结束而终止。
2.在某一Activity中创建Thread后,不能在别的Activity对其进行控制,而service可以通过 binder,aidl,boardcast等进行通信。
生命周期
- onCraet
不管startService几次,系统只会创建Service的时候调用一次。 - onStart
startService的时候调用 - onDestroy
当服务被停止时的时候被调用。
当在旋转手机屏幕的时候,因此旋转之前的使用 bindService 建立的连接便会断开
调用startService后调用stopService,这时服务中的onDestory会执行,同样,调用binderService后,调用unbinderService,服务中的onDestory会执行。同时调用startService和binderService,必须同时调用stopService和unbinderService,onDestory才会执行
intentService
在android中,service的代码默认都是运行在主线程中的,如果直接运行一些耗时的程序容易出现ANR。
通常需要在service中开启一个子线程。
public class MyService extends Service{
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
//具体任务
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
}
但是这样的服务一旦启动之后,就会一直处于运行状态,必须调用stopService或者stpSelf才能使任务停下来,
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
//具体任务
stopSelf();
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
有时候会忘记stopSelf或者开子线程,android提供了一个IntentService类
public class MyService extends IntentService{
public MyService(String name) {
super("MyService");
}
@Override
protected void onHandleIntent(Intent intent) {
//处理任务,自动开子线程
}
}
首先提供一个无参的构造函数,并必须在其内部调用父类的有参的构造函数,。
参考 http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html
《第一行代码》