Android信使Messenger范例源码

Messenger是Android提供的一个工具类,主要为了简化进程间通信的功能。使用Messenger就可以避免编写AIDL文件来进行进程间通信。Messenger和Handler一起配合完成任务。其中Messenger主要用来将服务端和客户端的两个信使关联到一起,而Handler则用来完成具体功能。

具体代码如下:
http://download.csdn.net/detail/logicteamleader/9426067

服务端的Messenger需要在onBind方法中返回IBinder实例,例如:

    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }

客户端则需要在如下代码中创建与之关联的客户端Messenger:

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 得到了一个binder作为桥梁,创建客户端的信使
            messenger = new Messenger(service);
        }

两边的信使通过IBinder实例关联起来后,就可以通过send方法来互相发送消息了。
如果需要回调,则将另一个Messenger放到Message的replayTo属性中发送给另一端,由另一端来执行回调函数。

服务端代码:

package com.dumaisoft.wxbmessengertest;

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.widget.Toast;

public class MessengerService extends Service {
    public static final int WXB_MSG_SERVER_1 = 0x0001;
    public static final int WXB_MSG_SERVER_CALLBACK = 0x0000;
    private Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            switch(msg.what){
            case WXB_MSG_SERVER_1:
                Toast.makeText(MessengerService.this, "WXB_MSG_1 in Server", Toast.LENGTH_LONG).show();
                break;
            case WXB_MSG_SERVER_CALLBACK:
                //构造消息,进行回调,让客户端信使的Handler来执行
                Message message = Message.obtain();
                message.what = MainActivity.WXB_MSG_CLIENT_1;
                try {
                    msg.replyTo.send(message);
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                break;
            }

            super.handleMessage(msg);
        }

    };
    private Messenger messenger = new Messenger(handler);

    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }
}

客户端代码:

package com.dumaisoft.wxbmessengertest;

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.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    public static final int WXB_MSG_CLIENT_1 = 0x0010;

    private Button btnBind, btnUnbind, btnMessage,btnCallback;
    private TextView tv; 
    private boolean isBind = false;
    private Messenger messenger;

    //clientMessenger的handler
    private Handler clientHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == WXB_MSG_CLIENT_1){
                Toast.makeText(MainActivity.this, "WXB_MSG_CLIENT_1 in Client", Toast.LENGTH_LONG).show();
            }
            super.handleMessage(msg);
        }
    };
    //用来在客户端回调服务端请求的Messenger
    private Messenger clientMessenger = new Messenger(clientHandler);

    private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 得到了一个binder作为桥梁,创建客户端的信使
            messenger = new Messenger(service);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) this.findViewById(R.id.tvBind);
        btnBind = (Button) this.findViewById(R.id.bindBtn);
        btnBind.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent service = new Intent();
                service.setClass(MainActivity.this, MessengerService.class);
                bindService(service, connection, Context.BIND_AUTO_CREATE);
                isBind = true;
                tv.setText("Service is bind");
            }
        });

        btnUnbind = (Button) this.findViewById(R.id.unbindBtn);
        btnUnbind.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                unbindService(connection);
                isBind = false;
                tv.setText("Service is unbind");
            }
        });

        btnMessage = (Button) this.findViewById(R.id.msgBtn);
        btnMessage.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (isBind) {
                    Message msg = Message.obtain();
                    msg.what = MessengerService.WXB_MSG_SERVER_1;

                    try {
                        messenger.send(msg);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        btnCallback = (Button) this.findViewById(R.id.callbackBtn);
        btnCallback.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (isBind) {
                    Message msg = Message.obtain();
                    msg.what = MessengerService.WXB_MSG_SERVER_CALLBACK;
                    //设置回调的信使
                    msg.replyTo = clientMessenger;
                    try {
                        messenger.send(msg);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
}

layout代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.dumaisoft.wxbmessengertest.MainActivity" >

    <TextView
        android:id="@+id/tvBind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="service is unbind" />

    <Button
        android:id="@+id/bindBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:text="bind" />

    <Button
        android:id="@+id/unbindBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/bindBtn"
        android:layout_below="@+id/bindBtn"
        android:text="unbind" />

    <Button
        android:id="@+id/msgBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/unbindBtn"
        android:text="message" />

    <Button
        android:id="@+id/callbackBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/msgBtn"
        android:layout_below="@+id/msgBtn"
        android:text="callback" />

</RelativeLayout>

Manifest代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dumaisoft.wxbmessengertest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="20" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="MessengerService" android:process=":remote">
            <intent-filter>
                <action android:name="com.dumaisoft.wxbmessengertest"/>
            </intent-filter>
        </service>
    </application>

</manifest>

最后说明:为了简单起见,我把服务端和客户端做到一个app中了。如果分开做,则需要使用Service的Action来定位远程服务并连接。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值