一、概述
本篇文章将和大家一起来学习AIDL实现跨进程更新UI。
需求是:在同一个应用中有两个Activity,MainActivity和TempActivity,这两个Activity不在同一个进程中。
现在需要通过TempActivity来改变MainActivity中的视图,即修改MainActivity中TextView的显示内容并且添加两个Button,也就是实现跨进程更新UI这么一个功能。
对于这种跨进程更新UI的需求我们可以通过AIDL或者BroadcastReceiver的方式实现,而本篇文章主要通过AIDL的方式实现,如果你对AIDL
还不熟悉的话可以先看看我的这篇文章:Android AIDL入门篇
二、实现效果图
在MainActivity里点击“跳转到新进程ACTIVITY”按钮,会启动一个新进程的TempActivity,我们先点击“绑定服务”,这样我们就启动了服务,再点击“AIDL更新”按钮,通过调用handler来实现跨进程更新UI,点击返回,我们发现MainActivity页面中的TextView内容已经更新了,并且新添加了两个按钮。
三、核心代码
IViewManager.aidl
里面提供了两个方法,一个是根据id更新TextView里面的内容,一个是根据id添加view视图
// IViewManager.aidl
package com.czhappy.remoteviewdemo;
// Declare any non-default types here with import statements
interface IViewManager {
void setTextViewText(in int id,in String text);//设置TextView的内容
void addView(in int layoutId); //添加View视图
}
rebuild project让IDE工具自己生成AIDL接口对应的java文件。
ViewAIDLService.java
package com.czhappy.remoteviewdemo.service;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import com.czhappy.remoteviewdemo.IViewManager;
import com.czhappy.remoteviewdemo.activity.MainActivity;
/**
* Description:
* User: chenzheng
* Date: 2017/2/9 0009
* Time: 16:00
*/
public class ViewAIDLService extends Service {
private static final String TAG = "ViewAIDLService";
private Binder viewManager = new IViewManager.Stub(){
@