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

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

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

Ответ 1

Похоже, вы хотите контролировать, активны ли компоненты, опубликованные в вашем манифесте, а не динамически регистрировать приемник (через Context.registerReceiver()) во время работы.

Если это так, вы можете использовать PackageManager.setComponentEnabledSetting() для управления активностью этих компонентов:

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

Обратите внимание, что если вы заинтересованы только в получении трансляции во время работы, лучше использовать registerReceiver(). Компонент приемника в первую очередь полезен, когда вам нужно убедиться, что ваше приложение запускается каждый раз при отправке широковещательной передачи.

Ответ 2

В вашем методе 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 action
    }
  };
     registerReceiver(receiver, filter);
}

Не забудьте запустить это в методе onDestroy:

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

Ответ 3

Один важный момент, который люди забывают упомянуть, - это время жизни 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 выше.

Ответ 4

Определите приемник вещания в любом месте действия/фрагмента следующим образом:

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() его регистрацию в onPause() [потому что трансляция не используется, если действие приостановлено].

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

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

Для подробного руководства взгляните на широковещательный приемник - два способа реализации.

Ответ 5

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

Ответ 6

В соответствии с глобальными сообщениями "Прослушивание и широковещание" и "Настройка аварийных сигналов" в "Общие задачи" и "Как их сделать в Android" :

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

Создание широковещательного приемника

[BroadcastReceiver (Enabled = true, Exported = false)]

public class BCReceiver : BroadcastReceiver
{

    BCReceiver receiver;

    public override void OnReceive(Context context, Intent intent)
    {
        //Do something here
    }
}

Из вашей активности добавьте этот код:

LocalBroadcastManager.getInstance(ApplicationContext)
    .registerReceiver(receiver, filter);

Ответ 10

Два варианта

1) Если вы хотите читать трансляцию только тогда, когда видимость видна,

registerReceiver(...) в onStart() и onStart() unregisterReceiver(...) в onStop()

2) Если вы хотите читать трансляцию, даже если активность находится в фоновом режиме,

registerReceiver(...) onCreate(...) registerReceiver(...) в onCreate(...) и onCreate(...) unregisterReceiver(...) onDestroy() unregisterReceiver(...) в onDestroy()

Бонус:

Если ты ленивый

Если вы не хотите писать стандартный код для регистрации и отмены регистрации BroadcastReceiver снова и снова в каждом действии, тогда,

  1. Создать абстрактную активность
  2. Напишите шаблонный код в разделе "Деятельность".
  3. Оставьте реализацию как абстрактные методы

Вот фрагмент кода:

Абстрактная деятельность

public abstract class BasicActivity extends AppCompatActivity {

    private BroadcastReceiver broadcastReceiver;
    private IntentFilter filter;
    private static final String TAG = "BasicActivity";

    /**********************************************************************
    *                   Boilerplate code
    **********************************************************************/

    @Override
    public void onCreate(Bundle sis){
        super.onCreate(sis);
        broadcastReceiver = getBroadcastReceiver();
        filter = getFilter();
    }

    @Override
    public void onStart(){
        super.onStart();
        register();
    }

    @Override
    public void onStop(){
        super.onStop();
        unregister();
    }

    private void register(){
        registerReceiver(broadcastReceiver,filter);
    }

    private void unregister(){
        unregisterReceiver(broadcastReceiver);
    }

    /**********************************************************************
    *                   Abstract methods
    **********************************************************************/

    public abstract BroadcastReceiver getBroadcastReceiver();

    public abstract IntentFilter getFilter();

}

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

Смотрите полный код:

ВОТ