Android - Как вызвать широковещательный приемник для вызова метода onReceive()?
У меня есть будильник для моего приложения.
Я включил широковещательный приемник, который будет срабатывать, как только время тревоги достигнет.
Как вручную вызывать широковещательный приемник для выполнения кода внутри метода onReceive без повторной копии кода.
Я думал о том, что код в утилите singleton вызывает и вызывает этот метод, используя экземпляр класса из любого места.
Но так или иначе можно вызвать этот метод onReceive напрямую или трансляцию намерения проблематично.
android: exported = "false"//Дополнительный параметр получателя при определении в файле манифеста.
Другой вопрос в том, что такое экспортируемый параметр. Пожалуйста, помогите мне понять это.
Ответы
Ответ 1
1. Способ запуска BroadcastReceiver
вручную - путем вызова
Intent intent = new Intent("com.myapp.mycustomaction");
sendBroadcast(intent);
где "com.myapp.mycustomaction"
- это действие, указанное для вашего BroadcastReceiver
в манифесте. Это можно вызвать из Activity
или Service
.
2. Известно, что Android позволяет приложениям использовать компоненты других приложений. Таким образом, Activity
s, Service
s, BroadcastReceiver
и ContentProvider
моего приложения могут запускаться внешними приложениями при условии, что атрибут android:exported = true
установлен в манифесте. Если для него установлено значение android:exported = false
, этот компонент не может быть запущен внешним приложением. См. Здесь.
Ответ 2
Вы должны указать action
которое требуется для фильтрации на ОС Android, чтобы уведомить вас. т.е.: внутри файла манифеста,
<receiver
android:name="com.example.MyReceiver"
android:enabled="true" >
<intent-filter>
<action android:name="com.example.alarm.notifier" />//this should be unique string as action
</intent-filter>
а также
когда вы хотите вызывать широковещательный приемник методом onReceive,
Intent intent = new Intent();
intent.setAction("com.example.alarm.notifier");
sendBroadcast(intent);
Ответ 3
Как вручную вызывать широковещательный приемник для выполнения кода внутри метода onReceive без повторной копии кода.
Fire BroadcastReceiver
использующий sendBroadcast
же действие, которое добавлено в AndroidManifest.xml
:
Intent intent=new Intent(CUSTOM_ACTION_STRING);
// Add data in Intent using intent.putExtra if any required to pass
sendBroadcast(intent);
что такое андроид: экспортированные параметры
Как и в android: экспортированный документ: может ли широковещательный приемник получать сообщения из источников вне его приложения - "true", если это возможно, и "false", если нет
Значит, если:
android: exported = true: другое приложение также может запускать этот широковещательный приемник, используя действие
android: exported = false: другое приложение не может запустить этот широковещательный приемник, используя действие
Ответ 4
вот более безопасное решение:
-
AndroidManifest.xml
:
<receiver android:name=".CustomBroadcastReceiver" />
-
CustomBroadcastReceiver.java
public class CustomBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// do work
}
}
-
*.java
Intent i = Intent(context, CustomBroadcastReceiver.class);
context.sendBroadcast(i);