1. 在同一個(gè)應(yīng)用任何地方調(diào)用 startService() 方法就能啟動 Service 了,然后系統(tǒng)會回調(diào) Service 類的 onCreate() 以及 onStart() 方法。這樣啟動的 Service 會一直運(yùn)行在后臺,直到 Context.stopService() 或者 selfStop() 方法被調(diào)用。另外如果一個(gè) Service 已經(jīng)被啟動,其他代碼再試圖調(diào)用 startService() 方法,是不會執(zhí)行 onCreate() 的,但會重新執(zhí)行一次 onStart() 。
2. 另外一種 bindService() 方法的意思是,把這個(gè) Service 和調(diào)用 Service 的客戶類綁起來,如果調(diào)用這個(gè)客戶類被銷毀,Service 也會被銷毀。用這個(gè)方法的一個(gè)好處是,bindService() 方法執(zhí)行后 Service 會回調(diào)上邊提到的 onBind() 方發(fā),你可以從這里返回一個(gè)實(shí)現(xiàn)了 IBind 接口的類,在客戶端操作這個(gè)類就能和這個(gè)服務(wù)通信了,比如得到 Service 運(yùn)行的狀態(tài)或其他操作。如果 Service 還沒有運(yùn)行,使用這個(gè)方法啟動 Service 就會 onCreate() 方法而不會調(diào)用 onStart()。
區(qū)別概況為:
startService() 的調(diào)用者與服務(wù)沒有聯(lián)系,即使調(diào)用者退出了,服務(wù)仍然運(yùn)行,而bindService() 的調(diào)用者與服務(wù)綁在一起,調(diào)用者一旦退出了,服務(wù)也隨即終止掉。www.2cto.com
這里用一個(gè)實(shí)例(使用startService()方法來啟動)來講解一下service的聲明周期和使用方法:
首先編寫一個(gè)類繼承Service這個(gè)基類,重寫里面的方法,然后在Activity中調(diào)用startService()和stopService()來啟動和停止服務(wù)。
運(yùn)行界面:
工程目錄結(jié)構(gòu):
ExampleService.java
[html]
package com.service.activity;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class ExampleService extends Service{
private static final String TAG = "ExampleService";
@Override
public void onCreate() {
Log.i(TAG, "ExampleService-onCreate");
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
Log.i(TAG, "ExampleService-onStart");
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//執(zhí)行文件的下載或者播放等操作
Log.i(TAG, "ExampleService-onStartCommand");
/*
* 這里返回狀態(tài)有三個(gè)值,分別是:
* 1、START_STICKY:當(dāng)服務(wù)進(jìn)程在運(yùn)行時(shí)被殺死,系統(tǒng)將會把它置為started狀態(tài),但是不保存其傳遞的Intent對象,之后,系統(tǒng)會嘗試重新創(chuàng)建服務(wù);
* 2、START_NOT_STICKY:當(dāng)服務(wù)進(jìn)程在運(yùn)行時(shí)被殺死,并且沒有新的Intent對象傳遞過來的話,系統(tǒng)將會把它置為started狀態(tài),
* 但是系統(tǒng)不會重新創(chuàng)建服務(wù),直到startService(Intent intent)方法再次被調(diào)用;
* 3、START_REDELIVER_INTENT:當(dāng)服務(wù)進(jìn)程在運(yùn)行時(shí)被殺死,它將會在隔一段時(shí)間后自動創(chuàng)建,并且最后一個(gè)傳遞的Intent對象將會再次傳遞過來。
*/
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "ExampleService-onBind");
return null;
}
@Override
public void onDestroy() {
Log.i(TAG, "ExampleService-onDestroy");
super.onDestroy();
}
}
MainActivity.java
[html]
package com.service.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
private static final String TAG = "MainActivity"; //日志輸出標(biāo)志
private Button btnStartService;
private Button btnStopService;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStartService = (Button)findViewById(R.id.btnStartService);
btnStopService = (Button)findViewById(R.id.btnStopService);
btnStartService.setOnClickListener(this);
btnStopService.setOnClickListener(this);
}
//點(diǎn)擊事件處理監(jiān)聽器
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,ExampleService.class);
switch(v.getId()){
case R.id.btnStartService:
startService(intent);
break;
case R.id.btnStopService:
stopService(intent);
break;
default:
break;
}
}
}
最后在AndroidManifest.xml中對service進(jìn)行聲明,它跟Activity同一級,都寫在Application標(biāo)簽里面:
<service android:name=".ExampleService"/>
創(chuàng)建完運(yùn)行
在運(yùn)行點(diǎn)擊"啟動service"之后(第一次啟動service),我們可以查看LogCat控制臺輸出的日志如下:
這個(gè)時(shí)候我們點(diǎn)擊"返回",Activity被干掉了,但是我們的服務(wù)仍然在運(yùn)行,可以查看Setting-->Application-->Running Service,截圖如下:
然后回到我們的Activity,再次點(diǎn)擊啟動Service,控制臺輸出日志如下:
onCreate()方法沒有被調(diào)用,說明它并沒有重新被創(chuàng)建。
然后我們點(diǎn)擊停止Service,輸出日志如下:
|
|