這篇文章主要講解一些Android service入門基礎(chǔ)知識,希望帶大家走進(jìn)Android service的大門。
1.什么是服務(wù)
服務(wù)是Android中為了實現(xiàn)程序后臺運行的解決方案,非常適合執(zhí)行那些不需要和用戶交互而且還要求長期運行的程序。服務(wù)的運行不依賴任何用戶界面,即使程序被切換到后臺,或者用戶打開了另一個應(yīng)用程序,服務(wù)仍然能夠保持正常運行。
2.如何定義服務(wù)
通常我們會新建一個類,讓其繼承Service
如:
public class MyService extends Service{
public IBinder onBind(Intent intent){
}
public void onCreate(){
}
public int onStartCommand(Intent intnt,int flags,int startId){
return super.onStartCommand(intente,flags,startId)
}
public void onDestory(){
super.onDestory();
}
}
onCreate()在服務(wù)創(chuàng)建的時候啟動,onStratCommand()會在服務(wù)啟動的時候啟動,onDestory()會在服務(wù)銷毀的時候調(diào)用。
3.如何啟動服務(wù)
首先要在AndroidManifest中注冊service,如:
<service name="。MyService">
</service>
啟動服務(wù)需要通過方法startService(Intent),如startService(new Intent(this,MyService.class));
停止服務(wù)則需要通過方法stopService(Intnet),如stopService(new Intent(this,MyService.class));
啟動服務(wù)后會先調(diào)用onCreate(),然后再調(diào)用onStartCommand()。其中onCreate()在第一次創(chuàng)建service的時候會調(diào)用,而onStartCommand()每次啟動服務(wù)的時候都會調(diào)用。
4.服務(wù)如何和活動進(jìn)行通信
雖然我們通過startService啟動了服務(wù),但是這也只是單單的運行服務(wù),沒有和活動進(jìn)行任何聯(lián)系,所以現(xiàn)在我們要讓服務(wù)和活動進(jìn)行通信。
這里讓兩者聯(lián)系起來需要用到之前提到過的onBind(),但是我們首先要在繼承了Service的類中,創(chuàng)建一個繼承了Binder的內(nèi)部類,該內(nèi)部類中寫上需要活動用到的方法,如查看下載進(jìn)度的getProgress()和開始下載的startDownload()等,為了讓活動能獲取到該類的實例,我們還需要創(chuàng)建一個實例,在onBind()中返回該實例。整體的例子:
public class LocalService extends Service {
public class DownloadBinder extends Binder{
public void startDownload(){
Log.d("MyService","startDownload execute");
}
public int getProgress(){
return 0;
}
}
public DownloadBinder mBinder=new DownloadBinder();
@Override
public IBinder onBind(Intent intent) {
// 返回 SimpleBinder 對象
return mBinder;
}
}
那么接下來活動如何獲取Binder呢?
我們只要在活動中調(diào)用onBind(Intnet,serviceConnection,BIND_AUTO_CREATE)就可以讓服務(wù)和活動綁定在一起,從而讓活動調(diào)用服務(wù)中的方法。
這其中第二個參數(shù)serviceConnection需要我們在活動中創(chuàng)建出來,我們需要在活動中創(chuàng)建其匿名類,然后其中有兩個方法,一個為onServiceConnected(),另一個為onServiceDisconnected(),
我們需要在onServiceConnected()中通過向下轉(zhuǎn)型獲取到服務(wù)中的Binder,然后通過Binder調(diào)用服務(wù)中的方法。
第三個參數(shù)是一個標(biāo)志位,BIND_AUTO_CREATE代表活動和服務(wù)在綁定后自動創(chuàng)建服務(wù)。
如果需要解綁服務(wù),調(diào)用unbindService(serviceConnection);
例子
ServiceConnection sc = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyService.DownloadBinder mBinder = (MyService.DownloadBinder)service;
}
};
findViewById(R.id.btnBind).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
bindService(new Intent(Main.this,MyService.class), sc, Context.BIND_AUTO_CREATE);
isBind = true;
}
});
findViewById(R.id.btnUnbind).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(isBind){
unbindService(sc);
isBind = false;
}
}
});
5.服務(wù)的生命周期
只啟動的服務(wù):onCreate()→onStartCommand()→onDestory()
如果被startService()多次啟動,onCreate()只執(zhí)行一次,onStart()多次執(zhí)行,只創(chuàng)建Service的一個實例。
只綁定的服務(wù):onCreate()→onBind→onUnbind()→onDestory()
bindService()多次調(diào)用,onCreate()只調(diào)用一次,除非調(diào)用unBindService(),否則Service一直運行。
即啟動又綁定的服務(wù):onCreate()→onStartCommand()→onBind()→onUnBind()→onDestory()
onCreate()必定只執(zhí)行一次,startService調(diào)用幾次則執(zhí)行幾次onStartCommand(),調(diào)用unbind不會停止service,必須stopService或Service的stopself()停止服務(wù)。
文章來自:博客園/shawdo