Android仿广播通信实现简单的应用间service与activity之间的数据通信

xiaoxiao2021-02-28  92

在Android开发过程中,经常会用到activity与activity或activity与service直接传输数据,我们 可以通过广播或aidl等android系统的通信机制,但我们知道aidl在应用直接互相通信比较好用,同一个应用之内使用aidl通信就显得大材小用了,而广播在android中有个优先级顺序,系统framework层会给各种广播的重要级别排序,然后一个一个的发出,本来系统中就定义了很多广播,如果我们自己在去定义很多广播的话容易出现延时、漏发,混乱等意外情况,我就在想能不能通过自己定义一套和广播效果差不多的通信机制,在自己的程序里使用就不会和其他的冲突,还能保证速度的快捷性,好了,废话不多说,直接上代码。

1、首先先定义一个和广播接收类差不多的接收接口。 package com.example.main.impl;

import android.content.Intent;

public interface ContextReceiver { //收到通知回调 void onReceiver(Intent intent); }

2、用一个单例类保存注册的接收器和action。 package com.example.main.impl;

import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap;

import android.content.IntentFilter;

class ReceiverManager {

private static ReceiverManager mInstance; //线程安全的Map集合 private ConcurrentMap<ContextReceiver, List<String>> mCache; private ReceiverManager() { mCache = new ConcurrentHashMap<>(); } /** * 单例模式保住线程及数据安全 * @return */ public synchronized static ReceiverManager getInstance() { if (mInstance == null) { mInstance = new ReceiverManager(); } return mInstance; } /** * 保存接收器信息 * @param filter * @param receiver */ public void put(IntentFilter filter, ContextReceiver receiver) { List<String> actions = mCache.get(receiver); if (actions == null) { actions = new ArrayList<String>(); } Iterator<String> mIterator = filter.actionsIterator(); while (mIterator.hasNext()) { String action = (String) mIterator.next(); actions.add(action); } mCache.put(receiver, actions); } /** * 移除接收器信息 * @param receiver */ public void remove(ContextReceiver receiver) { mCache.remove(receiver); } /** * 获取缓存中的接收器 * @return */ public ConcurrentMap<ContextReceiver, List<String>> getCache() { return mCache; }

}

3、实现收发广播达到通信的效果。 package com.example.main.impl;

import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentMap;

import android.content.Intent; import android.content.IntentFilter;

public class Context {

public Context() { throw new UnsupportedOperationException( "not can't operation,fuck you !!!"); } /** * 发送通信action * * @param intent */ public static void sendAction(Intent intent) { ConcurrentMap<ContextReceiver, List<String>> cache = ReceiverManager .getInstance().getCache(); Set<ContextReceiver> receivers = cache.keySet(); for (ContextReceiver receiver : receivers) { List<String> actions = cache.get(receiver); for (String action : actions) { if (action.equals(intent.getAction())) { receiver.onReceiver(intent); } } } } /** * 注册接收器 * * @param filter * @param receiver */ public static void register(IntentFilter filter, ContextReceiver receiver) { ReceiverManager.getInstance().put(filter, receiver); } /** * 卸载注册接收器 * * @param receiver */ public static void unRegister(ContextReceiver receiver) { ReceiverManager.getInstance().remove(receiver); }

}

实现完成,使用时调用Context.register(IntentFilter filter, ContextReceiver receiver)方法注册接收器,不需要使用的地方调用Context.unRegister(ContextReceiver receiver)方法释放空间,在发送通知的地方调用Context.setAction(Intent intent);方法发送通知,在接受的地方实现ContextReceiver类就能在onReceiver回调中完成通信了。

哈哈,大功告成,几行代码完成了一个简易的应用间activity和service之间的快速通信,由于一个程序中需要传输数据的地方很少,最多就几十个,所以通信很快,本人实测可用,赶快试试吧。。。

本程序不足之处在于用应用同进程进程通信,跨应用和跨进程就无能为力了,这个问题有时间后续解决。

转载请注明原文地址: https://www.6miu.com/read-43489.html

最新回复(0)