0

我在尝试生成的 Android 代码方面遇到了一些麻烦。我想要做的只是打印一个 1 如果用户想要解锁他们的手机,当程序第一次启动时,当用户按下屏幕锁定来锁定他们的手机时打印一个 0。我认为这与 Android 生命周期有关,所以我尝试使用 onPause 和 onResume,但我的程序只打印出 0,而不是 1。logTime 方法简单地打印出 1 或 0,而 MainActivity 中的 onCreate 方法调用 onResume() 一次。这是我的代码:

主要活动:

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,你的 ActivityonPause被调用,它打印 0。

当您的应用程序正在运行并被onResume调用时,screenOn将是true(无论屏幕是否刚刚打开),在那里,您会记录相反的screenOn,因此将再次为 0 ...

于 2013-02-24T01:13:39.200 回答
0

您的活动和接收到的实际广播之间存在延迟onPause(),因此通常您可以获得“奇怪”(错误)读数,因为变量没有发生变化。此接收器需要动态注册,并且您还希望它在屏幕关闭并重新打开时也能接收。通常,接收器在 onPause() 中未注册以避免泄漏,但在这里,我们将使用onDestroy(),因为这是我们可以使用的最后一个方法调用。为简单起见,我BroadcastReceiver在 Activity 中做对了,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 回答