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

我想知道什么是以编程方式注册广播接收机的最佳做法/方式。 我想根据用户select注册特定的接收器。

由于注册是通过清单文件完成的,我想知道是否有一个正确的方法来实现这个代码。

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

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

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

请注意,如果您只想在运行时接收广播,最好使用registerReceiver()。 接收器组件主要用于当您需要确保每次发送广播时启动您的应用程序。

在你的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); } 

记得在onDestroy方法中运行这个:

  @Override protected void onDestroy() { if (receiver != null) { unregisterReceiver(receiver); receiver = null; } super.onDestroy(); } 

人们忘记提及的一个重点是Broadcast Receiver的使用寿命。 在AndroidManifest.xml中注册它的程序注册的区别在于。 在清单文件中,它不依赖于应用程序的生命周期。 而当以编程方式注册它,它取决于应用程序的生命周期。 这意味着如果你在AndroidManifest.xml中注册,即使应用程序没有运行,你也可以捕获广播的意图。

编辑:提到的笔记不再是真实的Android系统,Android系统默认情况下排除所有接收器接收意图如果相应的应用程序从未由用户启动,或者如果用户通过Android菜单显式停止应用程序pipe理→应用程序)。 https://developer.android.com/about/versions/android-3.1.html

这是一个额外的安全function,因为用户可以确保只有他开始的应用程序才会收到广播意图。

所以可以理解为,在应用程序的onCreate()以编程方式注册的接收者将与AndroidManifest.xml中从Android 3.1中声明的接收者具有相同的效果。

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

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

在onCreate()中定义IntentFilter

 mIntentFilter=new IntentFilter("action_name"); 

现在在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(); } 

有关详细教程,请看广播接收器 – 两种实现方式 。

 package com.example.broadcastreceiver; import android.app.Activity; import android.content.IntentFilter; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { UserDefinedBroadcastReceiver broadCastReceiver = new UserDefinedBroadcastReceiver(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } /** * This method enables the Broadcast receiver for * "android.intent.action.TIME_TICK" intent. This intent get * broadcasted every minute. * * @param view */ public void registerBroadcastReceiver(View view) { this.registerReceiver(broadCastReceiver, new IntentFilter( "android.intent.action.TIME_TICK")); Toast.makeText(this, "Registered broadcast receiver", Toast.LENGTH_SHORT) .show(); } /** * This method disables the Broadcast receiver * * @param view */ public void unregisterBroadcastReceiver(View view) { this.unregisterReceiver(broadCastReceiver); Toast.makeText(this, "unregistered broadcst receiver", Toast.LENGTH_SHORT) .show(); } } 

根据收听和广播全球消息,设置常见任务中的闹钟以及如何在Android中执行操作 :

如果接收类未在其清单中使用注册,则可以通过调用Context.registerReceiver()来dynamic实例化和注册接收方。

看看registerReceiver(BroadcastReceiver接收器,IntentFilterfilter)的更多信息。

最好的做法是在注册接收方时始终提供许可,否则您将收到任何发送匹配意图的应用程序。 这可以允许恶意应用程序广播到您的接收器。

LocalBroadcastManager

  Intent intent = new Intent("any.action.string"); LocalBroadcastManager.getInstance(context). sendBroadcast(intent); 

并在onResume注册

 LocalBroadcastManager.getInstance( ActivityName.this).registerReceiver(chatCountBroadcastReceiver, filter); 

并取消注册onStop

 LocalBroadcastManager.getInstance( ActivityName.this).unregisterReceiver(chatCountBroadcastReceiver); 

并接受它..

 mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.e("mBroadcastReceiver", "onReceive"); } }; 

IntentFilter在哪里

  new IntentFilter("any.action.string")