什麼是Service?
Service是 Android 系統中的一種組件,它和Activity的級別差不多,但又Activity不同,它是不能與用戶交互的,但可以和其他組件進行交互。它不能自己運行,只能後臺運行。
Service的特點:沒有可視的UI、後臺運行,運行不阻塞前臺UI、擁有服務的進程具有較高的優先級
Service的生命週期:
Android Service的生命週期並不像Activity那麼複雜,它只繼承了onCreate(),onStart(),onDestroy()三個方法,當我們第一次啓動Service時,先後調用了onCreate(),onStart()這兩個方法,當停止Service時,則執行onDestroy()方法,這裏需要注意的是,如果Service已經啓動了,當我們再次啓動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法,具體的可以看下面的實例。
服務啓動的兩種方式及用法:context.startService()和context.bindService()方式啓動
提醒:使用Service之前必須在androidMainfest.xml 中註冊
① context.startService()
啓動:context.startService() ---> onCreate() ---> onStartCommand()
銷燬:ontext.stopService() ---> onDestroy();
如果Service還沒運行,則Android會先調用onCreate()方法,然後再調用onStartCommand();
如果Service已經運行了,則只調用onStartCommand(),所以一個Service的onStartCommand(),方法 可能會調用多
實例代碼:通過打印結果可知其執行順序
com.liu.activity包:
public class ServiceTestActivity extends Activity {
private Button btn_start, btn_end;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.service_test);
btn_start = (Button) findViewById(R.id.btn_satrt);
btn_end = (Button) findViewById(R.id.btn_end);
btn_start.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
System.out.println("--->啓動服務");
// 通過 Intent 啓動已註冊的 service
startService(new Intent("com.sharpandroid.Music"));
}
});
btn_end.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
System.out.println("--->停止服務");
stopService(new Intent("com.sharpandroid.Music"));
}
});
}
}
com.liu.service包:
public class Service_MusicPlayer extends Service {
private final String TAG = "Service_MusicPlayer";
MediaPlayer mPlayer;
public void onCreate() {
Log.i(TAG, "--------->OnCreate()");
super.onCreate();
}
public void onStart(Intent intent, int startId) {
Log.i(TAG, "--------->OnStart()");
// 在layout下創建raw文件夾,放一個音樂文件(自命名如music)在raw下
mPlayer = MediaPlayer.create(this, R.raw.music);
super.onStart(intent, startId);
mPlayer.start();
}
public void onDestroy() {
Log.i(TAG, "--------->onDestroy()");
super.onDestroy();
mPlayer.stop();
}
public IBinder onBind(Intent intent) {
return null;
}
}
結果:
② context.bindService()
啓動:context.bindService() ---> onCreate() --->onBind();
銷燬:onUnibind() ---> onDestroy()
onBind()方法將返回給客戶端一個IBind接口實例,IBind允許客戶端調用服務的方法,比如得到Service 允許狀態或者其他操作這個時 ? 候調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Service就會調用onUnibind() ---> onDesytoy()相應退出
實例代碼:
com.liu.activity包:
public class TestActivity extends Activity {
private Button btn_satrt, btn_end;
private Bind_Service Bind_Service = null;
protected boolean isBound = false;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn_satrt = (Button) findViewById(R.id.btn_start);
btn_end = (Button) findViewById(R.id.btn_end);
btn_satrt.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
System.out.println("Bind服務");
Intent intent = new Intent(TestActivity.this,
Bind_Service.class);
// bindService(service, conn, flags)用來綁定一個服務
TestActivity.this.bindService(intent, mConnection,
Context.BIND_AUTO_CREATE);
isBound = true;
}
});
btn_end.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (isBound) {
System.out.println("unBind服務");
// unbindService(conn)解除綁定
TestActivity.this.unbindService(mConnection);
}
}
});
}
//ServiceConnection是bindService()的關鍵步驟,將Activity與Service捆綁在一起
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
Bind_Service = null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
Bind_Service = ((Bind_Service.LocalBinder) service).getService();
}
};
}
com.liu.service包:
public class Bind_Service extends Service {
//內部類,作用返回Bind_Service對象
public class LocalBinder extends Binder {
public Bind_Service getService() {
return Bind_Service.this;
}
}
@Override
public IBinder onBind(Intent arg0) {
System.out.println("------->onBind()");
return null;
}
@Override
public void onCreate() {
System.out.println("------->onCreate()");
super.onCreate();
}
@Override
public void onDestroy() {
System.out.println("------->onDestroy()");
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
System.out.println("------->onStart()");
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("------->onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}
}
結果:
總結:startService()啓動方式代碼少、簡單,適用於簡單的應用,而bindService()操作性強,使用起來想Activity。
兩者區別:bindService()方式啓動的Service隨Activity的生命結束而結束,startService()則不 受影響。