web-dev-qa-db-ja.com

バインド/アンバインドサービスの例(Android)

bind/unbindメソッドを使用して起動および停止するバックグラウンドサービスを備えたアプリケーションの簡単な例を教えてください。私は30分間それをグーグルで探していましたが、それらの例はstartService/stopServiceメソッドを使用するか、私にとって非常に困難です。ありがとうございました。

52
user1049280

このコードを使用して試すことができます:

protected ServiceConnection mServerConn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder binder) {
        Log.d(LOG_TAG, "onServiceConnected");
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d(LOG_TAG, "onServiceDisconnected");
    }
}

public void start() {
    // mContext is defined upper in code, I think it is not necessary to explain what is it 
    mContext.bindService(intent, mServerConn, Context.BIND_AUTO_CREATE);
    mContext.startService(intent);
}

public void stop() {
    mContext.stopService(new Intent(mContext, ServiceRemote.class));
    mContext.unbindService(mServerConn);
}
60
Dawid Sajdak

これらのメソッドをアクティビティに追加します。

_private MyService myServiceBinder;
public ServiceConnection myConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder binder) {
        myServiceBinder = ((MyService.MyBinder) binder).getService();
        Log.d("ServiceConnection","connected");
        showServiceData();
    }

    public void onServiceDisconnected(ComponentName className) {
        Log.d("ServiceConnection","disconnected");
        myService = null;
    }
};

public Handler myHandler = new Handler() {
    public void handleMessage(Message message) {
        Bundle data = message.getData();
    }
};

public void doBindService() {
    Intent intent = null;
    intent = new Intent(this, BTService.class);
    // Create a new Messenger for the communication back
    // From the Service to the Activity
    Messenger messenger = new Messenger(myHandler);
    intent.putExtra("MESSENGER", messenger);

    bindService(intent, myConnection, Context.BIND_AUTO_CREATE);
}
_

そして、ActivityクラスでonResume()およびonPause()をovverridingすることにより、サービスにバインドできます。

_@Override
protected void onResume() {

    Log.d("activity", "onResume");
    if (myService == null) {
        doBindService();
    }
    super.onResume();
}

@Override
protected void onPause() {
    //FIXME put back

    Log.d("activity", "onPause");
    if (myService != null) {
        unbindService(myConnection);
        myService = null;
    }
    super.onPause();
}
_

サービスにバインドするときは、onCreate()メソッドのみがサービスクラスで呼び出されることに注意してください。 Serviceクラスで、myBinderメソッドを定義する必要があります。

_private final IBinder mBinder = new MyBinder();
private Messenger outMessenger;

@Override
public IBinder onBind(Intent arg0) {
    Bundle extras = arg0.getExtras();
    Log.d("service","onBind");
    // Get messager from the Activity
    if (extras != null) {
        Log.d("service","onBind with extra");
        outMessenger = (Messenger) extras.get("MESSENGER");
    }
    return mBinder;
}

public class MyBinder extends Binder {
    MyService getService() {
        return MyService.this;
    }
}
_

これらのメソッドを定義したら、アクティビティでサービスのメソッドに到達できます。

_private void showServiceData() {  
    myServiceBinder.myMethod();
}
_

最後に、_BOOT_COMPLETED_などのイベントが発生したときにサービスを開始できます

_public class MyReciever  extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals("Android.intent.action.BOOT_COMPLETED")) {
            Intent service = new Intent(context, myService.class);
            context.startService(service);
        }
    }
}
_

サービスを開始すると、サービスクラスでonCreate()およびonStartCommand()が呼び出され、stopService()によって別のイベントが発生したときにサービスを停止できることに注意してください。イベントリスナーをAndroidマニフェストファイルに登録する必要があります。

_<receiver Android:name="MyReciever" Android:enabled="true" Android:exported="true">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
</receiver>
_
41
HiB

まず、理解する必要がある2つのこと、

クライアント

  • 特定のサーバーにリクエストします

bindService(new Intent("com.Android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);

ここでmServiceConnServiceConnection class(inbuilt)のインスタンスです。実際には、ネットワーク接続状態を監視するための2つのメソッド(ネットワーク接続用と非接続用)を実装する必要があるインターフェースです。

サーバ

  • クライアントのリクエストを処理し、リクエストを送信するクライアントのみにプライベートなレプリカを作成します。このサーバーのラプリカは異なるスレッドで実行されます。

クライアント側で、サーバーのすべてのメソッドにアクセスする方法は?

  • サーバーはIBinderオブジェクトで応答を送信します。したがって、IBinderオブジェクトは、(。)演算子を使用してServiceのすべてのメソッドにアクセスするハンドラーです。

MyService myService;
public ServiceConnection myConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder binder) {
        Log.d("ServiceConnection","connected");
        myService = binder;
    }
    //binder comes from server to communicate with method's of 

    public void onServiceDisconnected(ComponentName className) {
        Log.d("ServiceConnection","disconnected");
        myService = null;
    }
}

今、サービスにあるメソッドを呼び出す方法

myservice.serviceMethod();

ここで、myServiceはオブジェクトであり、serviceMethodはサービスのメソッドです。この方法により、クライアントとサーバー間で通信が確立されます。

15
Hardik Gajera