java - 如何在 onReceive() 中关闭 Activity

标签 java android android-activity broadcastreceiver

我在 onReceive() 中声明一个新的 Activity,如下所示。

context.startActivity(new Intent(context, SecondActivity.class));

但无法在onReceive()中直接关闭activity。

我有一个静态变量,用于存储对新 Activity 的引用。

(上下文在 Activity 的 onCreate() 中分配)

所以我像这样在 onReceive() 中调用 finish()

SecondActivity.context.finish();

但我认为这不是一个好方法。有更好的方法吗?

我知道如果我的 BroadcastReceiver 是在 Activity 类中定义的,我可以直接在 onReceive() 中调用 finish() ,但是问题是,它将关闭“此”Activity,但不会关闭 onReceive() 中新创建的 Activity。当广播接收器是静态而非动态时,也无法调用 finish()

最佳答案

I'm stating a new Activity in onReceive() like this.

这是一种强烈的代码味道,除非这是本地广播 (LocalBroadcastManager),在这种情况下,它是较弱的代码味道。

I have a static variable which stores the reference to the new Activity.

这是一种很强烈的代码味道。

And also can't call finish() when the Broadcast Receiver is static, not dynamic.

根据系统广播更改 Activity 组合是另一种强烈的代码味道。

Is there a better approach for this?

考虑到所有代码的味道,我怀疑您的应用程序存在严重的架构问题。

话虽如此,一般的做法是让外部各方以这种方式控制 Activity 。相反,您可以使用事件总线(LocalBroadcastManager、greenrobot 的 EventBus)来引发事件。该 Activity (如果存在)可以监听这些事件并采取适当的操作,其中可能包括销毁自身。或者,响应式(Reactive)解决方案(RxJava/RxAndroid 等)可能会在这里有所帮助,在收到广播后,您会执行一些操作来触发由 Activity 注册的观察者。

关于java - 如何在 onReceive() 中关闭 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44871163/

相关文章:

java - 如何将 JSON 解析为 JTree,反之亦然

android - MapView 瓦片坐标

android - 以编程方式重启 radio

android - 将按键输入路由到不同的 Activity

javascript - 如何从 PhoneGap 调用 Android Activity

java - Spring amqp监听线程恢复

java - 如何防止 mapstruct 映射大量字段而不必手动排除它们?

java - JDialog 在由程序和用户操作创建时的不同行为

android - 如何在警报对话框android中添加自定义ListView

GWT MVP 在不更改 Activity 的情况下更新 History-Token