果然前两天动力爆棚啊,接下来了解下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 {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public 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。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO 新开线程处理耗时操作
return Service.START_STICKY;
}
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
startService()实现
Intent intent = new Intent(this,MyService.class);
startService(intent);
bindService()实现
private MyService myService;
// 与activity链接的Service
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
myService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 当建立链接时候调用
myService = ((myService.MyBinder) service).getService();
//TODO 调用服务的某些方法myService.method();
}
};
//连接绑定的Service
public void conService(){
Intent bindIntent = new Intent(this,MyService.class);
bindService(bindIntent, connection, Context.BIND_AUTO_CREATE);
}
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()