服务是Android中实现程序运行后台的解决方案,特别适合不用和用户进行交互而又需要长期运行的任务。服务不依赖任何用户界面。
1.创建Servrcie
1)创建一个Service只需要继承Service类就行。需要重写onCreate()和onBind()方法。
1 public class MyService extends Service{ 2 3 @Override 4 public void onCreate(){ 5 super.onCreate(); 6 } 7 8 @Override 9 public int onStartCommand(Intent intent,int flags,int startId){ 10 return super.onStartCommand(intent,flags,startId); 11 } 12 13 @Nullable 14 @Override 15 public Ibinder onBind(Intent intent){ 16 return null; 17 } 18 }
2)新创建的Service必须要在AndroidManifest.xml中进行注册。需要在application添加service节点进行注册。
<service android:name=".MyService"/>
当一个程序是通过startService启动的,就会调用onStartCommand方法,因此这个方法可能在Service的生命周期内被执行多次。
Service是在应用程序的主线程中启动的,这就意味着在onStartCommand中处理的程序逻辑都是在主线程中执行的。
3)onStartCommand方法执行完返回的值决定着Service被终止后,系统如何响应Service的重新启动。
◊ START_STICKY 标准的重新启动模式,一般是通过显式调用startService和stopService来完成对Service的启动和停止。当重新启动时,传入
onStartCommand中的intent为null
◊ START_NOT_STICKY 通常当Service命令执行完成后,Service就会调用stopSelf()终止自己,
◊ START_REDELIVER_INTENT 重新启动将传入之前的intent
4)可以通过onStartCommand中的falg参数找出Service的启动方式。
◊ START_FLAG_REDELIVER 表示系统运行时在显式调用stopSelf停止Service之前Service被终止
◊ FLAG_RETRY 表示Service在被异常终止后被重新启动的
2.Service的启动和停止(还可以通过bind方式启动服务)
1)启动Service
//显式启动Service Intent intent=new Intent(this,MyService.class); startService(intent); //隐式启动Service,需要在Service节点内添加intent-filter节点,并设置action Intent intentA=new Intent(ACTION); startService(intentA);
2)停止Service
//显式停止Servcie stopService(intent); //隐式停止Servcie stopService(intentA);
startService不能够嵌套调用,因此不管startService被调用了多少次,一次stopService就会终止其所匹配的Servcie。由于Service具有较高的优先级,一
般不会被运行时终止,因此stopSelf可以明显的改善应用程序中资源占用情况,Service完成操作和处理后,应当调用stopSelf.
3.Service和Activity进行绑定,分为以下几步。
1)在Service中新建一个扩展自Binder的类,并返回该类的一个实例,扩展类中编写供Activity调用的方法;
1 public class MyService extends Service{ 2 3 private Ibinder mIBinder= new DownloadBinder(); 4 @Override 5 public void onCreate(){ 6 super.onCreate(); 7 } 8 9 @Override 10 public int onStartCommand(Intent intent,int flags,int startId){ 11 return super.onStartCommand(intent,flags,startId); 12 } 13 @Nullable 14 @Override 15 public Ibinder onBind(Intent intent){ 16 return mIBinder; 17 } 18 19 class DownloadBinder extends Binder{ 20 //添加供Activity调用的方法 21 public void startDownload(){ 22 23 } 24 public int getProgress(){ 25 return0; 26 } 27 } 28 }
2)在Activity中新建一个ServiceConnection匿名类的实例,重写onServiceConnected和onServiceDisconnect()方法
1 private ServiceConnection connection=new ServiceConnection(){ 2 @Override 3 public void onServiceConnected(ComponentName componentName,Ibinder iBinder){ 4 mDownloadBinder=(MyService.DownloadBinder)iBinder; 5 //Activity调用Service的方法 6 mDownloadBinder.startDownload(); 7 mDownloadBinder.getProgress(); 8 } 9 10 @Override 11 public void onServiceDisconnected(ComponentName componentName){ 12 13 } 14 };
3)利用bindService完成绑定
Intent intent=new Intent(this,MyService.class); //Service和Activity进行绑定 bindService(intent,connection,BIND_AUTO_CREATE); //Service和Activity取消绑定 unbindService(connection);
4.Service的生命周期
如果在项目中调用Context.startService(),相应服务就会启动起来,若服务已创建,就回调onStartCommand()方法,若还未创建则onCreate()先执
行。服务启动后会一直运行,直到stopSelf和stopService被调用。通过在项目中调用Context.bindService(),来获取一个服务的持久连接,此时回调服务中
onBind方法。当项目中调用bindService有绑定到服务的客户端,除非调用unBindService,否则stopService和stopSelf不会真正的停止服务。服务的生命周
期如下图所示。
与 Activity 生命周期回调方法不同,你不需要调用这些回调方法的超类实现。即在override方法中不需要调用super方法。
5.前台Service
前台Service是被用户知道的,并且在系统内存不足时不允许被系统kill掉的服务。前台Service必须在状态栏提供一个通知,通知只有在前台被主动移除或者服务被终止才能被移除。
(1)启动前台服务
通过Notification通知消息的构建,在Service的onStartCommand方法中使用startForeground方法让Android服务运行在前台。
// 参数一:唯一的通知标识;参数二:通知消息。 startForeground(110, notification);// 开始前台服务
(2)停止前台服务
在Service的onDestroy中使用stopFroeground方法来停止正在运行的前台服务。
@Override public void onDestroy() { Log.d(TAG, "onDestroy()"); stopForeground(true);// 停止前台服务--参数:表示是否移除之前的通知 super.onDestroy(); }
6.IntentService的使用
为了可以简单的创建一个异步的,会自动停止的服务。Android专门提供了一个IntentService类。IntentService会将所有收到的Intent放到队列中,并
在异步后台线程中逐个的处理它们,当处理完每个Intent后,IntentService就会终止自己。