赞
踩
Messenger 类实现了 Parcelable 接口,用于进程间传输并处理消息,调用流程如下:
本文全部代码见→使用Messenger实现进程间通讯
(1)创建服务
MyService.java
- package com.example.msger_s;
-
- import android.app.Service;
- import android.content.Intent;
- 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 MyService extends Service {
- Messenger messenger_c; //客户端的Messenger
-
- @Override
- public IBinder onBind(Intent intent) {
- return messenger_s.getBinder();
- }
-
- private Messenger messenger_s = new Messenger(new Handler() {
- @Override
- public void handleMessage(Message msg_c2s) {
- super.handleMessage(msg_c2s);
- receive(msg_c2s);
- messenger_c = msg_c2s.replyTo; //获取客户端的Messenger
- send();
- }
- });
-
- private void receive(Message msg) { //接收来自客户端的消息
- Bundle bundle = (Bundle) msg.obj;
- String msg_c2s = bundle.getString("msg_c2s");
- Log.e("MyService", "来自客户端的消息:" + msg_c2s);
- }
-
- private void send() { //给客户端返回消息
- Message msg = new Message();
- Bundle bundle1 = new Bundle();
- bundle1.putString("msg_s2c", "hello client");
- msg.obj = bundle1;
- try {
- messenger_c.send(msg);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
- }
(2)注册服务
在 AndroidManifest.xml 文件中 application 节点下注册 service,如下。
- <service
- android:name=".MyService"
- android:exported="true">
- <intent-filter>
- <action android:name="com.xxx.msger_s"/>
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </service>
(3)主 Activity
MainActivity.java
- package com.example.msger_s;
-
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
-
- public class MainActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- }
(1)设计布局
activity_main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout 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"
- android:orientation="vertical"
- tools:context="com.example.msger_c.MainActivity">
-
- <EditText
- android:id="@+id/et_send"
- android:layout_width="match_parent"
- android:layout_height="80dp"
- android:text="hello service"
- android:textSize="30dp"
- android:background="#ffcc66"/>
-
- <Button
- android:id="@+id/btn_send"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_marginTop="30dp"
- android:textSize="30sp"
- android:text="发送"/>
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="返回的消息:"
- android:textSize="30sp"
- android:layout_marginTop="100dp"/>
-
- <TextView
- android:id="@+id/tv_receive"
- android:layout_width="match_parent"
- android:layout_height="80dp"
- android:textSize="30sp"
- android:background="#ffcc66"
- android:layout_marginTop="20dp"/>
- </LinearLayout>
界面如下:
(2)主 Activity
MainActivity.java
- package com.example.msger_c;
-
- 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.support.v7.app.AppCompatActivity;
- import android.view.View;
- import android.view.inputmethod.InputMethodManager;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.TextView;
-
- public class MainActivity extends AppCompatActivity {
- private Messenger messenger_s; //服务端的Messenger
- private EditText et_send;
- private Button btn_send;
- private TextView tv_receive;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- init();
- }
-
- private void init() {
- et_send = (EditText) findViewById(R.id.et_send);
- btn_send = (Button) findViewById(R.id.btn_send);
- tv_receive = (TextView) findViewById(R.id.tv_receive);
- btn_send.setOnClickListener(cl);
- }
-
- View.OnClickListener cl = new View.OnClickListener(){
- @Override
- public void onClick(View v) {
- hideInputMethod(MainActivity.this, v); //关闭输入法
- if (v.getId()==R.id.btn_send) {
- String msg_c2s = et_send.getText().toString();
- sendMsg(msg_c2s);
- }
- }
- };
-
- private void sendMsg(String msg_c2s){
- if (messenger_s==null) {
- attemptToBindService();
- }
- Message msg = new Message();
- Bundle bundle = new Bundle();
- bundle.putString("msg_c2s",msg_c2s);
- msg.obj = bundle;
- msg.replyTo = messenger_c; //将客户端的Messenger传给服务端
- try {
- messenger_s.send(msg);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
-
- private Messenger messenger_c = new Messenger(new Handler() { //客户端的Messenger
- @Override
- public void handleMessage(Message msg) { //处理服务端返回的消息
- super.handleMessage(msg);
- Bundle bundle = (Bundle) msg.obj;
- String msg_s2c = bundle.getString("msg_s2c");
- tv_receive.setText(msg_s2c);
- }
- });
-
- private void attemptToBindService() {
- Intent intent = new Intent();
- intent.setAction("com.xxx.msger_s");
- intent.setPackage("com.example.msger_s");
- bindService(intent, conn, Context.BIND_AUTO_CREATE);
- }
-
- ServiceConnection conn = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- messenger_s = new Messenger(service); //获取服务端的Messenger
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- messenger_s = null;
- }
- };
-
- private void hideInputMethod(Activity act, View v) { //关闭输入法
- InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(v.getWindowToken(),0);
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- if (messenger_s==null) {
- attemptToBindService();
- }
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- if (messenger_s!=null) {
- unbindService(conn);
- }
- }
- }
点击【发送】按钮,在服务端可以收到发送的消息,如下:
在客户端收到回复如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。