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 }
  • 相关阅读:
    cmanformat
    mysql-sql语言参考
    jQuery 判断多个 input checkbox 中至少有一个勾选
    Java实现 蓝桥杯 算法提高 计算行列式
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
  • 原文地址:https://www.cnblogs.com/hustcser/p/10362183.html
Copyright © 2011-2022 走看看