1.2、Service与AIDL
Service是Android中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。但不要被"后台"二字所迷惑,Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作。
Service的运行不依赖于任何用户界面,即使程序被切换到后台或者用户打开了另外一个应用程序,Service仍然能够保持正常运行,这也正是Service的使用场景。当某个应用程序进程被杀掉时,所有依赖于该进程的Service也会停止运行。
1.2.1 普通Service
Service的生命周期相对Activity来说简单得多,只有3个,分别为onCreate、onStartCommand和onDestory。一旦在项目的任何位置调用了Context 的startService()函数,相应的服务就会启动起来,首次创建时会调用onCreate函数,然后回调onStartCommand()函数。服务启动了之后会一直保持运行状态,直到stopService()或stopSelf()函数被调用。虽然每调用一次startService()函数,onStartCommand()就会执行一次,但实际上每个服务都只会存在一个实例。所以不管你调用了多少次startService()函数,只需调用一个stopService()或stopSelf()函数,服务就会被停止。
通常的Service大致如下:
public class MyService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { doMyJob(intent); return super.onStartCommand(intent, flags, startId); } private void doMyJob(Intent intent){ // 从Intent中获取数据 // 执行相关操作 new Thread(){ @Override public void run() { // 耗时操作 } }.start(); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } |
与Activity一样,Service也需要在AndroidManifest.xml中进行注册,示例如下:
<service android:name=".service.MyService" />
上述示例表示注册一个在应用包service目录下的MyService服务,注册之后,当用户调用startService(new Intent(mContext,MyService.class)) 时会调用onStartCommand函数,我们在该函数中调用doMyJob,而在doMyJob中我们创建了一个线程来执行耗时操作,以避免阻塞UI线程。当我们的Service完成使命时,需要调用stopService来停止该服务。
1.2.2 IntentService
完成一个简单的后台任务需要这么麻烦,Android显然早就"洞察"了这一点。因此,提供了一个IntentService来完成这样的操作,IntentService将用户的请求执行在一个子线程中,用户只需要覆写onHandleIntent函数,并且在该函数中完成自己的耗时操作即可。需要注意的是,在任务执行完毕之后IntentService会调用stopSelf自我销毁,因此,它适用于完成一些短期的耗时任务。示例如下:
public class MyIntentService extends IntentService {
MyIntentService(){
super(MyIntentService.class.getName());
}
@Override
protected void onHandleIntent(Intent intent) {
// 这里执行耗时操作
}
}
本文选自《Android开发进阶—从小工到专家》第一章,本站经人民邮电出版社和作者的授权。
版权声明:51Testing软件测试网获人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。