【问题标题】:Using broadcastreceiver only on certain activity仅在某些活动上使用广播接收器
【发布时间】:2015-01-28 14:16:38
【问题描述】:

我有两个活动是Register(),另一个是ReadNews()。我正在使用广播接收器自动检测互联网连接以执行一些代码。

 public void onReceive(Context context, Intent intent) {

    ConnectivityManager cm = (ConnectivityManager)context.getSystemService(
    Context.CONNECTIVITY_SERVICE);
    NetworkInfo wifiNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    if (wifiNetwork != null && wifiNetwork.isConnected()) {
        if(MyApplication.isActivityVisible() == true) {
            Log.d("WifiReceiver", "Have Wifi Connection");
            Toast.makeText(context, "تم الإتصال بالشبكة", Toast.LENGTH_LONG).show();
            if (context instanceof RegisterActivity){
                Intent i = new Intent(context,
                        ReadNews.class);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);
            }
            else {

            }
        }
    }

我如何才能仅在互联网连接继续而用户仍在使用RegisterActivity() 时才启动ReadNews() 活动?
我尝试使用 if (context instanceof RegisterActivity) 之类的上下文,但这似乎不对。

【问题讨论】:

  • 使您的BroadcastReceiver 成为您的RegisterActivity 的内部类,并在onResume() 中注册并在onPause() 中取消注册。不要在清单中使用<intent-filter>
  • 你能给我举个例子吗?
  • @Squonk +1 提出您的建议。但是,您不需要将此作为 RegisterActivity 的内部类来实现 OP 的要求。它可以是一个独立的类。
  • 请检查我的回答@Squonk
  • 任何关于使课程独立的帮助都被占用@DavidWasser

标签: android android-intent broadcastreceiver android-context


【解决方案1】:

正如我在评论中所说,您不需要内部类,您可以创建一个独立类,如下所示:

public class MyWifiReceiver extends BroadcastReceiver {

    private Activity activityToFinish;

    MyWifiReceiver(Activity activityToFinish) {
        this.activityToFinish = activityToFinish;
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        // do what ever you want here
        ...
        // finish the activity
        activityToFinish.finish();
    }
}

RegisterActivity 中,声明一个私有成员变量,如下所示:

 private MyWifiReceiver wifiReceiver;

RegisterActivity.onCreate()中创建一个接收器的实例,在构造函数中传递Activity,像这样:

    wifiReceiver = new MyWifiReceiver(this);

然后注册和注销wifiReceiver,如您在自己的答案中所示。

【讨论】:

  • 非常感谢,这段代码与内部类的工作方式相同,节省了大量重复,唯一的一个问题是我不能使用finish();在活动之外的独立类中运行......还有其他方法可以终止活动吗?
  • 我添加了代码来展示如何传递对Activity 的引用。但是,如果您需要访问Activity 的方法,将其设为内部类可能会更容易。我没有意识到您需要访问 Activity 的任何方法,这就是为什么我建议您不需要内部类。
  • 谢谢@David 我已经通过将context 转换为Activity ((Activity) context).finish(); 解决了这个问题
  • 是的,在这种情况下也可以。但是以后要小心。正如Context 中的onReceive() 中的BroadcastReceiver 并不总是Activity(在这种情况下,幸运的是,它是)。
  • 是的,我也知道这一点,但就我而言,它始终是一个活动,如果我不确定我会使用instance of 来检查它是否是活动:)
【解决方案2】:

感谢@Squonk 评论,我已经按照简短的评论说明完成了我想做的事情,现在我想分享我的代码摘要来展示这个东西是如何工作的:
广播接收器内部类

 private BroadcastReceiver wifiReceiver =
        new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {

    //do what ever you want here
};

在 onResume() 中注册广播接收器

@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //or any intent filter you want 
    registerReceiver(wifiReceiver, filter);
}

在 onPause 中取消注册广播接收器

 @Override
protected void onPause() {
    super.onPause();        
    unregisterReceiver(wifiReceiver);
}

重要

不要在清单中使用<intent-filter>。 注册广播接收器必须是动态的(onResume,onPause)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多