0

作成しようとしている Android コードに関して、少し問題があります。私がやろうとしているのは、ユーザーが電話のロックを解除したい場合、およびプログラムが最初に起動したときに 1 を出力し、ユーザーが画面ロックを押して電話をロックしたときに 0 を出力することです。これは Android のライフサイクルに関係していると思ったので、onPause と onResume を使用してみましたが、私のプログラムは 0 しか出力せず、1 を出力しませんでした。logTime メソッドは単に 1 または 0 を出力し、MainActivity の onCreate メソッドは onResume() を 1 回呼び出します。これが私のコードです:

主な活動:

protected void onPause(){
    if(ScreenReceiver.screenOn){
        logTime(ScreenReceiver.screenOn); 
 super.onPause();
}

protected void onResume()
  if(!ScreenReceiver.screenOn){
    logTime(!ScreenReceiver.screenOn);
super.onResume();
}

スクリーンレシーバー:

public class ScreenReceiver extends BroadcastReceiver{
public static boolean screenOn;


@Override
public void onReceive(Context context, Intent intent){
    if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
        screenOn = false;
    }
    else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
        screenOn = true;
    }

}

}

なぜ0だけを出力するのかわかりません。誰かが理由を知っているでしょうか?ありがとう!

4

2 に答える 2

0

あなたのコードに基づいてすべてが正しいように見えます、それは常に0を出力するはずです...

画面がオフになっている場合、にscreenOn設定されているfalse場合、アクティビティonPauseが呼び出され、0が出力されます。

アプリケーションが実行さonResumeれて呼び出されると、screenOntrue画面がオンになったばかりかどうかに関係なく)、の反対のログが記録screenOnされるため、再び0になります...

于 2013-02-24T01:13:39.200 に答える
0

アクティビティonPause()と実際のブロードキャストの受信の間には遅延があるため、通常、変数の変更が発生していないため、「奇妙な」(間違った) 読み取り値を取得できます。この受信機は動的に登録する必要があり、画面がオフになっていて再びオンになったときでも受信できるようにする必要があります。通常、Receiver はリークを避けるために onPause() で登録解除されますが、ここではonDestroy()使用できる最後のメソッド呼び出しであるため使用します。簡単にするためBroadcastReceiverに、アクティビティで権利を作成し、logTime()完全に呼び出しました。

サンプルコード:

public class MainActivity extends Activity {

  BroadcastReceiver receiver;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    receiver = new BroadcastReceiver(){

      @Override
      public void onReceive(Context arg0, Intent arg1) {
        if(arg1.getAction().equals(Intent.ACTION_SCREEN_OFF)){
          logTime(false);
        }
        else if(arg1.getAction().equals(Intent.ACTION_SCREEN_ON)){
          logTime(true);
        }
      } 
    }; 
    registerReceiver(receiver, filter);
  }

  @Override
  protected void onDestroy()
  {
    try{
      unregisterReceiver (receiver);
    }
    catch (NullPointerException e){  
      e.printStackTrace();
    }
    catch (IllegalStateException e1){
      e.printStackTrace();
    }
    super.onDestroy();
  }


  public void logTime (boolean screen)
  {
    Time now = new Time();
    now.setToNow();

    String lsNow = now.format("%m-%d-%Y %I:%M:%S");
    TextView myText = (TextView) findViewById (R.id.myText);
    myText.append (" " + lsNow + (screen ? "0" : "1"));
  }
}
于 2013-02-24T02:07:48.603 に答える