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()方法,直到应用关闭后才会调用
书中的示例源代码在附件中,大家自己可以尝试一下,看看对不对。