2012-07-05 7 views
17

ACTION_SCREEN_OFFを聞いているバックグラウンドで実行されているサービスを開始しようとしていて、ACTION_SCREEN_OFFが見つかったら、私の活動が始まります。ACTION_SCREEN_OFFのリッスン

BroadcastReceiverを作成する必要がある場合は、マニフェストXMLに入れることができないためです。しかし、私は多くの検索の後にどこから始めるべきか分かりません。

答えて

36

ACTION_SCREEN_ONACTION_SCREEN_OFFAndroidManifest.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からこれらのイベントを聞くことによって、あなたの疑問を解決することができます。

+1

ここでの問題は、アクティビティの 'onResume()'と 'onPause()'が 'BroadcastReceiver.onReceive()'の前に呼び出されることです。 –

+0

これは問題ではありません。そのため、画面の状態を変数( 'wasScreenOn')に設定します。 – DragonWork

+0

ここに何か不足していますか?戻るボタンまたはホームボタンでアクティビティを終了すると、ScreenReceiver.wasScreenOnがTRUEになるので、実際にアクティビティが一時停止しているときに画面がオフになっているとonPause()は考えます。 –

関連する問題