"activity和service通信"-三大方法之-使用Messenger(信使,信差)

Messenger,翻译过来就是信使,信差的意思

重要作用:

  • 能用来发送Message
  • 用都能加入到Message,所以轻松完成本篇所讲内容.

Activity->Service

一.我们先来讲Activity如何通过信差Message发送给Service

服务类 :Service:

  • 1.在服务创建一个Handler用来接收Activity的消息
private class ActivityComingHander extends Handler {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == 1) {
            System.out.println("收到Activity的消息1");
        }
        if (msg.what == 2) {
            System.out.println("收到Activity的消息2");
        }
        super.handleMessage(msg);
    }
}
  • 2.在服务里创建信差对象,构造传入(handler类)
//信使,信差
Messenger msng = new Messenger(new ActivityComingHander());
  • 3.onBind()里面return的是信差对象.获取绑定:msng.getBinder();
@Nullable
@Override
public IBinder onBind(Intent intent) {
    //返回信差的绑定
    return msng.getBinder();
}

Activity 里的操作:

  • 1.在服务连接ServiceConnection里面获取信差,等下就能发信息了
public void onServiceConnected(ComponentName name, IBinder binder) {
    //获取信差,创建,构造传入IBinder
    messenger = new Messenger(binder);
}
  • 2.创建信息Message对象,定义标记,内容
  • 3.“信差对象”发送即可
Message msg = new Message();
    msg.what = 1;        
    try {        
        messenger.send(msg);     
    } catch (RemoteException e) {
        e.printStackTrace();     
}           

第二种:
Service->Activity

一.现在是Service把Message发送给Activity.

(PS:逻辑就是,Activity 新建信差,并通过连接信差新信差传给服务,服务得到新信差后用新信差发送信息那么Activity的handler就能收到消息了)


和上边原理一样

想在Activity收到,那么就在Activity创建Handlder接受服务的Message

  • 1.Activity创建一个hanlder,接收服务的Message
  • 2.创建一个信差,目的是把这个信差发送给服务(通过msg.obj),构造也是传入:hanlder
/*--------------处理服务发送过来的消息--------------*/
//创建信差,传入handler对象.
Messenger mMessenger = new Messenger(new ServiceComingHander());
//hanlder,接收服务的Message
private class ServiceComingHander extends Handler {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == 3)
            Toast.makeText(MainActivity.this, "收到来自服务的消息", Toast.LENGTH_SHORT).show();
        super.handleMessage(msg);
    }
}
  • 3.”刚才和服务连接的信差“,发送消息(msg-已经有了此时的信差);相当于信差发送带了信差的消息
public void onClick(View v) {
   Message msg = new Message();
    msg.what = 2;
    //把信差对象放入消息
    msg.obj = mMessenger;
    try {
        //"和服务连接的信差"发送消息.
        messenger.send(msg);
    } catch (RemoteException e)
        e.printStackTrace();
    }
}
  • 4.服务器得到obj获取Activiy信差,然后创建消息,信差发送消息即可.
if (msg.what == 2) {
    //获取Activity发送过来的信差
    mMessenger = (Messenger) msg.obj;
    //定义消息和标记,等下发给Activity
    final Message msgg = new Message();
    msgg.what = 3;

    try {
        //服务给Activity发送消息
         mMessenger.send(msgg);
    } catch (RemoteException e) {
         e.printStackTrace();
    }
}   

下面是全部的Activity和Service交互的代码

界面有3个按钮 bind,send,send2

  • bind:是绑定,且获得服务返回的信差

  • send:是给服务发送消息,因为刚刚和服务建立了信差,通过信差给服务发消息

  • send2:在send的基础上添加标记,并发送一个新信差,让服务得到新信差,服务就能通过新信差发送消息给Activity

需求:

  • 1.Activity给服务发送两个消息,服务根据消息不同弹吐司;
  • 2.消息1立即弹,消息2收到两秒后弹
  • 3.收到消息2后再过1秒服务就给Activity发消息,然后Activity谈吐司

MainActivity.java

package goodjobtome.com.lrucechepic;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
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.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    private Button bind;
    private Button send;
    private Button send2;

    private Messenger messenger;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bind = (Button) findViewById(R.id.bindButton);
        send = (Button) findViewById(R.id.sendButton);
        send2 = (Button) findViewById(R.id.sendButton2);

        bind.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MessengerService.class);
                bindService(intent, new ServiceConnection() {
                    @Override
                    public void onServiceConnected(ComponentName name, IBinder binder) {
                        //绑定且获得信差
                        messenger = new Messenger(binder);
                    }
                    @Override
                    public void onServiceDisconnected(ComponentName arg0) {
                    }
                }, Context.BIND_AUTO_CREATE);
            }
        });

        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Message msg = new Message();
                msg.what = 1;
                try {
                    messenger.send(msg);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
        send2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Message msg = new Message();
                msg.what = 2;
                //把信差对象放入消息
                msg.obj = mMessenger;
                try {
                    //和服务连接的信差发送消息.
                    messenger.send(msg);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /*--------------处理服务发送过来的消息--------------*/
    //创建信差,传入handler对象.
    Messenger mMessenger = new Messenger(new ServiceComingHander());

    private class ServiceComingHander extends Handler {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 3)
                Toast.makeText(MainActivity.this, "收到来自服务的消息", Toast.LENGTH_SHORT).show();
            super.handleMessage(msg);
        }
    }
}

MessengerService.java

package goodjobtome.com.lrucechepic;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.widget.Toast;

public class MessengerService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        //返回信差的绑定
        return msng.getBinder();

    }

    //信使,信差
    Messenger msng = new Messenger(new ActivityComingHander());

    private class ActivityComingHander extends Handler {
        Handler mHandler = new Handler();

        Messenger mMessenger;

        @Override
        public void handleMessage(final Message msg) {
            if (msg.what == 1) {
                Toast.makeText(MessengerService.this, "Activity发过来信息-标记是1", Toast.LENGTH_SHORT).show();
            }
            if (msg.what == 2) {
                //获取Activity发送过来的信差
                mMessenger = (Messenger) msg.obj;
                //定义消息和标记,等下发给Activity
                final Message msgg = new Message();
                msgg.what = 3;

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        SystemClock.sleep(2000);
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MessengerService.this, "Activity发过来信息-标记是2", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                }).start();
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //三秒后服务给Activity发送消息
                        SystemClock.sleep(3000);
                        try {
                            mMessenger.send(msgg);
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
                super.handleMessage(msg);
            }
        }
    }
}

总结:

原理图如下:

这里写图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值