我有一个接收器类侦听几个动作,但它无法捕获android.intent.action.BOOT_COMPLETED
动作。我做错了什么?这是我的清单文件:
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!--<receiver android:name=".OtherReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>-->
<receiver android:name="com.myApp.AppReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="com.myApp.wifitimer"/>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" android:path="com.myApp" />
</intent-filter>
</receiver>
可以看出我在接收器中再次添加了权限,接收者的名称获得了该answer建议的全名。 这是广播接收器类:
@Override
public void onReceive(Context arg0, Intent arg1) {
String action1 = arg1.getAction();
if(action1.equals(Intent.ACTION_BOOT_COMPLETED)) {
Log.d("receiver","action is: boot");
}
if(action1.equals("android.intent.action.PACKAGE_REPLACED")) {
Log.d("receiver","action is: package");
}
}
当我运行应用程序时,接收器会捕获android.intent.action.PACKAGE_REPLACED
,但是当我重新启动手机时,接收器无法捕获BOOT_COMPLETED
。
但是,当我在 Mainfest 文件中的.OtherReceiver
中发表评论时,它可以抓住它!
这是这个类的代码:
public class OtherReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String action = arg1.getAction();
if(action.equals(Intent.ACTION_BOOT_COMPLETED)) {
Log.d("new receiver","action is: boot");
}
}
}
和另一个一样。所以我的问题是为什么我需要为BOOT_COMPLETED
动作定义一个单独的接收器?
修改:我还尝试根据this通过 adb 发送操作,未经任何许可,我可以使用 AppReceiver 上课:
am broadcast -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n com.blubuk/.AppReciever
答案 0 :(得分:9)
首先,从android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
元素中移除<receiver>
。
其次,<data>
的{{1}}部分正在将应用于<intent-filter>
中您不想要的所有<action>
元素。 <intent-filter>
上没有Uri
。
但是,您可以在原始ACTION_BOOT_COMPLETED
元素上创建单独的<receiver>
元素,而不是创建单独的<intent-filter>
元素。将您的<receiver>
移至新的<action android:name="android.intent.action.BOOT_COMPLETED" />
(也可能是<intent-filter>
个},这样他们就不会受到您的第一个com.myApp.wifitimer
的{{1}}的影响。< / p>
答案 1 :(得分:2)
用这个替换你的清单,我相信它会起作用。在接收器标记中放置android:permission是不正确的。
<receiver
android:name="com.myApp.AppReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>