一如既往,从官方解释开始:Service 是 Android 应用中的组件,其使用场景如下:
A Service is an application component representing either an application’s desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use.
可能很多人看到这里会感觉 Service 很像进程/线程,但实际上 Service 既不是进程也不是线程。因为:
让 Service 成为远程服务则会另开一个进程,一般用作提供系统服务,而且实现会比较麻烦,因为需要用 AIDL 通过 IPC 进行通信。
注:但 Service 的子类 IntentService 则另开了一个 worker 线程完成相应的任务,IntentService 内部有一个消息队列和消息管理器。所以对于异步的 Service 请求,IntentService 能够通过消息队列按序处理请求,并且每一个请求都在非主线程 - worker 线程中被处理,不会对主线程造成影响。
Service 能够与系统进行通信。Service 通过 Context.startService() 方法告知系统 Service 想要在后台执行的任务(即便这个任务不是由用户产生),而后系统将执行该任务,直到该 Service 被停止(可能是通过代码完成,也可能是直接关闭了应用的进程,或者其他……)
Service 能够为其他应用提供功能。应用通过 Context.bindService() 与 Service 建立长期连接,进行交互,让 Service 的功能模块帮助自己完成某些任务
首先看看官方的图吧:
Service 有两种启动方法:startService() 方法和 bindService() 方法,虽然具体实现不太相似,但启动-关闭过程是一样的。值得注意的是,无论你调用 startService() 方法多少次,只要调用 Context.stopService() 方法或 stopSelf() 方法,Service 就会被终止。那 Service 中的任务还没执行就被终止了咋办?莫慌,Service 的 stopSelf() 方法可以让 Service 被处理之后才被终止。
还有一点就是,onCreate() 方法并不是一定会执行,如果 Service 已经存在,就不会执行 onCreate() 方法创建 Service,而是直接执行 Service 的 onStartCommand() 方法,启动 Service 执行相关任务。
下面是一个最最最简单的范例:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.startService(new Intent(this, MyService.class));
}
}
public class MyService extends Service{
private static final String TAG = "MyService";
IBinder mBinder;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Log.i(TAG, "onCreate");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.i(TAG, "onDestroy");
super.onDestroy();
}
}
Service 有时候会被系统杀掉(可能是因为内存不够、也可能是被各种手机卫士杀了),而 Service 可能跟某些功能相关,杀掉之后功能就不能用了。那么我们要咋办呢?
提高 Service 的优先级:可以在 AndroidManifest.xml 中对通过 android:priority = “1000” 属性将 Service 的优先级设置为最高;当然了,将 Service 通过 setForeground() 方法设置为前台任务也可以提高优先级
使用 AIDL 进行跨进程通信,通过另一个进程的 BroadcastReceiver 发送广播,保证你的 Service 始终存在(杀死则通过广播重启)
在 Service 的 onDestroy() 方法内重启 Service
原文地址:http://blog.csdn.net/u012403246/article/details/45868187