Android複習之旅--Service
阿新 • • 發佈:2018-11-20
服務(Service)可以理解為一個沒有介面的能夠長期在後臺執行的Activity。即使啟動服務的應用程式被切換掉,其啟動的服務仍可以在後臺正常執行。
因此,Service適用於處理一些耗時的業務邏輯,比如下載檔案,進行網路傳輸或者播放音樂等。
建立服務
與建立Activity類似,建立一個類繼承Service,必須重寫onBind()方法,然後可以選擇重寫父類的方法,也可以自定義方法等,最後要在清單檔案中註冊
class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
System.out.println("服務被綁定了" );
return new MyBinder();//返回中間人
}
...
}
<service android:name="com.rixin.service.MyService"></service>
服務的生命週期
服務只會被建立一次,如果服務以及被開啟了,就不會重新呼叫onCreate()方法
詳情請參考我之前寫的 [Android複習之旅–Activity/Service/Fragment 生命週期]
服務的啟動方式
啟動服務有兩種方式,一種是startService方式(服務一經開啟,除非手動停止,否則會一直執行在後臺),一種是bindService方式(服務受呼叫者Activity的生命週期影響)
startService(直接開啟)
onCreate() –> onStartCommand() –> onDestory()
直接開啟服務,服務一旦啟動跟呼叫者(開啟者)沒有任何關係。呼叫者Activity退出了,服務還會在後臺繼續執行,並且Activity沒法訪問服務裡面的方法。
- 先建立服務
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null ;
}
@Override
public void onCreate() {
// TODO 初始化資料
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO 處理業務邏輯
}
@Override
public void onDestroy() {
// TODO 回收資源
}
}
- 再開啟服務(MainActivity.java)
Intent intent = new Intent(this, MyService.class);
startService(intent); //開啟服務
stopService(intent); //關閉服務
bindService(繫結開啟)
onCreate() –> onBind() –> onDestory()
繫結開啟服務,服務和開啟者(呼叫者)有密切關係。只要activity掛了,服務跟著也掛了,不求同時生,但求同時死,呼叫者Activity可以呼叫服務裡面的方法。
- 先建立服務
建立一個內部類繼承Binder,Binder相對於是服務的代理,作為Activity呼叫服務中的自定義方法的橋樑
public class MyService extends Service {
class MyBinder extends Binder{
public void callMethodInService(){
methodInService(); //呼叫方法
}
}
// 服務裡面定義的方法
public void methodInService(){
Toast.makeText(this, "我是服務裡面的方法", 0).show();
}
@Override
public void onCreate() {
// TODO 初始化資料
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
@Override
public boolean onUnbind(Intent intent) {
// 返回啟動的繫結服務是否已經解綁
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
// TODO 回收資源
}
}
- 再開啟服務,並呼叫服務裡面的自定義方法
建立一個內部類繼承ServiceConnection,用來監聽呼叫者與Service之間的連線狀態。
MainActivity.java:
Intent intent = new Intent(this, MyService.class);
bindService(intent, new MyConn(), Context.BIND_AUTO_CREATE);
MyBinder binder; // MyBinder是服務中繼承Binder的內部類
class MyConn implements ServiceConnection{
// 當服務被成功繫結的時候執行此方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyBinder) service;
}
// 當服務失去繫結的時候呼叫此方法(一般當服務突然異常終止時執行)
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
//呼叫服務裡面的方法
public void call(View view){
binder.callMethodInService();
}
希望能對你們有所幫助