Service练习——通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)

通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)

步骤:

服务端
1、在Service中创建一个Handler对象,用于处理消息
2、在Service中创建一个Messenger对象,并绑定Handler
3、在onBind方法中通过Messenger.getBinder方法返回绑定的对象
客户端
4、通过bindService来绑定一个服务,在提供的ServiceConnection对象的onServiceConnected方法中,
通过IBinder参数来创建Messenger对象,这样客户端与服务端就使用同一个IBinder
5、客户端向服务端发送消息,通过Messenger的send方法发送一个Message对象
6、以上可实现客户端到服务端的单向通讯,如需要实现双向通讯:
(1)在客户端再创建一个Messenger对象,并绑定一个Handler来处理消息
(2)在向服务端发送消息对象(Message)时,使用replyTo属性指定服务端可向客户端回复消息的Messenger对象,
这样,服务端就可以利用replyTo向客户端发送消息。

新建一个服务端(Service)

 1 package com.example.service_messenges;

 2 

 3 import android.annotation.SuppressLint;

 4 import android.app.Service;

 5 import android.content.Intent;

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

12 

13 public class MessengesService extends Service {

14 

15     public static final int SAY_MSG = 0x1;

16     // 创建一个信使对象,并绑定信使处理器,由信使处理器来处理

17     private Messenger m = new Messenger(new InComingHandler());

18 

19     // 用来操作msg的handler

20     @SuppressLint("HandlerLeak")

21     class InComingHandler extends Handler {

22 

23         @Override

24         public void handleMessage(Message msg) {

25             super.handleMessage(msg);

26             switch (msg.what) {

27             case SAY_MSG:

28                 String name = msg.obj.toString();

29                 Toast.makeText(MessengesService.this, "我是" + name + ",我为自己带盐",

30                         Toast.LENGTH_SHORT).show();

31                 // 当我需要返回一个值的时候就再写一个信件给信使

32 

33                 Message m = Message.obtain();

34                 m.what = SAY_MSG;

35                 m.obj = "我是" + name + ",我为自己带盐";

36                 try {

37                     msg.replyTo.send(m);

38                 } catch (RemoteException e) {

39                     // TODO Auto-generated catch block

40                     e.printStackTrace();

41                 }

42                 break;

43 

44             default:

45                 break;

46             }

47 

48         }

49 

50     }

51 

52     // 绑定m

53     @Override

54     public IBinder onBind(Intent arg0) {

55         return m.getBinder();

56     }

57 

58 }

 

然后在清单文件中进行注册

1  <service android:name="com.example.service_messenges.MessengesService"></service>

 

接着在客户端中

 1 package com.example.service_messenges;

 2 

 3 import android.os.Bundle;

 4 import android.os.Handler;

 5 import android.os.IBinder;

 6 import android.os.Message;

 7 import android.os.Messenger;

 8 import android.os.RemoteException;

 9 import android.app.Activity;

10 import android.content.ComponentName;

11 import android.content.Context;

12 import android.content.Intent;

13 import android.content.ServiceConnection;

14 import android.view.View;

15 import android.widget.EditText;

16 import android.widget.Toast;

17 

18 public class MainActivity extends Activity {

19 

20     private Messenger m;

21     private boolean mBound = false;

22     private EditText et;

23 

24     @Override

25     protected void onCreate(Bundle savedInstanceState) {

26         super.onCreate(savedInstanceState);

27         setContentView(R.layout.activity_main);

28         et = (EditText) findViewById(R.id.editText1);

29     }

30     private Handler handler=new Handler(){

31         public void handleMessage(Message msg){

32             switch (msg.what) {

33             case MessengesService.SAY_MSG:

34                 String info="这是传递来的→"+msg.obj.toString();

35                 Toast.makeText(MainActivity.this, info,Toast.LENGTH_SHORT).show();

36                 break;

37             default:

38                 break;

39             }

40         };

41     };

42     private Messenger mReplyTo = new Messenger(handler);

43 

44     public void msgClick(View v) {

45         // 这样的效率高

46         Message msg = Message.obtain();

47         msg.what = MessengesService.SAY_MSG;

48         String name = et.getText().toString();

49         msg.obj = name;

50         msg.replyTo=mReplyTo;

51         try {

52             m.send(msg);

53         } catch (RemoteException e) {

54             e.printStackTrace();

55         }

56 

57     }

58 

59     private ServiceConnection conn = new ServiceConnection() {

60 

61         @Override

62         public void onServiceDisconnected(ComponentName arg0) {

63             // 这里是失败了

64             mBound = false;

65             m = null;

66         }

67 

68         @Override

69         public void onServiceConnected(ComponentName arg0, IBinder arg1) {

70             // 这里是成功了

71 

72             m = new Messenger(arg1);

73         }

74     };

75 

76     @Override

77     protected void onStart() {

78         super.onStart();

79 

80         Intent intent = new Intent(this, MessengesService.class);

81         bindService(intent, conn, Context.BIND_AUTO_CREATE);

82         mBound = true;

83     }

84 

85     @Override

86     protected void onStop() {

87         super.onStop();

88 

89         if (mBound) {

90             mBound = false;

91             unbindService(conn);

92         }

93     }

94 

95 }

总结:Service是一个应用程序组件,可以长时间在后台运行,不提供用户界面

   通过绑定(bind)一个服务来实现进程间的通讯(IPC通讯)

你可能感兴趣的:(service)