后台服务知识性干货
文章目录
目录
前言
一些个人对后台服务的小总结,主要简单介绍后台服务并进行一些实现方法的讲解
一、简介
Service是应用的后台服务,它用来执行不需与用户交互的、耗时的操作,或者给其他应用提供一些功能。Service默认运行在用户界面(Activity)所在的主线程中,所以它的执行速度越快越好。如果有耗时较长或者会阻塞的操作,可以在Service中创建一个线程去完成它。若Service的执行时间超过5秒,系统会抛出“应用程序无响应(ANR)”的对话框。
二、注册Service
所有Service都应该在所在应用的AndroidManifest.xml中注册相应的标签,否则将无法被Activity连接(包括start和bind)。
<manifest ... >
...
<application ... >
<service
<!-- 设置本服务的类名 -->
android:name=".TestService"
<!-- 设置本服务作为一个单独的进程。省略这行代码的话,它将运行于主线程中 -->
android:process=":任意名称"
<!-- 是否接收其他应用的启动请求 -->
android:exported="false"
/>
...
</application>
</manifest>
三、连接Service
Service可以同时被多个Activity经调用startService()或bindService()来连接,每次它都会以onStartCommand()或onBind()来响应,但其onCreate()只会在Service对象首次创建时调用。如果不想提供绑定,可以让onBind()返回null。
四、断开Service
绑定上的Activity可以调用unbindService()来解除绑定。当所有Activity都解绑后,系统就会调用服务的onUnbind()方法(若无其他Activity启动服务,则服务会被销毁)。启动服务的Activity可以调用stopService()来停止服务,服务也可以自己调用stopSelf()来停止,但这两种方法的前提是服务未被绑定。停止时,系统会调用onDestory()来销毁服务。
五、 线程安全
Android提供了一个线程安全的、继承自Service的IntentService类,继承它之后只需实现其onHandleIntent方法则可,该方法负责具体的工作任务。IntentService仅支持startService(),而不支持bindService()。每当有Activity连接上来时,它都会创建一个工作线程加入到由它管理的工作队列中。工作线程们依次调用onHandleIntent(),执行完毕后才轮到下一个。当所有的工作线程都干完活时,IntentService对象会自动销毁,以节省资源。
public class TestIntentService extends IntentService
{
public IntentService()
{
super("随便");
}
protected void onHandleIntent(Intent intent)
{
/**
* 工作线程们依次进来干活,执行完毕后才轮到下一个。
* 任务相关信息会经由startService(intent)的参数传进来。
*/
}
}