ActivityとService通信の4つの方式

4360 ワード

1、Binder
//activity 
private MyService.MyBinder myBinder = null;
private ServiceConnection serviceConnection = newServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myBinder = (MyService.MyBinder)service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
// Service Binder Service ,Activity :
       if(myBinder != null){
           myBinder.setData("dataValue");
       }

//service :
public class MyBinder extends Binder {

        public MyService getService(){

            return MyService.this;

        }

        public void setData(String dataValue){
            data = dataValue;

        }

        public String getData(){

            return data;

        }

//service onBind :
  @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }


2、Intent
//activity Intent service
Intent intent = new Intent(TestActivity.this, MyService.class);
intent.putExtra("dataKey","dataValue");
startService(intent);


// service onStartCommand Intent 
@Override
    public int onStartCommand(Intent intent, int flags, int startId) {

       String dataVaule = intent.getStringExtra("dataKey");

       return super.onStartCommand(intent, flags, startId);

   }

3、インターフェイス
サービスでインタフェースとインタフェース変数を定義し、データを転送する必要がある場所でインタフェースメソッドを呼び出してデータ転送を行い、Activityでインタフェースを実装してインタフェースメソッドを書き換えることで、サービスで転送されたデータを取得できます.
Service :
//  
if (serviceCallBack != null) {
       //  , 
       serviceCallBack.getServiceData(data);
   }

 // 
public interface ServiceCallBack {
        void getServiceData(String data);
}


//activity :implements ServiceCallBack

 @Override
    public void getServiceData(String data) {
        //   data   Service  
    }

4、ブロードキャスト受信
この方式は比較的簡単で、サービスでIntentを利用してブロードキャストを送信し、Activityに対応するブロードキャスト受信を登録することで、Intentから伝達されたデータを取得することができます.