Service基础

Service基础

service 是Android的四大组件之一,服务的主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示UI的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。通过AIDL服务可以实现不同进程之间的通信,这样也是服务的重要用途之一。
1、 Service生命周期
Service生命周期可以从两种启动Service的模式开始讲起,分别是context.startService()和context.bindService()。
(1).startService的启动模式下的生命周期:当我们首次使用startService启动一个服务时,系统会实例化一个Service实例,依次调用其onCreate和onStartCommand方法,然后进入运行状态,此后,如果再使用startService启动服务时,不再创建新的服务对象,系统会自动找到刚才创建的Service实例,调用其onStart方法;如果我们想要停掉一个服务,可使用stopService方法,此时onDestroy方法会被调用,需要注意的是,不管前面使用了多个次startService,只需一次stopService,即可停掉服务。
(2).bindService启动模式下的生命周期:在这种模式下,当调用者首次使用bindService绑定一个服务时,系统会实例化一个Service实例,并一次调用其onCreate方法和onBind方法,然后调用者就可以和服务进行交互了,此后,如果再次使用bindService绑定服务,系统不会创建新的Service实例,也不会再调用onBind方法;如果我们需要解除与这个服务的绑定,可使用unbindService方法,此时onUnbind方法和onDestroy方法会被调用。
两种模式有以下几点不同之处:startService模式下调用者与服务无必然联系,即使调用者结束了自己的生命周期,只要没有使用stopService方法停止这个服务,服务仍会运行;通常情况下,bindService模式下服务是与调用者生死与共的,在绑定结束之后,一旦调用者被销毁,服务也就立即终止,就像江湖上的一句话:不求同生,但愿同死。
值得一提的是,以前我们在使用startService启动服务时都是习惯重写onStart方法,在Android2.0时系统引进了onStartCommand方法取代onStart方法,为了兼容以前的程序,在onStartCommand方法中其实调用了onStart方法,不过我们最好是重写onStartCommand方法。
以上两种模式的流程如下图所示:

下面我们就结合实例来演示一下这两种模式的生命周期过程。我们新建一个名为service的项目,然后创建一个MyService的服务类,代码如下:

public class MyService extends Service {  

private static final String TAG = "MyService";  

@Override  
public void onCreate() {  
    super.onCreate();  
    Log.i(TAG, "onCreate called.");  
}  

@Override  
public int onStartCommand(Intent intent, int flags, int startId) {  
    Log.i(TAG, "onStartCommand called.");  
    return super.onStartCommand(intent, flags, startId);  
}  

@Override  
public void onStart(Intent intent, int startId) {  
    super.onStart(intent, startId);  
    Log.i(TAG, "onStart called.");  
}  

@Override  
public IBinder onBind(Intent intent) {  
    Log.i(TAG, "onBind called.");  
    return null;  
}  

@Override  
public boolean onUnbind(Intent intent) {  
    Log.i(TAG, "onUnbind called.");  
    return super.onUnbind(intent);  
}  

@Override  
public void onDestroy() {  
    super.onDestroy();  
    Log.i(TAG, "onDestroy called.");  
}  

然后再AndroidManifest.xml中配置服务信息,不然这个服务就不会生效,配置如下:

<service android:name=".MyService">  
        <intent-filter>  
             <action android:name="android.intent.action.MyService" />  
             <category android:name="android.intent.category.DEFAULT" />  
        </intent-filter>  
    </service>  

一个是启动服务,另一个是停止服务,我们来看一下他们的点击事件:

    /** 
 * 启动服务 
* @param view 
 */  
public void start(View view) {  
Intent intent = new Intent(this, MyService.class);  
startService(intent);  
}  

/** 
* 停止服务 
* @param view 
*/  
public void stop(View view) {  
Intent intent = new Intent(this, MyService.class);  
stopService(intent);  
}

bind方式绑定和解除服务

/** 
* 绑定服务 
* @param view 
*/  
public void bind(View view) {  
Intent intent = new Intent(this, MyService.class);  
bindService(intent, conn, Context.BIND_AUTO_CREATE);  
}  

/** 
* 解除绑定 
* @param view 
*/  
public void unbind(View view) {  
unbindService(conn);  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值