Программная Регистрация широковещательного приемника
Я хотел бы знать, что является лучшей практикой/способом программной регистрации широковещательного приемника. Я хочу зарегистрировать конкретные приемники в соответствии с выбором пользователя.
поскольку регистрация выполняется через файл манифеста, мне интересно, есть ли правильный способ добиться этого в коде.
9 ответов:
похоже, вы хотите контролировать, активны ли компоненты, опубликованные в вашем манифесте, а не динамически регистрировать приемник (через контекст.registerReceiver()) во время работы.
Если это так, вы можете использовать PackageManager.setComponentEnabledSetting() для контроля, являются ли эти компоненты являются активными:
Примечание Если вы заинтересованы только в получении широковещательной передачи во время работы, лучше использовать registerReceiver(). Компонент receiver в первую очередь полезен, когда вам нужно убедиться, что ваше приложение запускается каждый раз при отправке широковещательной передачи.
в своем
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, вы можете поймать транслировать намерения, даже когда ваш приложение не работает.Edit: указанное Примечание больше не является истинным с Android 3.1, система Android по умолчанию исключает все получатели от получения намерений, если соответствующее приложение никогда не запускалось пользователем или если пользователь явно остановил приложение через меню Android (в меню Управление → приложение). https://developer.android.com/about/versions/android-3.1.html
это дополнительная безопасность характеристика как пользователь может быть уверен, что только те приложения, которые он начал получать широковещательные намерения.
таким образом, его можно понимать как приемники, программно зарегистрированные в приложении
onCreate()будет иметь тот же эффект с заявленными в AndroidManifest.xml С Android 3.1 выше.
определите широковещательный приемник в любом месте активности / фрагмента следующим образом:
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(); } }
в соответствии с прослушиванием и трансляцией глобальных сообщений и установкой сигналов тревоги в общие задачи и как их выполнять в Android:
Если принимающий класс не является зарегистрированное использование в своем манифест, вы можете динамически создать и зарегистрировать приемник звоню контексте.registerReceiver().
посмотри registerReceiver (приемник BroadcastReceiver, фильтр IntentFilter) для подробнее.
рекомендуется всегда предоставлять разрешение при регистрации получателя, в противном случае вы получите для любого приложения, которое отправляет соответствующее намерение. Это может позволить вредоносным приложениям транслироваться на ваш приемник.
на LocalBroadcastManager
Intent intent = new Intent("any.action.string"); LocalBroadcastManager.getInstance(context). sendBroadcast(intent);и зарегистрироваться в
onResumeLocalBroadcastManager.getInstance( ActivityName.this).registerReceiver(chatCountBroadcastReceiver, filter);и отменить его регистрацию
onStopLocalBroadcastManager.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")
создать широковещательный приемник
[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);
Comments