可以在清单中注册ACTION_USER_PRESENT BroadcastReceiver吗?

时间:2010-08-30 13:59:33

标签: android android-manifest broadcastreceiver

我看到多个广播(例如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>

有什么想法?我本质上是在创建一个在安装应用程序后尽快唤醒的Receiver。第一次被唤醒时,它会注册一些监听器,然后它会自动取消注册,因此它永远不会再被调用。 (我真的希望你的应用程序安装后立即启动一个意图,允许一点点安装:))

4 个答案:

答案 0 :(得分:6)

正确 - 清单中无法注册ACTION_SCREEN_ONACTION_USER_PRESENT。我在这个问题上有filed a documentation bug

答案 1 :(得分:2)

无论如何,你可以使用context.registerReceiver()来完成这个技巧,并保持你的清单干净。 Link

答案 2 :(得分:1)

在清单文件中注册ACTION_USER_PRESENT始终不会被触发。在我的nexus4中,如果我在清单文件中注册ACTION_USER_PRESENT,那么它根本不起作用,而在Activity中注册工作正常。

答案 3 :(得分:0)

我遇到了同样的问题,我修复了它(在4.3和5.1上测试过)。我能够声明&#34; android.intent.action.USER_PRESENT&#34;在清单内部,只要你拥有READ_PHONE_STATE权限,就可以了!!我的迷你应用程序包括一个广播接收器,它响应屏幕的开/关状态,并运行一个连续语音识别的后台服务。如果屏幕关闭,则关闭识别。这是代码,享受:MANIFEST:

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