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