我正在创建一个使用广播接收器的类。我希望在解锁手机时收到广播。但是有一些问题。请帮帮我。
我的Manifest.xml是: -
<receiver android:name=".MyReciever">
<intent-filter>
<intent-filter>
<action android:name="android.intent.action.ACTION_USER_PRESENT" />
<action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />
<action android:name="android.intent.action.ACTION_SCREEN_ON" />
</intent-filter>
</intent-filter>
</receiver>
和我的广播接收班: -
public class MyReiever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("My Reciever","is intent null => " + (intent == null));
Log.d("My Reciever",intent.getAction()+"");
}
}
虽然其他应用程序和服务正在接收“Screen_on”和“USer_Present”的广播,例如。 WifiService。
答案 0 :(得分:5)
虽然Java常量是android.content.intent.ACTION_USER_PRESENT
,android.content.intent.ACTION_BOOT_COMPLETED
和android.content.intent.ACTION_SCREEN_ON
,但这些常量的值是android.intent.action.USER_PRESENT
,{{1} }和android.intent.action.BOOT_COMPLETED
。这些值需要出现在您的清单中。
但请注意,android.intent.action.SCREEN_ON
的接收者不能在清单中声明,但必须由Java代码注册,例如参见this question。
答案 1 :(得分:2)
由于隐式广播接收器从Android 8.0开始不起作用,因此您必须通过代码和清单注册接收器。
执行以下步骤:
<receiver android:name=".MyReciever">
<intent-filter>
<intent-filter>
<action android:name="android.intent.action.ACTION_USER_PRESENT" />
<action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />
<action android:name="android.intent.action.ACTION_SCREEN_ON" />
</intent-filter>
</intent-filter>
</receiver>
public class MyReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("My Reciever","is intent null => " + (intent == null));
Log.d("My Reciever",intent.getAction()+"");
}
}
public class MyService extends Service {
MyReceiver receiver = new MyReceiver();
@Override
public IBinder onBind(Intent intent) { return null; }
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
registerReceiver(receiver);
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}
<service android:name=".MyService"/>
要使广播工作,必须在服务中进行注册。为了使您的服务持续有效,您可以使用alarm managers
,jobs
等与该问题无关的工具。
答案 2 :(得分:1)
检查您的班级名称,即扩展BroadcastReceiver。它应该是“MyReciever”而不是“MyReiever”
答案 3 :(得分:1)
除了前面的答案中提到的Typo之外,还应该在receiver
标记中完全提到接收器类包的名称,我认为问题在于所讨论的代码使用了两个嵌套的Intent过滤器。我相信这段代码可以正常工作:
<receiver android:name=".MyReciever">
<intent-filter>
<action android:name="android.intent.action.ACTION_USER_PRESENT" />
<action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />
<action android:name="android.intent.action.ACTION_SCREEN_ON" />
</intent-filter>
</receiver>
答案 4 :(得分:1)
我只能给您一个快速提示,因为我走过的那条路您获得的成功要少得多。尝试使用java.util.logging读取logcat,以便您不需要读取日志的权限。在日志视图中,为包含“系统禁用”作为其标头的侦听器创建侦听器。它会在锁定和解锁时触发。检查是否可以访问system.android的屏幕,而不是其他屏幕。 希望能帮助到你。祝你好运