Android后台之Service

时间:2024-03-05 15:58:15

    服务是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就会终止自己。