このチュートリアルに従って、アクティビティをサービスにバインドしました。 http://developer.android.com/guide/components/bound-services.html
サービス関数を呼び出すことはできますが、たとえば、サービスで(およびサービスから)行われた作業のために、テキストビューの一部を変更したり、トグルボタンの一部を無効にしたりしたい場合はどうすればよいですか。これを行う簡単な方法はありますか?
このチュートリアルに従って、アクティビティをサービスにバインドしました。 http://developer.android.com/guide/components/bound-services.html
サービス関数を呼び出すことはできますが、たとえば、サービスで(およびサービスから)行われた作業のために、テキストビューの一部を変更したり、トグルボタンの一部を無効にしたりしたい場合はどうすればよいですか。これを行う簡単な方法はありますか?
メッセージを使用して、アクティビティとサービスの間で情報を送信できます。これは単純なデータを送信する簡単な方法ですが、データを頻繁に送信する必要がある場合、または複雑なデータを送信する必要がある場合は、最適なオプションではない可能性があります。これは、通信するサービスとアクティビティを備えたアプリの1つにあるコードの例です。
アクティビティのコード:
//this is where you set what you want to happen
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
//this switch reads the information in the message (usually just
//an integer) and will do something depending on which integer is sent
case 1: do_something();
case 2: do_something_2(); //etc.
default:
super.handleMessage(msg);
}
}
}
final Messenger myMessenger = new Messenger(new IncomingHandler());
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
myService = new Messenger(service);
myCallbackText = (TextView)findViewById(R.id.tv01); //This is a text view which will display status information as needed
myCallbackText.setText("Attached.");
try {
Message msg = Message.obtain(null,
1);
msg.replyTo = mMessenger; //here we send an instance of our messenger implementation as the replyTo address
mService.send(msg);
msg = Message.obtain(null,
3, this.hashCode(), 0);
mService.send(msg); //send a message with the value "3"
} catch (RemoteException e) {
//nothing you can do if the server isn't active
}
Toast.makeText(Service_testActivity.this, R.string.remote_service_connected,
Toast.LENGTH_SHORT).show();//confirmation that the connection happened successfully
}
public void onServiceDisconnected(ComponentName className) {
// This is called when the connection with the service has been
// unexpectedly disconnected -- that is, its process crashed.
mService = null;
mCallbackText = (TextView)findViewById(R.id.tv01);//same textview as before
mCallbackText.setText("Disconnected.");
Toast.makeText(Service_testActivity.this, R.string.remote_service_disconnected,
Toast.LENGTH_SHORT).show();
}
};
サービスのコード:msg.replyTo
サービスでは、メッセージを受信してフィールドをMessenger
オブジェクトとして
保存するためのコード(アクティビティのコードと非常によく似ています)が必要になります。オブジェクトを作成してから、次のようなIncomingHandlerを使用する例がどこかにあります。
ArrayList<Messenger> mClients = new ArrayList<Messenger>();
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REGISTER_CLIENT:
mClients.add(msg.replyTo);
break;
case MSG_UNREGISTER_CLIENT:
mClients.remove(msg.replyTo);
break;
default:
super.handleMessage(msg);
}
}
}
これにより、サービスは一度に複数のクライアントを追跡し、指定されたクライアントにメッセージを送信できます。メッセージを送信するには、次のようなものを使用します。
mClients.get(1).send(Message.obtain(null, 3, new Random().nextInt(), 0));
//sends a message to the first client saved in the list