没有onActivityResult

时间:2016-11-21 07:16:33

标签: java android android-intent android-activity

在我目前正在处理的应用程序中,我遇到了有关活动之间通信的问题 基本上我有一个UI-Component,类似于Combobox。但是,此组件的可能值列表必须以新的Activity开头 因此,当您点击该组件时,会使用Activity打开一个新的startActivityForResult 当您选择新值时,它会被放入Bundle并返回到之前的Activity。然后,我需要使用onActivityResult - 方法来获取所选值并将其设置为组件 这意味着,使用此组件的每个Activity都需要覆盖onActivityResult并使用新值刷新组件。
我想要的是,该组件会关注所有这些内容,您只需要注册一个Listener,就像您为TextView和类似组件所做的那样。 但目前我找不到一个很好的方法来做到这一点,因为沟通与Activity紧密相关,我无法在{{1}之外得到Activity的结果1}}。
有没有人知道这个问题的好方法?

6 个答案:

答案 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)

答案 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来存储活动明智的选定值。