zoukankan      html  css  js  c++  java
  • Android

    之前看了一篇,然后不自己动手肯定是不行的,然后自己又写了一遍。

    背景:

    一般使用messenger进行进程间通信的时候,我们只能进行单方向通信。但是有没有办法让服务器端和客户端进行双向通信呢?

    解决思路:

    在第一次消息交互的时候,将客户端的消息队列作为一个对象传给服务端,让服务端取到客户端的消息队列。这样就可以实现双向通信了。

    代码如下:

    需要注意的是,远程绑定service的地方,需要加上包名,不要忘记。 

    重点关注红色部分,其余的地方没有什么好说的啦。

    服务端代码

     1 package com.example.xxx.server_testmsger;
     2 
     3 import android.support.v7.app.AppCompatActivity;
     4 import android.os.Bundle;
     5 
     6 public class MainActivity extends AppCompatActivity {
     7 
     8     @Override
     9     protected void onCreate(Bundle savedInstanceState) {
    10         super.onCreate(savedInstanceState);
    11         setContentView(R.layout.activity_main);
    12     }
    13 }
     1 package com.example.xxx.server_testmsger;
     2 
     3 import android.app.Service;
     4 import android.content.Intent;
     5 import android.media.MediaRecorder;
     6 import android.os.Handler;
     7 import android.os.IBinder;
     8 import android.os.Message;
     9 import android.os.Messenger;
    10 import android.os.RemoteException;
    11 import android.util.Log;
    12 
    13 public class serverService extends Service {
    14     private static final int MSG_WHAT = 1;
    15     private static final int REQUEST_KEYEVENT = 1;
    16     private static final int MSG_TOCLIENT = 2;
    17     private static final int REQUEST_KEYEVENT_TOCLIENT = 2;
    18     private Messenger mMessenger_from_client = null;
    19 
    20     public serverService() {
    21     }
    22 
    23     private Messenger mMessager = new Messenger(new Handler() {
    24         @Override
    25         public void handleMessage(Message msg) {
    26             Log.d("Server MSG", "handleMessage()");
    27             super.handleMessage(msg);
    28 
    29             mMessenger_from_client = (Messenger)msg.obj;
    30             Message message = msg.obtain(msg);
    31             Log.d("Server MSG", message.toString());
    32             switch (message.what) {
    33                 case MSG_WHAT:
    34                     Message msgToClient = new Message();
    35                     msgToClient.what=MSG_TOCLIENT;
    36                     msgToClient.arg1=REQUEST_KEYEVENT_TOCLIENT;
    37                     try {
    38                         Log.d("Server MSG", "sending message....");
    39                         mMessenger_from_client.send(msgToClient);
    40                     } catch (RemoteException e) {
    41                         e.printStackTrace();
    42                     }
    43                     break;
    44                 default:
    45                     break;
    46             }
    47         }
    48 
    49     });
    50 
    51     @Override
    52     public IBinder onBind(Intent intent) {
    53         return mMessager.getBinder();
    54     }
    55 }

    客户端代码

     1 package com.example.xxx.client_testmsger;
     2 
     3 import android.content.ComponentName;
     4 import android.content.Context;
     5 import android.content.Intent;
     6 import android.content.ServiceConnection;
     7 import android.os.Handler;
     8 import android.os.IBinder;
     9 import android.os.Message;
    10 import android.os.Messenger;
    11 import android.os.RemoteException;
    12 import android.support.v7.app.AppCompatActivity;
    13 import android.os.Bundle;
    14 import android.util.Log;
    15 import android.view.ContextThemeWrapper;
    16 import android.view.View;
    17 import android.widget.Button;
    18 
    19 import java.io.InputStream;
    20 
    21 public class MainActivity extends AppCompatActivity {
    22     private Messenger mMessenger = null;
    23     private Messenger mServiceMessenger = null;
    24     private Intent serviceIntent;
    25     private static final int MSG_WHAT = 1;
    26     private static final int REQUEST_KEYEVENT = 1;
    27     private static final int MSG_TOCLIENT = 2;
    28     private static final int REQUEST_KEYEVENT_TOCLIENT = 2;
    29 
    30     private Handler mHandler = new Handler() {
    31         @Override
    32         public void handleMessage(Message msg) {
    33             super.handleMessage(msg);
    34             switch (msg.what) {
    35                 case MSG_TOCLIENT:
    36                     Log.e("Client MSG","got Message from server");
    37                     Log.e("Client MSG",msg.toString());
    38                     break;
    39                 default:
    40                     break;
    41             }
    42         }
    43     };
    44     @Override
    45     protected void onCreate(Bundle savedInstanceState) {
    46         super.onCreate(savedInstanceState);
    47         setContentView(R.layout.activity_main);
    48 
    49         serviceIntent = new Intent();
    50         serviceIntent.setComponent(new ComponentName("com.example.xxx.server_testmsger","com.example.xxx.server_testmsger.serverService"));
    51         bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);
    52         mMessenger = new Messenger(mHandler);
    53     }
    54 
    55     private ServiceConnection mConnection = new ServiceConnection() {
    56         @Override
    57         public void onServiceConnected(ComponentName name, IBinder service) {
    58             Log.e("MSG","MainActivity Start");
    59             Log.d("Client MSG", "onServiceConnected()");
    60             if (service == null) {
    61                 mServiceMessenger = null;
    62             } else {
    63                 mServiceMessenger = new Messenger(service);
    64                 Message message = new Message();
    65                 message.what = MSG_WHAT;
    66                 message.arg1 = REQUEST_KEYEVENT;
    67                 message.obj = mMessenger;
    68                 try {
    69                     Log.d("Client MSG", "Message send()");
    70                     mServiceMessenger.send(message);
    71                 } catch (RemoteException e) {
    72                     e.printStackTrace();
    73                 }
    74             }
    75         }
    76 
    77         @Override
    78         public void onServiceDisconnected(ComponentName name) {
    79             Log.d("Client MSG", "onServiceDisconnected()");
    80             mServiceMessenger = null;
    81         }
    82     };
    83 
    84     @Override
    85     public void onDestroy() {
    86         super.onDestroy();
    87         unbindService(mConnection);
    88     }
    89 }
  • 相关阅读:
    poj_1084 剪枝-IDA*
    搜索算法
    poj_1475 BFS+BFS
    chrome浏览器经常无响应
    charles抓包工具的使用:手机抓包设置和安装证书
    charles抓包工具的使用:概述
    不同局域网如何利用charles对app进行抓包
    fiddler之使用教程(一)
    一点感触
    单元测试框架处理多组数据的另一种写法:基于构造函数和超继承
  • 原文地址:https://www.cnblogs.com/hustcser/p/10362183.html
Copyright © 2011-2022 走看看