1

私のコードでは、デバイスがロックされたときに起動されるインテントを理解しようとしています。

例:アクティビティが実行中で、電源ボタンを押して電話をロックするとします。INTENT.ACTION_SCREEN_OFFが起動されます。アクティビティが一時停止され、画面が空白になります。

だから私が欲しいのは、デバイスがユーザーによってロックされているときはいつでも、私は私の活動を終了したくないが、ユーザーがホームボタンまたは戻るボタンを押すと私は活動を終了している。そのために私はコードを書きましたが、それは機能していません。

私が使用したコード

public void onResume()
{
    super.onResume();
    m_ScreenLocked = false;

    // Intent and receiver to listen to screen lock
    m_IntentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    m_IntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
    m_BroadcastReceiver = new ScreenStateBroadcastReceiver();
    registerReceiver(m_BroadcastReceiver, m_IntentFilter);
}

private final class ScreenStateBroadcastReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(final Context context, final Intent intent) 
    {
         if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) 
         {
            m_ScreenLocked = true;
         } 
         else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) 
         {
             //other stuff
         }
    }
}

@Override
public void onStop()
{
    super.onStop();
    m_NoteManagerObject.setPageViewRunning(false);

    if (!m_ScreenLocked)
    {
         unregisterReceiver(m_BroadcastReceiver);
         finish();
     }
     else
     {
         unregisterReceiver(m_BroadcastReceiver);
     }
}
4

1 に答える 1

1

アクティビティにプログラムでレシーバーを登録すると、アクティビティが一時停止されたときにレシーバーはブロードキャストされません。ドキュメントは、で登録を解除することを単に「推奨」しているため、ここではあいまいですがonPause()、アクティビティが一時停止されたときにレシーバーが機能しないとは言わないでください。

しかし、本当の問題は、なぜそれをしたいのかということです。ユーザーとして、アプリを使用しているときに画面が消え、画面のロックを解除するとアプリが消えてしまった場合は、気分が悪くなります。ユーザーが電源ボタンを押しているのか、画面が単にタイムアウトしているのかを区別できないことに注意してください。

とにかく、可能な修正は、マニフェストでそれらのアクションを受け取るためにアクティビティを登録することです。すべてのインテントをマニフェストインテントフィルタに登録できるわけではないため、これは必ずしも機能するとは限りません。思い出すと、ACTION_SCREEN_*インテントをマニフェストに登録できません。

もう1つの方法は、アクティビティと並行して実行されているサービスでこれらのインテントをリッスンし、アクティビティに別のインテントを送信して、アクティビティを終了するように指示できるようにすることです。

于 2012-09-12T05:02:31.383 に答える