Программно зарегистрировать широковещательный приемник

Я хотел бы знать, какая наилучшая практика / способ программно зарегистрировать широковещательный приемник. Я хочу зарегистрировать конкретные приемники в соответствии с выбором пользователя.

Поскольку регистрация выполняется через файл манифеста, мне интересно, есть ли способ сделать это в коде.

Solutions Collecting From Web of "Программно зарегистрировать широковещательный приемник"

Похоже, вы хотите контролировать, активны ли компоненты, опубликованные в вашем манифесте, а не динамически регистрировать приемник (через 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 3.1, система Android не позволяет всем получателям получать намерения по умолчанию, если соответствующее приложение никогда не запускалось пользователем или если пользователь явно остановил приложение через меню Android (в Управление → Приложение). https://developer.android.com/about/versions/android-3.1.html

Это дополнительная функция безопасности, так как пользователь может быть уверен, что только запущенные приложения получат трансляции.

Таким образом, это можно понять как приемники, программно зарегистрированные в приложении 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 } }; 

Определить IntentFilter в onCreate ()

 mIntentFilter=new IntentFilter("action_name"); 

Теперь зарегистрируйте BroadcastReciever в onResume () и отмените регистрацию в 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(); } } 

В соответствии с Listening For и Broadcasting Global Messages и настройкой сигналов тревоги в общих задачах и как их сделать в Android :

Если получающий класс не зарегистрирован в своем манифесте, вы можете динамически создавать экземпляр и регистрировать получателя, вызывая Context.registerReceiver () .

Взгляните на registerReceiver (приемник BroadcastReceiver, фильтр IntentFilter) для получения дополнительной информации.

Лучше всего всегда предоставлять разрешение при регистрации получателя, иначе вы получите для любого приложения, которое отправляет соответствующее намерение. Это может привести к тому, что вредоносные приложения будут транслироваться на ваш ресивер.

Для 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")