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)
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()来控制这些组件是否处于活动状态:
请注意,如果您只对在运行时接收广播感兴趣,最好使用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)
有关详细教程,请查看广播接收器 - 实现的两种方法.
| 归档时间: |
|
| 查看次数: |
197958 次 |
| 最近记录: |