可以在ACTION_USER_PRESENT广播接收器在清单中不是注册?
-
25-09-2019 - |
题
我看到多种广播( ACTION_TIME_TICK - 用于例如)不能在清单中注册,则必须明确地经由Context.registerReceiver()
注册。我有与 ACTION_USER_PRESENT 广播意图麻烦。具体而言,在模拟器上测试我和我的应用程序保持力关闭与错误:
08-30 09:44:23.397: ERROR/AndroidRuntime(290): java.lang.RuntimeException: Unable to start receiver me.turnerha.RegisterListeners: java.lang.IllegalArgumentException: Receiver not registered: me.turnerha.RegisterListeners@43d05690
这是造成
08-30 09:44:23.397: ERROR/AndroidRuntime(290): Caused by: java.lang.IllegalArgumentException: Receiver not registered: me.turnerha.RegisterListeners@43d05690
我的清单是相当简单:
<receiver android:name=".RegisterListeners">
<intent-filter>
<action android:name="android.intent.action.SCREEN_ON" />
</intent-filter>
</receiver>
任何想法?我基本上是试图创建安装我的应用程序后很快惊醒尽可能接收器。它第一次被唤醒时,它注册了几个听众,然后将其注销本身,以便它永远不会再次调用。 (我真希望有意向马上还以颜色已安装应用程式后,允许设置一个小一点的:))
解决方案
正确 - ACTION_SCREEN_ON
也不ACTION_USER_PRESENT
既不可以在清单中注册。我有对这个问题提出了文档错误。
其他提示
Eitherway,你可以使用context.registerReceiver()
这将这样的伎俩,并保持你的清单干净。 链接
在清单文件注册ACTION_USER_PRESENT并不总是得到触发。在我nexus4如果我注册清单文件ACTION_USER_PRESENT那么它根本不工作,而在活动注册工作正常。
我有同样的问题,我固定它(在4.3和5.1测试)。我能够申报“android.intent.action.USER_PRESENT”里面的表现,只要你有READ_PHONE_STATE许可,这是OK!我的迷你应用程序由广播接收机的是反作用于屏幕ON / OFF状态,并运行一个后台服务,做连续语音识别。如果屏幕处于关闭状态,识别被关闭。下面是代码,享受:清单:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <receiver android:name="classes.VoiceLaunchReceiver" >
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
广播接收机:
public class VoiceLaunchReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent intent) {
Intent service = new Intent(ctx, VoiceLaunchService.class);
// service.putExtra(action, true);
Log.i("joscsr","Incoming Voice Launch Broadcast...");
if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
Log.i("joshcsr", "************\nCSR Resumed (BC)\n************");
ctx.startService(service);
}
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
Log.i("joshcsr", "************\nCSR STOPPED by SCREEN (BC)\n************");
ctx.stopService(service);
}
}
}
你可以想像,我USER_PRESENT广播接收器没有注册任何其他地方。我在我的服务,谁是我的接收器引发的onCreate方法注册ACTION_SCREEN_OFF和ON。
@Override
public void onCreate() {
super.onCreate();
//Register screen ON/OFF BroadCast
launcher=new VoiceLaunchReceiver();
IntentFilter i=new IntentFilter(Intent.ACTION_SCREEN_OFF);
i.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(launcher,i);
Log.d("joshcsr","VoiceLaunch Service CREATED");
}
最后,我注销我的服务的屏幕的开/关在的onDestroy():
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(launcher);}