2

複数のブロードキャスト(たとえば、 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>

何かご意見は?私は基本的に、アプリケーションのインストール後できるだけ早くウェイクアップするレシーバーを作成しようとしています。初めて起動すると、数人のリスナーが登録され、その後、登録が解除されるため、再度呼び出されることはありません。(アプリがインストールされた直後に、少しのセットアップを可能にするために、インテントが起動されたらいいのにと思います:))

4

4 に答える 4

7

正解-マニフェストに登録することも、登録することACTION_SCREEN_ONもできません。この問題に関するドキュメントのバグACTION_USER_PRESENT報告しました。

于 2010-08-30T15:03:37.260 に答える
2

いずれにせよ、これを使用context.registerReceiver()してトリックを実行し、マニフェストをクリーンに保つことができます。リンク

于 2011-11-14T09:37:00.187 に答える
1

マニフェストファイルにACTION_USER_PRESENTを登録しても、常にトリガーされるとは限りません。私のnexus4では、マニフェストファイルにACTION_USER_PRESENTを登録すると、まったく機能しませんが、Activityへの登録は正常に機能します。

于 2013-09-26T06:12:36.303 に答える
0

同じ問題が発生し、修正しました(4.3および5.1でテスト済み)。マニフェスト内で「android.intent.action.USER_PRESENT」を宣言できましたが、READ_PHONE_STATE権限があれば大丈夫です!! 私のミニアプリは、画面のオン/オフ状態に反応し、継続的な音声認識を行うバックグラウンドサービスを実行するブロードキャストレシーバーで構成されています。画面がオフの場合、認識はオフになります。コードは次のとおりです。お楽しみください:マニフェスト:

<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);}
于 2015-03-17T15:36:59.163 に答える