android Service 与Activity绑定

  • Post author:
  • Post category:其他


Service是android的四大组件之一,地位相当重要。Service是没有实际界面,在后台运行的。

Service的生命周期比起Activity的少多了:创建服务,开始服务,销毁服务

创建服务和销毁服务只会一次,而开始服务可以执行多次

使用服务:

(1) 编写类继承自android.app.Service。

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.util.Log;

public class MyService extends Service {


//服务生命周期 创建,开始,销毁

/**

* 创建

*/

@Override

public void onCreate() {


// TODO Auto-generated method stub

super.onCreate();

Log.d(“info”, “Service Create”);

}

/*

* 开始

* (non-Javadoc)

* @see android.app.Service#onStart(android.content.Intent, int)

*/

@Override

public void onStart(Intent intent, int startId) {


// TODO Auto-generated method stub

super.onStart(intent, startId);

Log.d(“info”, “Service Start”);

}

/**

* 销毁

*/

@Override

public void onDestroy() {


// TODO Auto-generated method stub

super.onDestroy();

Log.d(“info”, “Service Destroy”);

}

/**

* 当Service与Activity成功绑定时调用这个方法(non-Javadoc)

* @see android.app.Service#onBind(android.content.Intent)

*/

@Override

public IBinder onBind(Intent arg0) {


Log.d(“info”,”Service Bind Success”);

return null;

}

/**

* 重新绑定

*/

@Override

public void onRebind(Intent intent) {

super.onRebind(intent);

Log.d(“info”,”Service ReBind Success”);

}

/**

* 取消绑定

*/

@Override

public boolean onUnbind(Intent intent) {

Log.d(“info”,”Service Unbind Success”);

return super.onUnbind(intent);

}

}

(2)  在AndroidManifest.xml中配置<service>标签

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

(3)使用通过万能的Intent

–启动服务

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

Main.this.startService(intent);

–停止服务

Main.this.stopService(intent);

通常情况下 我们希望应用关闭Service就会能停止,这就要通过Service与Activity的绑定来实现

绑定服务:

(1) 通过使用Activity的bindService(Intent service,ServiceConnection conn,int flags)完成

由该方法的第二个参数可以确定第二步要做什么

(2) 编写类实现ServiceConnection 接口

class MyServiceConnection implements ServiceConnection

{

@Override

public void onServiceConnected(ComponentName arg0, IBinder arg1) {


Log.d(“info”, “Service Connection Success”);

//连接成功执行

}

@Override

public void onServiceDisconnected(ComponentName arg0) {


// TODO Auto-generated method stub

Log.d(“info”, “Service Connection Filed”);

//连接失败执行

}

}

(3)使用

class BtnClick implements OnClickListener

{


@Override

public void onClick(View arg0) {


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

MyServiceConnection myServiceConnection = new MyServiceConnection();

switch (arg0.getId()) {


case R.id.btnStart:

Main.this.startService(intent);

break;

case R.id.btnStop:

Main.this.stopService(intent);

break;

case R.id.btnBind:

Main.this.bindService(intent,connection ,Context.BIND_AUTO_CREATE);

break;

case R.id.btnUnBind:

//ServiceConnection必须是全局变量否则此处报错

Main.this.unbindService(connection);

break;

default:

break;

}

}

}

Android/Ophone书上说:要想Service随着Activity的销毁而销毁 必须的先绑定Service后启动Service(多次尝试后发现这句话不对)。

运行Android/Ophone的示例代码src\ch08\ch08_serviceactivity 与书上186页最后一段文字表达的意思不相符

书上的意思是开始服务与绑定服务的先后顺序会影响到onDestroy()的调用,但是事实上并非如此

(1) Start Service –Bind Service — 关闭应用 结果:

Log输出:  onCreate onStart — onBind — onUnbind

(2)Bind Service — Start Service –关闭应用 结果:

Log输出: onCreate onBind — onStart — onUnbind

(1)(2)的结果一样  都没有调用onDestroy()方法

发现Service与Activity绑定之后没有效果,继续尝试,发现了一些有趣的现象

(3)Start Service — Bind Service — Stop Service –关闭应用 结果:

Log输出: onCreate onStart — onBind –(没有效果)–onUnBind onDestroy

(4)Bind Service — Start Service — Stop Service — 关闭应用 结果:

Log输出: onCreate onBind — onStart — (没有效果) — onUnBind onDestroy

(1)(2)(3)(4)得知:

a.开始服务与绑定服务的先后顺序与关闭应用后是否销毁服务无关

b.在绑定服务后,是否调用stopService() 与 关闭应用后是否销毁服务有关

c.Service与Activity绑定后调用stopService()服务不会立刻调用onDestroy()方法,直到应用关闭后才会调用

书中的示例源代码在附件中,大家自己可以尝试一下,看看对不对。