Android Service 服务及生命周期

来源:互联网 发布:将表格相同数据求和 编辑:程序博客网 时间:2024/05/17 08:05

果然前两天动力爆棚啊,接下来了解下Service


什么是Service?


Service 是运行不可见的,服务于后台的服务。Service类被设计成长生命周期操作的,用来执行一些持续性的,可能耗时的操作。

Service 和Activity一样都是运行在主线程的,所以耗时的操作放到新开线程或者AsyncTask里。

Service 的优先级

android 赋予Service比处于非活动状态的Activity更高的优先级。(对Activity活动状态不了解的 http://blog.csdn.net/zqingyang521/article/details/40504389)

因此当系统请求资源时,Service被终止的可能性更小。如果过早的终止了一个Service,只要有足够资源可用,可以通过配置来自动重启Service。

如果Service需要与用户进行互动(如播放音乐),那么有必要把这个Service标识为前台控件,从而提高它的优先级。这样就保证了除极端情况下,该Service不会被终止,但是

这样会降低运行时管理资源的能力,从而可能降低整体的用户体验。

创建和控制Service


创建Service

创建一个新的Service必须实现onCreate()和onBind()方法。

package com.example.activitytest;import android.app.Service;import android.content.Intent;import android.os.IBinder;public class MyService extends Service {@Overridepublic void onCreate() {super.onCreate();}@Overridepublic IBinder onBind(Intent intent) {return null;}}

当创建完Service之后,必须在AndroidManifest.xml中注册。在application节点中添加

<service   android:name=".MyService"   android:enabled="true" ></service>


控制Service

当一个Service启动时,就会调用onStartCommand方法,所以这个方法可能在Service生命周期内被调用多次,重写onStartCommand()方法可以控制Service的重启行为。

标准的Service模式是从onStartCommand方法中创建运行一个新线程,用来在后台执行耗时操作,并在该线程完成后终止这个Service。

@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO 新开线程处理耗时操作return Service.START_STICKY;}

看见return Service.START_STICKY;了吗  我们可以根据返回不同值来控制Service启动。

START_STICKY

标准的重启行为,如果Service进程运行时被kill了,不保留递送的Intent对象。随后系统会尝试重新创建Service,创建Service后一定会调用onStartCommand方法,传入的Intent为null。总而言之就是你杀死我,我就会尝试去重启,每次重启自己的时候都会忘了上一次我干过什么。

START_NOT_STICKY

这种模式用于启动特殊的操作和命令的Service,如果Service在运行完onStartCommand方法后被kill了,系统不会自动重启该Service,知道startService()方法再次被调用。总而言之就是你杀死我,我就是懒,你不主动启动我,我也不自动重启。

START_REDELIVER_INTENT

在一些情况下,需要确保从Service中请求的命令得以完成(例如时效性比较重要的时候),这种模式是上面两种模式的结合体,如果存在未处理的启动调用或者进程在调用stopSelt之前被终止时,才会重新启动Service。重启调用onStartCommand方法,并传入没有正常完成处理的Intent。

总而言之就是老子要完成的任务你们是打断不了我的,你杀死我我也会重启把任务处理完,处理完我就不在重启了。

START_STICKY_COMPATIBILITY:

START_STICKY的兼容版本,但不保证服务被kill后一定能重启。总而言之就是老子死了也不知道能不能在启来。


处理完成后,每种模式都要求使用stopServicehe和StopSelf方法显示的停止Service。

启动和停止Service


启动Service有两种方式startService()和bindService()。

startService()实现

Intent intent = new Intent(this,MyService.class);startService(intent);

bindService()实现

private MyService myService;// 与activity链接的Serviceprivate ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {myService = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// 当建立链接时候调用myService = ((myService.MyBinder) service).getService();//TODO 调用服务的某些方法myService.method();}};//连接绑定的Servicepublic void conService(){Intent bindIntent = new Intent(this,MyService.class);bindService(bindIntent, connection, Context.BIND_AUTO_CREATE);}

在连接的时候第三个参数是个标识。它表明的绑定的操作。android 4.0(api level 14)中引入了许多标志。

BIND_AUTO_CREATE

一般都为这个,制定这个标识,绑定service时候不存在时就会创建一个。这个不是4.0后引进的

BIND_ADJUST_WITH_ACTIVITY

系统根据Service所绑定的Activity的相对重要程度来调整这个Service的优先级,因此,当Activity处于前台是,系统会提高Service的优先级。

BIND_IMPORTANT和BIND_ABOVE_CLIENT 

相对于绑定的Activity,Service很重要。当Activity处于前台时,Service也应该变为前台进程。BIND_ABOVE_CLIENT 指定在内存很低的情况下,运行时会终止Service之前先终止Activity。

BIND_NOT_FOREGROUND

确保绑定的Service永远不会拥有绑定的Activity的优先级。默认情况下,绑定一个Service会提高它的相对优先级。

BIND_WAIVE_PRIORITY

表示绑定一个指定的Service不应该改变该Service的优先级。

Service 的生命周期


startService()的生命周期onCreate()>onStart()>Service running>调用context.stopService() >onDestroy()  

bindService()的生命周onCreate()>onBind()>Service running>调用context.unbindService()>onUnbind() >onDestroy() 


参考书:Android 4 高级编程第三版


0 0
原创粉丝点击