在广播接收器中访问应用程序类

14

我想在广播接收器中检查Internet连接,并将结果(布尔标志)设置为全局变量,在整个应用程序中使用,用于if条件;如果断开Internet连接,则在主活动中设置状态imageview为红色图像,如果连接,则设置为绿色。

我遵循了这个主题。但是在Broadcast Receiver中没有getApplication();我应该使用getApplicationContext()代替。

另一方面,这个主题:

当在广播接收器中编写代码时,它不是上下文但在其onReceive方法中给出上下文,您只能调用getApplicationContext()。这也意味着您不能保证在BroadcastReceiver中访问应用程序。

  1. 有哪些问题需要考虑?

  2. 如何在Broadcast Receiver中访问我的应用程序类?

  3. 是否有更好的解决方案来检查Internet连接,设置全局变量并更改我的状态imageview?

答案:
  1. 问题是在Broadcast Receiver中不能直接访问应用程序类。

  2. 您可以通过使用getApplicationContext()方法获取全局应用程序上下文来访问应用程序类。或者,您可以考虑使用依赖注入框架(例如Dagger)来处理此问题。

  3. 是的,有更好的解决方案。您可以使用ConnectivityManager类来检查Internet连接,并使用LiveData或RxJava等技术将其状态传递到整个应用程序中,以便轻松更新UI。

2个回答

38
你可以通过使用上下文访问BroadCastReceiver中的Application类。
 @Override
 public void onReceive(final Context context, Intent intent) {
   MyApplication mApplication = ((MyApplication)context.getApplicationContext());
 }

当然,在广播接收器中,您可以访问Application类。 - Lalit Poptani
这意味着引用不是真的吗?顺便问一下,我接收和更改网络状态的方案完全正确吗? - Dr.jacky
这是你在问题中提出的一个不同的话题/问题,但我仍然会给出一个提示,在你的Activity中添加一个监听器,当互联网连接或断开时触发。 - Lalit Poptani
10
目前getApplicationContext返回的对象恰好是应用程序实例本身,这是一个实现细节,并且API并没有保证这一点。 - Cumbayah
4
为了防止出现ClassCastExceptions,你可以进行以下检查: if (context.getApplicationContext() instanceof MyApplication) { - friederbluemle
显示剩余5条评论

3
也许这能对某些人有所帮助。如果使用自己的应用程序类:
public class App extends Application {

    private static App sInstance;

    public static App get() {
        return sInstance;
    }

    @Override
    public void onCreate() {
        sInstance = this;
        super.onCreate();
    }

}

然后你可以在你的广播接收器中使用App.get()。根据onCreate()文档,它将在接收器调用之前被调用。

在任何活动、服务或接收器对象(不包括内容提供者)被创建之前,即应用程序启动时调用。


哦,是的,它帮了我大忙。谢谢伙计! - Harry .Naeem
这不是一个好的方法。请看这个链接:https://stackoverflow.com/a/45402990/421467 - Dr.jacky
@Mr.Hyde您是否遇到过您提供答案中所描述的内存泄漏问题?如果是,请告诉我重现它的方法 :) - j2esu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接