当前位置: 代码迷 >> Android >> 关于同一个应用两个不相关的activity实时通信的有关问题
  详细解决方案

关于同一个应用两个不相关的activity实时通信的有关问题

热度:62   发布时间:2016-04-28 03:11:32.0
关于同一个应用两个不相关的activity实时通信的问题
同一个应用内两个不相关的activity 例如A进入B,B进入C,C进入D 或者A进入B,C进入D,那么A和D可以看做两个不相关的activity.

假如有这样一个需求,在D activity中按一个按钮,A activiy必须立即更新数据,那么可以的方法有哪些呢,我能想到的有以下几种:

1、回调。但activity不是普通的java对像,两个activity不相关,好像无法传入接口的实例对像,好像无法实现,我对回调理解不      深,不知道说得对不对。

2、广播。D activity响应到按钮事件,立即发送全局广播,在广播接收者的onReceive方法执行操作,这样一来为了方便在A activity内执行方法,就必须把广播接收者做为A activity的一个内部类,内部类要接收到广播,只能把这个广播接收者定义为static的(这里我试过好像普通的类是不行的,一定要定义成静态的),这样一来,static的广播接收者要想调用A activity的更新数据方法,就必须把A activity的更新数据方法也做成静态的,能实现但好像实用性也不高。

3、在A activity生命周期的某些方法里执行更新数据的操作。比如A进入B B进入C C进入D,当前D activity在前台,那么A activity就执行了至少失去焦点这个生命周期方法。当从D返回到A的时候,A又执行了获取到焦点的生命周期方法,那么就在这个生命周期方法内执行更新数据的方法。但要判断D按钮按下后 A才执行更新数据的操作,那么就需要D携带返回值给A activity了,这个容易,可以使用startActivityForResult这个方法开启activity从而获得返回值 ,看上去这个方法可行,只是比较麻烦,需要一层一层的传返回值。

4、因为我理解java监听者也叫观察者模式吧不深,所以问问大神监听者模式可否实现?或者还有其它更为简便的方法?
------解决思路----------------------
回调广播都可以,可能还有更多方式。
如果是回调的话可以定义一个回调的管理类。
A实现回调接口,注册到管理类上,在D上面执行操作的时候,可以调用管理类的接口回调就可以了。
如:
1.接口是NotifyMessage,回调方法是sendMessage(String msg)
public interface NotifyMessage{
        public void sendMessage(String msg);
}
2.定义管理类NotifyMessageManager.
public class NotifyMessageManager{
        ......//可以采取单例
        private NotifyMessage listener;
        public void setNotifyMessage(NotifyMessage nm){
                listener = nm;
        }
        public void sendNotifyMessage(String msg){
                listener.sendMessage(msg);
        }
}
3.让A实现NotifyMessage接口,并注册到NotifyMessageManager上。
4.在D中调用NotifyMessageManager的sendNotifyMessage,这样就可以把数据发到A上面了。
  相关解决方案