1. 程式人生 > >安卓入門--四大元件--Service基本用法

安卓入門--四大元件--Service基本用法

Service是什麼

Service(服務)是一個沒有使用者介面的在後臺執行執行耗時操作的應用元件。其他應用元件能夠啟動Service,並且當用戶切換到另外的應用場景,Service將持續在後臺執行。另外,一個元件能夠繫結到一個service與之互動(IPC機制),例如,一個service可能會處理網路操作,播放音樂,操作檔案I/O或者與內容提供者(content
provider)互動,所有這些活動都是在後臺進行。

Service有兩種狀態,“啟動的”和“繫結”

Service預設跑在主執行緒,所以是在Service裡建立子執行緒而不是建立子執行緒跑Service。

Service的基本使用

定義一個服務:新建類繼承Service類
onBind方法是必須覆蓋的,而其他三個分別是建立時呼叫,銷燬時呼叫,啟動時呼叫

public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public
int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); } }

註冊Service,同樣是在配置檔案中:

<service android:name=".MyService" />

啟動服務和停止服務:

 switch (v.getId()) {
            case
R.id.button1: Intent startIntent =new Intent(this,MyService.class); startService(startIntent); break; case R.id.button2: Intent stopIntent =new Intent(this,MyService.class); stopService(stopIntent); break; }

Service自己結束自己:stopSelf();

如果要服務完成什麼功能,寫在onStartCommand方法裡面即可。

Service與Activity通訊:

使用Binder物件可以進行兩者通訊,方法如下:
1. 在service裡面新建Binder類繼承Binder:

class MyBinder extends Binder{
        public void MyStart(){
            Log.d("Service", "MyStart: MyStart");
        }
    }
  1. onBind方法中返回這個類的例項
private MyBinder mybinder;
    @Override
    public IBinder onBind(Intent intent) {
        return mybinder;
    }
  1. 接下來在活動中呼叫Service的方法,先繫結服務。
    繫結用的引數connection;
private MyService.MyBinder myBinder;
    private ServiceConnection connection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
//繫結呼叫
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
//j解綁呼叫
        }
    };

繫結服務

case R.id.button3:
                Intent bindIntent=new Intent(this,MyService.class);
                bindService(bindIntent,connection,BIND_AUTO_CREATE);
                break;
            case R.id.button4:
                unbindService(connection);
                break;

呼叫服務的方法:
寫在onServiceConnected裡面:

@Override
        public void onServiceConnected(ComponentName name, IBinder service) {
         myBinder=(MyService.MyBinder) service;
            myBinder.MyStart();
        }

服務的生命週期

這裡寫圖片描述
通過這個圖可以看到,兩種啟動service的方式以及他們的生命週期,bind service的不同之處在於當繫結的元件銷燬後,對應的service也就被kill了。service的宣告週期相比與activity的簡單了許多,只要好好理解兩種啟動service方式的異同就行。