以编程方式注册广播接收器

Coo*_*raw 145 android broadcastreceiver

我想知道以编程方式注册广播接收器的最佳实践/方法是什么.我想根据用户的选择注册特定的接收器.

由于注册是通过清单文件完成的,我想知道是否有一种正确的方法可以在代码中实现这一点.

Eri*_*vik 261

在您的onCreate方法中,您可以注册这样的接收器:

private BroadcastReceiver receiver;

@Override
public void onCreate(Bundle savedInstanceState){

  // your oncreate code should be

  IntentFilter filter = new IntentFilter();
  filter.addAction("SOME_ACTION");
  filter.addAction("SOME_OTHER_ACTION");

  receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      //do something based on the intent's action
    }
  };
     registerReceiver(receiver, filter);
}
Run Code Online (Sandbox Code Playgroud)

记得在onDestroy方法中运行:

 @Override
 protected void onDestroy() {
  if (receiver != null) {
   unregisterReceiver(receiver);
   receiver = null;
  }
  super.onDestroy();
 }
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这很有效.为了发送广播,我使用了代码Intent i = new Intent("SOME_ACTION"); sendBroadcast(ⅰ); (19认同)
  • 为什么不在简历和开始? (7认同)
  • 不能保证会调用`onDestroy()`,从而造成潜在的内存泄漏.最好在`onStart()`/`onStop()`中注册/取消注册. (5认同)

Kry*_*ton 68

人们忘记提到的一个重点是生命的时间Broadcast Receiver.以编程方式将其注册到AndroidManifest.xml中注册的区别在于.在清单文件中,它不依赖于应用程序的生命周期.在以编程方式注册时,它确实取决于应用程序的生命周期.这意味着如果您在AndroidManifest.xml中注册,即使应用程序未运行,您也可以捕获广播的意图.

编辑:提到的注释不再适用于Android 3.1,如果相应的应用程序从未被用户启动过,或者用户通过Android菜单明确停止了应用程序,则Android系统会默认情况下将所有接收者排除在接收意图之外(在管理→申请).https://developer.android.com/about/versions/android-3.1.html

这是一个额外的安全功能,因为用户可以确保只有他启动的应用程序才会收到广播意图.

因此可以理解,在应用程序中以编程方式注册的接收器onCreate()与上述Android 3.1的AndroidManifest.xml中声明的接收器具有相同的效果.


hac*_*bod 64

听起来您想要控制清单中发布的组件是否处于活动状态,而不是在运行时动态注册接收器(通过Context.registerReceiver()).

如果是这样,您可以使用PackageManager.setComponentEnabledSetting()来控制这些组件是否处于活动状态:

http://developer.android.com/reference/android/content/pm/PackageManager.html#setComponentEnabledSetting(android.content.ComponentName,int,int)

请注意,如果您只对在运行时接收广播感兴趣,最好使用registerReceiver().接收器组件主要用于在每次发送广播时确保启动应用程序的情况.


Soh*_*ziz 38

在Activity/Fragment中的任意位置定义广播接收器,如下所示:

mReceiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
     Log.d(TAG," onRecieve"); //do something with intent
   }
 };
Run Code Online (Sandbox Code Playgroud)

在onCreate()中定义IntentFilter

mIntentFilter=new IntentFilter("action_name");
Run Code Online (Sandbox Code Playgroud)

现在在onResume()中注册BroadcastReciever并在onPause中取消注册[因为如果活动暂停,则不使用广播].

@Override
protected void onResume() {
     super.onResume();
     registerReceiver(mReceiver, mIntentFilter);
}

@Override
protected void onPause() {
    if(mReceiver != null) {
            unregisterReceiver(mReceiver);
            mReceiver = null;
    }
    super.onPause();
}
Run Code Online (Sandbox Code Playgroud)

有关详细教程,请查看广播接收器 - 实现的两种方法.

  • @SyedRazaMehdi如果广播用于更新UI [在大多数情况下]你应该在onResume中注册它并在onPause中取消注册,否则广播将无用. (2认同)