アプリケーションマニフェストで画面のオン/オフを検出するブロードキャストレシーバーを登録することができるかどうかだけを考えていました。プログラム可能な方法が気に入らないのは、そのようなことを検出するためにアプリを実行する必要があるためです。一方、「マニフェストに登録されているブロードキャストレシーバーを持つアプリケーションは、Intentが実行されているときに実行する必要はありません受信者が実行するためのブロードキャスト」(ソース:Professional Android 2 Application Development book)
私のアプリは実際にはロックスクリーンアプリで、プログラム可能な方法を使用して常に実行する必要があります:S
それを回避する方法はありますか?
私はマニフェストで次のことを試しています:
<receiver Android:name=".MyBroadCastReciever">
<intent-filter>
<action Android:name="Android.intent.action.SCREEN_OFF"/>
<action Android:name="Android.intent.action.SCREEN_ON"/>
</intent-filter>
</receiver>
シンプルなMyBroadCastRecieverクラス:
public class MyBroadCastReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
Log.i("Check","Screen went OFF");
Toast.makeText(context, "screen OFF",Toast.LENGTH_LONG).show();
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
Log.i("Check","Screen went ON");
Toast.makeText(context, "screen ON",Toast.LENGTH_LONG).show();
}
}
}
画面のオンとオフの2つのアクションは次のとおりです。
Android.intent.action.SCREEN_OFF
Android.intent.action.SCREEN_ON
ただし、これらのブロードキャストの受信者をマニフェストに登録すると、受信者はこれらのブロードキャストを受信しません。
この問題については、これらの目的のためにローカルブロードキャストレシーバーを登録する長期実行サービスを作成する必要があります。この方法を使用すると、アプリはユーザーがいらいらしないサービスの実行中にのみ画面を探します。
PS:フォアグラウンドでサービスを開始して、実行時間を長くします。
簡単なコードスニペットは次のようになります。
IntentFilter screenStateFilter = new IntentFilter();
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mScreenStateReceiver, screenStateFilter);
Service 'sonDestroyでレシーバーを登録解除することを忘れないでください:
unregisterReceiver(mScreenStateReceiver);
ACTION_SCREEN_ONおよびACTION_SCREEN_OFFのマニフェストの宣言ブロードキャストでレシーバーが動作しない理由を尋ねている人のために:
https://developer.Android.com/reference/Android/content/Intent.html#ACTION_SCREEN_ONhttps://developer.Android.com/reference/Android/content/Intent。 html#ACTION_SCREEN_OFF
Context.registerReceiver()で明示的に登録することによってのみ、マニフェストで宣言されたコンポーネントを介してこれを受け取ることはできません。
これは、システムのみが送信できる保護されたインテントです。
バックグラウンドサービスを作成して確認する必要があります。その後、プログラムで設定できます。