应用内广播接收器

8

有没有人能告诉我如何创建一个应用内的广播接收器?我已经创建了一个可以弹出消息的广播接收器。它甚至在应用程序处于后台状态时也能正常工作,但我希望它只在应用程序处于前台时才能工作。

  public class MainActivity extends Activity {

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                this.registerReceiver(this.mConnReceiver, new IntentFilter(
                        ConnectivityManager.CONNECTIVITY_ACTION));
            }

            private BroadcastReceiver mConnReceiver = new BroadcastReceiver() {

                public void onReceive(Context context, Intent intent) {
                    boolean noConnectivity = intent.getBooleanExtra(
                            ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
                    String reason = intent
                            .getStringExtra(ConnectivityManager.EXTRA_REASON);
                    boolean isFailover = intent.getBooleanExtra(
                            ConnectivityManager.EXTRA_IS_FAILOVER, false);

                    NetworkInfo currentNetworkInfo = (NetworkInfo) intent
                            .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
                    NetworkInfo otherNetworkInfo = (NetworkInfo) intent
                            .getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);

                    if (currentNetworkInfo.isConnected()) {
                        System.out.println("Connected");
                        Toast.makeText(getApplicationContext(), "Connected",
                                Toast.LENGTH_LONG).show();
                    } else {
                        System.out.println("Not Connected");
                        Toast.makeText(getApplicationContext(), "Not Connected",
                                Toast.LENGTH_LONG).show();
                    }
                }
            };

        }

So here is my code which is checking network state and generating a BroadcastReceiver. I haven't added anything in manifest.
2个回答

2
有几种方法可以实现这个功能。我能想到的前两种方法如下:
  1. 如果您在清单文件中使用了 <intent-filter> 声明 <receiver>,则可以从应用程序中启用和禁用它,以便仅在应用程序在前台时启用。为此,请将 <receiver> 的清单条目添加 android:enabled="false" 以使接收器初始处于禁用状态。 现在,在应用程序运行时,在 onResume() 中启用接收器。使用 PackageManager.setComponentEnabledSetting() 来执行此操作。当您的活动进入后台时,在 onPause() 中可以再次禁用接收器。

  2. 动态注册和取消注册接收器。对于此操作,您无需在清单文件中声明接收器。在您的应用程序中,创建一个 BroadcastReceiver 实例,并在 onResume() 中调用 registerReceiver() 方法并传入适当的意图过滤器。当应用程序进入后台时,在 onPause() 中调用 unregisterReceiver() 方法来移除它。接收器只会在应用程序在前台时接收到对 onReceive() 的调用。


没问题。只需将 registerReceiver() 调用从 onCreate() 移动到 onResume(),并在 onPause() 中添加 unregisterReceiver() 调用即可。 - David Wasser
但现在,只要我恢复活动,它就会弹出“已连接”的提示,而我的要求是检测网络更改,然后在活动恢复时才弹出提示。 - Rishabh Srivastava
1
是的,这里的问题在于你正在监听的广播意图是“粘性”意图。这意味着Android框架会保留最近的状态,并且每当注册广播接收器时,它会立即触发最近的状态。为了解决这个问题,在onReceive()中,您可以调用isInitialStickyBroadcast()。如果返回true,则可以忽略对onReceive()的调用,因为这只是通知您当前的状态。 - David Wasser

1
请参阅Context.registerReceiver()和Context.unregisterReceiver()。

在哪里以及如何使用它? - Rishabh Srivastava
在您的 Activity 中,当 Activity 切换到前台时注册,在切换到后台时取消注册。 - pskink
如果您使用registerReceiver,则无需在清单中声明它。 - pskink
好的...你能像David一样解释一下吗?因为我是新手,第一次使用BR。 - Rishabh Srivastava

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