Android跨进程通信一 Messenger
生活随笔
收集整理的這篇文章主要介紹了
Android跨进程通信一 Messenger
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
實現客戶端與服務端之間的交互
說明:
????????Messenger是信使的意思,從它的名字就可以了解到它充當著信差的角色。Android通過它實現跨進程通信,主要有客戶端信使與服務端信使兩種角色。
????????當客戶端調用bindService( )的時候,服務端會通過onBind( )方法將Ibinder傳遞給客戶端,然后客戶端通過ServiceConnection中的方法從Ibinder中獲得服務端的信使,客戶端可以通過服務端的信使把消息傳遞給服務端,最重要的一點是,客戶端可以講自己的信使即客戶端信使放入消息中一起傳遞到服務端中,這樣不僅可以從客戶端傳消息給服務端,還可以從服務端中返回信息給客戶端。
服務端Server.apk
配置文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.android.server" ><application android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name=".MessengerService"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.SERVICE"/><category android:name="android.intent.category.DEFAULT"/></intent-filter></service></application></manifest>布局
<?xml version="1.0" encoding="utf-8"?> <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:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin"tools:context=".MainActivity"><TextView android:text="服務端"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="100sp"android:layout_centerInParent="true"/></RelativeLayout>服務
package com.android.server;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;/*** 服務端*/ public class MessengerService extends Service {public static final int MSG_SUM = 1;public static final int MSG_RET = 2;public Messenger clientMessenger;public Messenger serverMessenger = new Messenger(new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what){case MSG_SUM:clientMessenger = msg.replyTo;Message message = Message.obtain(null,MSG_RET);message.arg1 = msg.arg1+msg.arg2;try {clientMessenger.send(message);} catch (RemoteException e) {e.printStackTrace();}break;default:handleMessage(msg);}}});@Overridepublic IBinder onBind(Intent intent) {return serverMessenger.getBinder();}@Overridepublic boolean onUnbind(Intent intent) {return true;}@Overridepublic void onRebind(Intent intent) {}}界面
package com.android.server;import android.support.v7.app.AppCompatActivity; import android.os.Bundle;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);} }客戶端apk
配置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.android.client" ><application android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme" ><activity android:name=".MainActivity" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>布局
<?xml version="1.0" encoding="utf-8"?> <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:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin"tools:context=".MainActivity"><EditText android:id="@+id/num1"android:layout_width="100dp"android:layout_height="wrap_content" /><TextView android:id="@+id/plus"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="+"android:layout_toRightOf="@id/num1"android:textSize="20sp"/><EditText android:id="@+id/num2"android:layout_width="100dp"android:layout_height="wrap_content"android:layout_toRightOf="@id/plus"/><TextView android:id="@+id/equal"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="="android:layout_toRightOf="@id/num2"android:textSize="20sp"/><EditText android:id="@+id/sum"android:layout_width="100dp"android:layout_height="wrap_content"android:layout_toRightOf="@id/equal"android:textSize="20sp"android:editable="false"/><Button android:id="@+id/calculate"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#ffffff"android:background="@color/colorPrimary"android:layout_marginTop="80dp"android:text="計算" /></RelativeLayout>界面
package com.android.client;import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast;public class MainActivity extends Activity implements View.OnClickListener {public static final int MSG_SUM = 1;public static final int MSG_RET = 2;public EditText num1;public EditText num2;public EditText sum;public Button btn;//客戶端信使public Messenger clientMessenger = new Messenger(new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what){case MSG_RET:sum.setText(msg.arg1+"");break;default:super.handleMessage(msg);}}});//服務端信使public Messenger serverMessenger;public ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {serverMessenger = new Messenger(service);}@Overridepublic void onServiceDisconnected(ComponentName name) {serverMessenger = null;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);num1 = (EditText) findViewById(R.id.num1);num2 = (EditText) findViewById(R.id.num2);sum = (EditText) findViewById(R.id.sum);btn = (Button) findViewById(R.id.calculate);//綁定服務Intent intent = new Intent();intent.setAction("android.intent.action.SERVICE");intent.setPackage("com.android.server");bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);btn.setOnClickListener(this);}@Overrideprotected void onDestroy() {super.onDestroy();unbindService(serviceConnection);}@Overridepublic void onClick(View v) {if(num1.getText().toString().equals("") || num2.getText().toString().equals("") ){Toast.makeText(this,"請輸入數值",Toast.LENGTH_SHORT).show();return;}Message message = Message.obtain(null,MSG_SUM,Integer.parseInt(num1.getText().toString()),Integer.parseInt(num2.getText().toString()));message.replyTo = clientMessenger;try {serverMessenger.send(message);} catch (RemoteException e) {e.printStackTrace();}} }總結
以上是生活随笔為你收集整理的Android跨进程通信一 Messenger的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android服务二 创建绑定服务
- 下一篇: Android开源框架——事件总线 Ev