天天看點

四大元件之service——應用執行個體三(活動和服務的通信&服務生命周期)

Service作為四大元件之一,也有其生命周期,在前面的執行個體中我們使用到了onCreate(),onStartCommand(),onBind(),及onDestroy()等方法,這些方法并不是全部都會進行回調執行,一般的有以下兩種情況:

1.在項目的某位置調用了startService()方法,相應的服務的onCreate()就會啟動執行,接着回調onStartCommand()方法,直到服務執行完畢調用stopService()方法,回調onDestroy()方法,服務才停止

2.在項目的某位置調用了bindService()方法,相應服務的onBind()方法會被回調執行,如果該服務沒被建立過,onCreate()方法也會被執行,執行onBind()後調用方會擷取IBinder對象的執行個體,這樣服務和活動之間就可以保持通信了。

前面的應用執行個體一和二對第一種情況有了很好的說明,下面的應用執行個體三主要是實作第二種情況的例子:

1.建立mainActivity

public class MainActivity extends Activity implements OnClickListener{

Button bindService;

Button unBindService;

MyService.DownLoadBinder mBinder;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        bindService = (Button)findViewById(R.id.BindService);

        unBindService = (Button)findViewById(R.id.unBindService);

        bindService.setOnClickListener(this);

        unBindService.setOnClickListener(this);

    }

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

//點選bindservice按鈕後,建立intent對象,執行bindService()方法,傳入第一個參數為可啟動MyService的意圖

//傳入的第二個參數為建立的和服務建立連接配接通訊的serviceConnection對象connection

//傳入的第三個參數為一個标志位,表示自動建立服務

//點選unbindservice按鈕後,調用unbindservice()方法停止通訊連接配接,即可停止服務

switch (arg0.getId()) {

case R.id.BindService:

Intent intent = new Intent(this, MyService.class);

bindService(intent,connection,BIND_AUTO_CREATE);

break;

case R.id.unBindService:

unbindService(connection);

default:

break;

}

}

//建立和服務建立通訊連接配接的匿名serviceconnection對象

ServiceConnection connection = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName name) {

// TODO Auto-generated method stub

}

//當建立和服務的通訊連接配接後,回調函數onBind傳回mBinder後,啟動onserviceconnection方法,通過mBinder自用啟動調用服務中的方法

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

// TODO Auto-generated method stub

mBinder = (MyService.DownLoadBinder)service;

mBinder.startDownLoad();

mBinder.getProgress();

}

};

}

二.建立MyService

public class MyService extends Service {

DownLoadBinder mBinder= new DownLoadBinder();

public MyService() {

}

//在 使用方法bindService()的時候,調用onBind之前會先調用onCreate()方法

public void onCreate(){

super.onCreate();

Log.d("MyService","onCreate executed");

}

//建立DownloadBinder類繼承Binder類,當執行完onBind後調用方擷取mBinder執行個體,

//該執行個體對象可自由調用該類中的Startdownload或者getProgress等方法

class DownLoadBinder extends Binder{

public void startDownLoad(){

Log.d("MyService", "startDownload execuuted");

}

public void getProgress(){

Log.d("MyService", "getProgress executed");

}

}

@Override

//開始bindService()方法後,回調onBind,擷取的mBinder傳回調用方,此後調用方可通過mBinder對服務進行随時的指令通訊

public IBinder onBind(Intent intent) {

return mBinder;

// TODO: Return the communication channel to the service.

}

//啟動unbindservice()方法後回調onDestroy()方法,停止服務

public void onDestroy(){

super.onDestroy();

Log.d("MyService", "onDestroy executed");

}

}

三.在manifest中對服務進行注冊

        <service

            android:name=".MyService"

            android:enabled="true"

            android:exported="true" >

        </service>

運作程式,列印的log結果如下:

四大元件之service——應用執行個體三(活動和服務的通信&amp;服務生命周期)

繼續閱讀