Android Service 服务及生命周期

果然前两天动力爆棚啊,接下来了解下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;
	}

看见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链接的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);
}

在连接的时候第三个参数是个标识。它表明的绑定的操作。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 高级编程第三版


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值