Android 多进程通信之Messenger

来源:互联网 发布:nginx 多个location 编辑:程序博客网 时间:2024/04/29 22:13

多进程通信有:ContentProvider、广播、文件、SharedPreferences、AIDL。
Messenger能实现多进程通信是因为Messenger底层就是AIDL实现的。
主进程MainActivity:

public class MainActivity extends AppCompatActivity {    private boolean isConnect = false;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Intent intent = new Intent(this,MyService.class);        bindService(intent,connection,BIND_AUTO_CREATE);        findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Message msg = Message.obtain(null,1);                Bundle bundle = new Bundle();                bundle.putString("data","来自主进程信息");                msg.setData(bundle);                msg.replyTo = mMessenger;                try {                    if (isConnect)                        serviceMsg.send(msg);                } catch (RemoteException e) {                    e.printStackTrace();                }            }        });    }    private Messenger serviceMsg;    private ServiceConnection connection = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            serviceMsg = new Messenger(service);            isConnect = true;        }        @Override        public void onServiceDisconnected(ComponentName name) {            isConnect = false;        }    };    private Messenger mMessenger = new Messenger(new Handler() {        @Override        public void handleMessage(Message msg){            Log.e("Activity",""+msg.getData().getString("data"));        }    });    @Override    protected void onDestroy() {        super.onDestroy();        unbindService(connection);    }}

remote进程的service:

public class MyService extends Service{    private final Messenger messenger = new Messenger(new Handler(){        @Override        public void handleMessage(Message msg) {            if (msg.what == 1) {                Log.e("Service",""+msg.getData().getString("data"));            }            try {                Thread.sleep(2000);                Bundle bundle = new Bundle();                bundle.putString("data","来自service的信息");                msg.setData(bundle);                msg.replyTo.send(msg);            } catch (InterruptedException e) {                e.printStackTrace();            } catch (RemoteException e) {                e.printStackTrace();            }        }    });    @Nullable    @Override    public IBinder onBind(Intent intent) {        return messenger.getBinder();    }}

AndroidManifest:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.flk.ipc">    <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=".MyService"            android:process=":remote"/>    </application></manifest>
0 0
原创粉丝点击