Android - 如何触发广播接收器调用其 onReceive() 方法?

Android - How to trigger a Broadcast Receiver to call its onReceive() method?

我已经为我的应用程序安排了闹钟。

我已经实现了广播接收器,一旦到达闹钟时间就会被触发。

如何在不复制代码两次的情况下手动调用广播接收器来执行onReceive方法中的代码。

我想过让 utility singleton 中的代码调用并通过从任何地方使用 util class 实例来调用该方法。

但是否还有其他方法可以直接调用该 onReceive 方法,否则广播意图会出现问题。

android:exported="false" //Additional parameter of receiver when defining in manifest file.

另一个问题是导出的参数是什么意思。请帮助我理解这一点。

1. 手动启动 BroadcastReceiver 的方法是调用

Intent intent = new Intent("com.myapp.mycustomaction");
sendBroadcast(intent);

其中 "com.myapp.mycustomaction" 是清单中为您的 BroadcastReceiver 指定的操作。这可以从 ActivityService.

调用

2. 众所周知,Android允许应用程序使用其他应用程序的组件。这样,我的应用程序的Activitys、Services、BroadcastReceivers和ContentProviders就可以被外部应用程序启动了,前提是属性android:exported = true在清单中设置。如果设置为android:exported = false,则该组件不能被外部应用程序启动。参见 here

How to manually call broadcast receiver to execute the code inside of onReceive method without replicating the code twice.

使用 sendBroadcastAndroidManifest.xml 中添加的相同操作触发 BroadcastReceiver :

Intent intent=new Intent(CUSTOM_ACTION_STRING);
// Add data in Intent using intent.putExtra if any required to pass 
sendBroadcast(intent);

what is that android:exported parameter means

android:exported 文档中所述:广播接收器是否可以从其应用程序之外的来源接收消息 - "true" 如果可以,"false" 如果不是

表示如果:

android:exported=true: 其他应用程序也可以使用 action

触发此广播接收器

android:exported=false: 其他应用程序无法使用 action

触发此广播接收器

您需要提及 action 需要 Android OS 过滤才能通知您。 IE。: 在清单文件中,

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

这是一个类型更安全的解决方案:

  • 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 = new Intent(context, CustomBroadcastReceiver.class);
    context.sendBroadcast(i);