Android学習ノートのサービス通信(Messenger)
6613 ワード
Android学習ノートのサービス通信(Messenger)
1.activityはbindServiceメソッドを使用してサービスとの接続を確立し、sMessengerを使用してサーバObserverServiceにメッセージを送信する
2、ServerObserverService継承サービス
3、サービスの中のonBindメソッドを書き直し、サービスの中のsMessengerはIBinderを得る.これにバインドされたactivityのonServiceConnectedメソッドでは、このIBinderを使用してactivityのsMessengerをインスタンス化します.このsMessengerを使用してサービスにメッセージを送信します.(messageはreplytoで応答するMessengerであるcMessengerを指定した)
4、このときseriveのsMessengerにはmessage情報があり、またsMessengerはhandleMessageのHandlerを書き換えることによって確立される.したがってhandleMessageはmessageを処理することができる.
5、サービスはhandlerのhandleMessageで処理したメッセージ、
(このメッセージは応答するMessengerにcMessengerに付与することを教えてくれた)
応答を生成するMessage mは、cMessengerを介してactivityに送信される.
//serviceとactivityではhandlerMessageで受信したメッセージを処理しているが,以上のactivityはclientと理解できる.
//このロジックは本当に人をやっているので、私も私がこのように理解しているかどうか分かりません.今の感じは大丈夫です.ご指摘を歓迎します.
Service
acticity
Manifestにservicceを登録する必要があります
1.activityはbindServiceメソッドを使用してサービスとの接続を確立し、sMessengerを使用してサーバObserverServiceにメッセージを送信する
2、ServerObserverService継承サービス
private MyHandler cMeeeengerHandler = new MyHandler();
private Messenger sMessenger = new Messenger( cMeeeengerHandler);)
3、サービスの中のonBindメソッドを書き直し、サービスの中のsMessengerはIBinderを得る.これにバインドされたactivityのonServiceConnectedメソッドでは、このIBinderを使用してactivityのsMessengerをインスタンス化します.このsMessengerを使用してサービスにメッセージを送信します.(messageはreplytoで応答するMessengerであるcMessengerを指定した)
4、このときseriveのsMessengerにはmessage情報があり、またsMessengerはhandleMessageのHandlerを書き換えることによって確立される.したがってhandleMessageはmessageを処理することができる.
5、サービスはhandlerのhandleMessageで処理したメッセージ、
(このメッセージは応答するMessengerにcMessengerに付与することを教えてくれた)
応答を生成するMessage mは、cMessengerを介してactivityに送信される.
//serviceとactivityではhandlerMessageで受信したメッセージを処理しているが,以上のactivityはclientと理解できる.
//このロジックは本当に人をやっているので、私も私がこのように理解しているかどうか分かりません.今の感じは大丈夫です.ご指摘を歓迎します.
Service
package es.source.code.service;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
public class ServerObserverService extends Service {
private static final String Tag = "ServerObserverService";
public Messenger cMessenger;
private MyHandler cMeeeengerHandler = new MyHandler();
public Messenger sMessenger = new Messenger( cMeeeengerHandler);
private class MyHandler extends Handler{
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
switch(msg.what){
case 1:
//
System.out.println("Msg_Food_Get_Start");
System.out.println("service: message 1 ");
try {
for(int i = 3; i > 0; i--) {
Thread.sleep(300);
Message m = getFoodInfo();
System.out.println(m.what);
System.out.println(m.getData().get("name"));
System.out.println(m.getData().get("storage"));
cMessenger = msg.replyTo;
try {
cMessenger.send(m);
System.out.println(" ");
} catch (RemoteException e) {
e.printStackTrace();
}
}
}catch(InterruptedException e){
e.printStackTrace();
}
break;
case 0:
Thread.interrupted();
System.out.println("Msg_Food_Get_Stop");
System.out.println("service: message 0 ");
//
break;
default:
}
}
}
@Override
public IBinder onBind(Intent intent){
Log.w("TAG", "Service is binded");
return sMessenger.getBinder();
}
public Message getFoodInfo(){
Message m = Message.obtain();
Bundle bundle = new Bundle();
bundle.putString("name", "new food");
int storage = (int)(Math.random()*20);
bundle.putInt("storage", storage);
m.setData(bundle);
m.what = 10;
return m;
}
acticity
Messenger cMessenger = new Messenger(new MyHandler());
Messenger sMessenger;
private class MyHandler extends Handler{
@Override
//
public void handleMessage(final Message msg){
if(msg.what == 10){
System.out.println("fv: ");
String name = (String)msg.getData().get("name");
int storage = (int)msg.getData().get("storage");
Intent toUpdate = new Intent(FoodView.this, UpdateService.class);
toUpdate.putExtra("new food", msg.getData());
startService(toUpdate);
}
}
};
private ServiceConnection mConnection = new ServiceConnection() {
@Override
// service IBinder。 sMessenger, sMessenger
// service
// message replyto cMessenger, cMessenger handler , handler service
public void onServiceConnected(ComponentName name, IBinder service) {
sMessenger = new Messenger(service);
System.out.println("fv:connected");
}
@Override
public void onServiceDisconnected(ComponentName name) {
sMessenger = null;
System.out.println("fv:disconnected");
}
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.food_view_2);
Intent bs = new Intent(this, ServerObserverService.class);
bindService(bs, mConnection, Context.BIND_AUTO_CREATE);
}
//
case R.id.action_service_start:
String transto = " ";
Message message = Message.obtain();
if(item.getTitle().toString().equals(" ")){
item.setTitle(" ");
message.what = 1;
Bundle bundle = new Bundle();
bundle.putString("toService",transto);
message.setData(bundle);
message.replyTo = cMessenger;
try{
sMessenger.send(message);
System.out.println("fv: ed!");
}catch(RemoteException e){
e.printStackTrace();
}
System.out.println(" ");
}else{
item.setTitle(" ");
System.out.println(" ");
message.what = 0;
Bundle bundle = new Bundle();
bundle.putString("toService",transto);
message.setData(bundle);
message.replyTo = cMessenger;
try{
sMessenger.send(message);
System.out.println("fv: ed!");
}catch(RemoteException e){
e.printStackTrace();
}
}
break;
Manifestにservicceを登録する必要があります