Android - 在没有 onActivityResult() 的情况下从 activity 传回信息的最佳做法是什么?

Android - What is the best practice for passing back information from an activity without onActivityResult()?

我有一个比较笼统的问题。 假设我在某种 MainActivity 中有一个 RecyclerView。此 RecyclerView 的内容正在其他活动的多个地方更新

例如,可以通过开始一个新的 Activity 并保存它来创建新的条目 there.In 在这种情况下,我会直观地从 activity 开始 startActivityForResult() 并在 MainActivity.

中接收 onActivityResult() 方法中的更改

但是可以说在应用程序的更深处,有可能删除所有条目。现在我们如何通知 MainActivity 数据集中的这个变化?我考虑设置某种标志并在 MainActivity 中更新内容后清除它。但是不知何故使用全局变量并没有真正遵循适当封装的原则,是吗?

很抱歉提出这个含糊的问题,但我发现很难以优雅的方式正确处理 Android 中的信息流,所以我们来了。

您可以使用 Handler 在 Activity 中传递消息,然后您必须更新 RecyclerView。喜欢,

1) 在Activity.

  public static Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {

         if(msg.what == 1223){
                //update RecyclerView 
         }

         return false;
        }
    });

2) 当你想更新RecyclerView时传递消息

 Message msg = new Message();
 msg.what = 1223;
 Activity1.mHandler.sendMessage(msg);

可以用EventBus来处理
为您的活动定义一个 class

public static class MyEvent { 
    int event;
    /* define your fields */
}

并在 main activity

中准备您的订阅者
@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMyEvent(MyEvent myEvent) {
    switch(myEvent.event) {
        /* Do what you need */
    }
};

现在您需要进行更改,请这样致电您的订阅者:

MyEvent myEvent = new MyEvent();
myEvent.event = 1;
EventBus.getDefault().post(myEvent);

您可以在 here

中阅读有关 EventBus 的更多信息

如果您使用的是 RxJava2RxAndroid。那你可以试试这个。

  • 创建总线:

    public final class RxBus {
    
        private static final BehaviorSubject<Object> behaviorSubject = BehaviorSubject.create();
    
        public static BehaviorSubject<Object> getSubject() {
            return behaviorSubject;
        }
    }
    
  • 在您想要接收数据的 WaitingActivity 中(在您的情况下您不想使用 onActivityResult

    Disposable disposable = RxBus.getSubject().
                    subscribeWith(new DisposableObserver<Object>() {
                        @Override
                        public void onNext(Object o) {
                            if (o instanceof DataObject) {
                                //((DataObject) o).getValue();
                            }
                        }
                        @Override
                        public void onError(Throwable e) {
    
                        }
                        @Override
                        public void onComplete() {
    
                        }
                    });
            });
    
  • 在你activity你想发送数据的地方

    RxBus.getSubject().onNext(dataObject);
    startActivity(new Intent(CurrentActivity.class, WaitingActivity.class));
    
  • 最后不要忘记处理你的一次性用品以避免你的 WaitingActivity 内存泄漏

    @Override
    protected void onDestroy() {
        super.onDestroy();
        disposable.dispose();
    }
    

local broadcast? You can find the idea of broadcast in this document 怎么样?你需要本地广播,如果你只想在你的应用程序中传递数据,这是首选。

Android apps can send or receive broadcast messages from the Android system and other Android apps, similar to the publish-subscribe design pattern. These broadcasts are sent when an event of interest occurs. For example, the Android system sends broadcasts when various system events occur, such as when the system boots up or the device starts charging. Apps can also send custom broadcasts, for example, to notify other apps of something that they might be interested in (for example, some new data has been downloaded).

您的数据应该在模型中与视图分开。如果其他 activity 更改数据,理想情况下必须从那里更新回收站视图。因此,无论哪个 activity 做什么,当您在加载时刷新数据或恢复回收器视图时,您总是会得到正确的结果。