【问题标题】:How to close an Activity in onReceive()如何在 onReceive() 中关闭 Activity
【发布时间】:2017-07-02 13:09:59
【问题描述】:

我正在像这样在 onReceive() 中声明一个新的 Activity。

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

但是不能在onReceive()中直接关闭activity。

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

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

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

SecondActivity.context.finish();

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

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

【问题讨论】:

    标签: java android android-activity broadcastreceiver


    【解决方案1】:

    我正在像这样在 onReceive() 中声明一个新的 Activity。

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

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

    这是一种强烈的代码气味。

    当广播接收器是静态而不是动态时,也不能调用finish()。

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

    有更好的方法吗?

    鉴于所有代码异味,我怀疑您的应用存在严重的架构问题。

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

    【讨论】:

    • 感谢您的回答和建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2016-04-24
    相关资源
    最近更新 更多