Skip to content

跨进程事件IPCDispatcher与IPCObservable

Albie Liang edited this page May 23, 2020 · 7 revisions

实现跨进程事件Dispatcher

public class OnClickEventDispatcher extends IPCDispatcher<Bundle> {
}

因为在做跨进程事件分发时使用的是Dispatcher的class name作为key所以dispatcher只需要继承IPCDispatcher即可。

使用IPCObservable注册跨进程事件监听

注册跨进程事件监听

final IPCObserver<Bundle> observer1 = new IPCObserver<>() {
    @Override
    public void onCallback(final Bundle data) {
        String log = String.format("register observer by Observable, onCallback(%s),
        		cost : %s", data.getString("result"),
        		(System.nanoTime() - data.getLong("timestamp")) / 1000000.0d);
        Log.i(TAG, log);
    }
};
IPCObservable<Bundle> observable = new IPCObservable<>("cc.suitalk.ipcinvoker.sample:push", OnClickEventDispatcher.class);
// 注册跨进程事件监听
observable.registerIPCObserver(observer1);

反注册跨进程事件监听

// 反注册跨进程事件监听
observable.unregisterIPCObserver(observer1)

发布跨进程事件

发布Bundle事件

OnClickEventDispatcher dispatcher = new OnClickEventDispatcher();

Bundle event = new Bundle();
event.putString("result", String.format("processName : %s, pid : %s",
		IPCInvokeLogic.getCurrentProcessName(), android.os.Process.myPid()));
event.putLong("timestamp", System.nanoTime())

dispatcher.dispatch(event);

发布自定义数据结构的跨进程事件

发布自定义数据结构的跨进程事件,该数据结构需要实现IPCData接口(如:IPCSampleData)

实现自定义跨进程事件

public class IPCSampleData implements IPCData {

    public String result;
    public long timestamp;

    @Override
    public Bundle toBundle() {
        Bundle bundle = new Bundle();
        bundle.putString("result", result);
        bundle.putLong("timestamp", timestamp);
        return bundle;
    }

    @Override
    public void fromBundle(Bundle bundle) {
        result = bundle.getString("result");
        timestamp = bundle.getLong("timestamp");
    }
}

注册远端事件监听

final IPCObserver<Bundle> observer1 = new IPCObserver<>() {
    @Override
    public void onCallback(final Bundle data) {
        IPCSampleData result = new IPCSampleData();
        result.fromBundle(data);
        String log = String.format("register observer by client, onCallback(%s), cost : %s",
                result.result, (System.nanoTime() - result.timestamp) / 1000000.0d);
        Log.i(TAG, log);
    }
};
IPCObservable<Bundle> observable = new IPCObservable<>("cc.suitalk.ipcinvoker.sample:push", OnClickEventDispatcher.class);
// 注册跨进程事件监听
observable.registerIPCObserver(observer1)

发布IPCSampleData事件

OnClickEventDispatcher dispatcher = new OnClickEventDispatcher();

IPCSampleData event = new IPCSampleData();
event.result = String.format("processName : %s, pid : %s", IPCInvokeLogic.getCurrentProcessName(), android.os.Process.myPid());
event.timestamp = System.nanoTime();

dispatcher.dispatch(event);
Clone this wiki locally