Android学習ノートのサービス通信(Messenger)

6613 ワード

Android学習ノートのサービス通信(Messenger)
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を登録する必要があります