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
指定的操作。这可以从 Activity
或 Service
.
调用
2. 众所周知,Android允许应用程序使用其他应用程序的组件。这样,我的应用程序的Activity
s、Service
s、BroadcastReceiver
s和ContentProvider
s就可以被外部应用程序启动了,前提是属性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.
使用 sendBroadcast
与 AndroidManifest.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);
我已经为我的应用程序安排了闹钟。
我已经实现了广播接收器,一旦到达闹钟时间就会被触发。
如何在不复制代码两次的情况下手动调用广播接收器来执行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
指定的操作。这可以从 Activity
或 Service
.
2. 众所周知,Android允许应用程序使用其他应用程序的组件。这样,我的应用程序的Activity
s、Service
s、BroadcastReceiver
s和ContentProvider
s就可以被外部应用程序启动了,前提是属性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.
使用 sendBroadcast
与 AndroidManifest.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);