17
ACTION_SCREEN_OFF
を聞いているバックグラウンドで実行されているサービスを開始しようとしていて、ACTION_SCREEN_OFF
が見つかったら、私の活動が始まります。ACTION_SCREEN_OFFのリッスン
BroadcastReceiverを作成する必要がある場合は、マニフェストXMLに入れることができないためです。しかし、私は多くの検索の後にどこから始めるべきか分かりません。
ACTION_SCREEN_OFF
を聞いているバックグラウンドで実行されているサービスを開始しようとしていて、ACTION_SCREEN_OFF
が見つかったら、私の活動が始まります。ACTION_SCREEN_OFFのリッスン
BroadcastReceiverを作成する必要がある場合は、マニフェストXMLに入れることができないためです。しかし、私は多くの検索の後にどこから始めるべきか分かりません。
ACTION_SCREEN_ON
とACTION_SCREEN_OFF
をAndroidManifest.xmlに宣言することはできません。 アクティビティが実行されている間だけ、それらを捕まえることができます。
例を示します。
BroadcastReceiver:
public class ScreenReceiver extends BroadcastReceiver {
public static boolean wasScreenOn = true;
@Override
public void onReceive(final Context context, final Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
// do whatever you need to do here
wasScreenOn = false;
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
// and do whatever you need to do here
wasScreenOn = true;
}
}
}
活動:
public class ExampleActivity extends Activity {
private BroadcastReceiver mReceiver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// initialize receiver
final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
// your code
}
@Override
protected void onPause() {
// when the screen is about to turn off
if (ScreenReceiver.wasScreenOn) {
// this is the case when onPause() is called by the system due to a screen state change
Log.e("MYAPP", "SCREEN TURNED OFF");
} else {
// this is when onPause() is called when the screen state has not changed
}
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
// only when screen turns on
if (!ScreenReceiver.wasScreenOn) {
// this is when onResume() is called due to a screen state change
Log.e("MYAPP", "SCREEN TURNED ON");
} else {
// this is when onResume() is called when the screen state has not changed
}
}
@Override
protected void onDestroy() {
if (mReceiver != null) {
unregisterReceiver(mReceiver);
mReceiver = null;
}
super.onDestroy();
}
}
おそらくService
からこれらのイベントを聞くことによって、あなたの疑問を解決することができます。
ここでの問題は、アクティビティの 'onResume()'と 'onPause()'が 'BroadcastReceiver.onReceive()'の前に呼び出されることです。 –
これは問題ではありません。そのため、画面の状態を変数( 'wasScreenOn')に設定します。 – DragonWork
ここに何か不足していますか?戻るボタンまたはホームボタンでアクティビティを終了すると、ScreenReceiver.wasScreenOnがTRUEになるので、実際にアクティビティが一時停止しているときに画面がオフになっているとonPause()は考えます。 –