在我目前正在处理的应用程序中,我遇到了有关活动之间通信的问题
基本上我有一个UI-Component,类似于Combobox
。但是,此组件的可能值列表必须以新的Activity
开头
因此,当您点击该组件时,会使用Activity
打开一个新的startActivityForResult
当您选择新值时,它会被放入Bundle
并返回到之前的Activity
。然后,我需要使用onActivityResult
- 方法来获取所选值并将其设置为组件
这意味着,使用此组件的每个Activity
都需要覆盖onActivityResult
并使用新值刷新组件。
我想要的是,该组件会关注所有这些内容,您只需要注册一个Listener
,就像您为TextView
和类似组件所做的那样。
但目前我找不到一个很好的方法来做到这一点,因为沟通与Activity
紧密相关,我无法在{{1}之外得到Activity
的结果1}}。
有没有人知道这个问题的好方法?
答案 0 :(得分:2)
解决此问题 - 使用EventBus
并在其上发布粘性事件。通过这样做,您不必覆盖onActivityResult
。
工作流程如下:
- 使用您的数据创建事件对象
- 从总线中删除所有相同类型的粘性事件
- 按.sendSticky()
方法发布新值。
该事件将会发生,直到某些事情从公交车上移除
- 开始另一项活动
- 在此活动覆盖方法中,订阅该事件类型,其中:
a)用你的论点来处理和处理事件
b)将其从公共汽车上移除
- 使用onResume()
方法订阅总线(第二个活动)
- 在.onPause()
方法
关键是,这允许您无缝地处理第二个Activity的生命周期,并且您可以在基类中订阅/取消订阅总线
答案 1 :(得分:1)
使用BroadCastReceiver怎么样?
基本上您发送广播,并且每个注册接收该广播的活动都会收到该广播将在onReceive
首先在宣言中声明你要听的内容,例如:
<receiver android:name=".TestBroadCast”>
<intent-filter>
<action android:name="io.test.TEST"/>
</intent-filter>
</receiver>
简单地扩展BroadCastReceiver
public class TestBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//TODO: Handle the Intent received.
}
如何发送广播的示例:
public static final String INTENT_ACTION = "io.test.TEST";
public static final String INTENT_EXTRA = "someData";
Intent intent = new Intent();
intent.setAction(INTENT_ACTION);
intent.putExtra(INTENT_EXTRA,"test");
sendBroadcast(intent);
你会获得意图而不是你可以按照自己的意愿处理它:)!
为避免从“宣言”注册服务,您可以从代码中执行此操作,代码类似于以下列表:
IntentFilter intentFilter = new IntentFilter("io.test.TEST");
TestBroadCastReceiver mReceiver = new TestBroadCastReceiver();
context.registerReceiver(mReceiver, intentFilter);
P.S。 我建议你使用LocalBroadcastReceiver如果你不需要其他应用程序能够以安全原因发送公共BroadcastReceiver的结果
答案 2 :(得分:1)
您可以实现观察者设计模式,更好的实现是BroadcastReceiver和实现事件总线设计的库Otto
答案 3 :(得分:0)
你好@Alex Shutov是对的尝试这个 https://github.com/greenrobot/EventBus http://greenrobot.org/eventbus/
答案 4 :(得分:0)
在这里使用EventBus是链接https://github.com/greenrobot/EventBus 只有3个步骤,是的,它是第3 PartyLibrary。它的亮度不应该影响你的应用程序大小
答案 5 :(得分:0)
通常对于这种情况,我会将主要活动中的数据保存为静态数据,并在其他活动中使用和更新。
例如,您可以在Main Activity(即MainActivity)中声明并填充这两个变量
public static ArrayList arrayList ;
public static SparseBooleanArray sparseBooleanArray ;
现在所有其他活动在填充列表值时,可以使用名称MainActivity.arrayList从数组列表填充。当用户选择或取消选择某个值时,只会使用布尔值更新sparseBooleanArray。
在arrayList和sparseBooleanArray中第一次填充值时,请确保使用相同的索引以使它们同步
arrayList.add(1,"List Item 1") ;
sparseBooleanArray.put(1,false ) ; // represent selected value for List Item 1
如果您计划将此功能用于多个活动,则arraylist将保持相同,但是每个活动都会有一个SparseBooleanArray来存储活动明智的选定值。