【问题标题】:Turning screen on and off in Android在 Android 中打开和关闭屏幕
【发布时间】:2013-02-24 01:05:26
【问题描述】:

我在尝试生成的 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。可能有人知道为什么吗?谢谢!

【问题讨论】:

  • logTime(!ScreenReceiver.screenOn) 应该只是 logTime(ScreenReceiver.screenOn); 没有 !
  • @A--C 嗯,好吧。我现在遇到了一些麻烦 - 每当我恢复我的应用程序时,我永远无法记录 1。当我解锁屏幕时,没有打印任何内容,但是当我锁定屏幕时,它打印出 0。你知道吗为什么?
  • 您在哪里注册/注销接收方?你所拥有的(除了使用基本相同的参数调用logTime())看起来是正确的。
  • 我只是在我的 MainActivity 的 onCreate 部分注册了它。这就是我所拥有的: IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); BroadcastReceiver 接收器 = new ScreenReceiver(); registerReceiver(接收器,过滤器);
  • 我明白你的意思。实际接收之间存在延迟,因此您会得到奇怪的打印输出。

标签: android printing boolean android-lifecycle


【解决方案1】:

您的 Activity 的 onPause() 与接收到的实际广播之间存在延迟,因此通常您会得到“奇怪”(错误)的读数,因为变量没有发生变化。此接收器需要动态注册,并且您还希望它在屏幕关闭并重新打开时也能接收。通常,接收器在 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"));
  }
}

【讨论】:

  • 快速问题——接收器应该是什么?它是什么类型的变量?
  • @user200081 BroadcastReceiver receiver; 它只是一个广播接收器。我想说,不要将我的示例与您的代码合并,只需将内容视图设置为您在 Activity 中使用的layout xml,以检查我的示例是否有效。如您所见,我删除了onPause()/onResume(),因为它们不再需要了。
  • 像魅力一样工作。非常感谢您的帮助!
  • 很抱歉打扰您,但我想在应用程序首次启动时记录一个 1。我尝试在 onCreateMethod 的开头做一个标志(例如,如果 test == 0)然后输出一个 1,并将 test 增加到 1,这样它就不会再发生了。但是,我的活动因此而不断崩溃。关于为什么以及如何做到这一点的任何想法?
  • @user200081 根据你所说的我不知道为什么。至于如何做到这一点,要么是静态的int,要么使用SharedPreferences,这样值就会保持不变(onCreate() 在方向变化时被调用,在正常的生命周期事件下,Activity 被销毁然后为此重新创建)。但是,如果您自己无法解决这个问题,最好的办法是提出另一个问题,包括您迄今为止的代码和 完整 堆栈跟踪。
【解决方案2】:

根据您的代码,一切似乎都是正确的,它应该总是打印 0...

当屏幕关闭时,screenOn 设置为false,你的Activity 的onPause 被调用,它打印0。

当您的应用程序正在运行并调用 onResume 时,screenOn 将是 true(无论屏幕是否刚刚打开),在那里,您记录的是 screenOn 的反面,所以将是 0又...

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 2014-02-02
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多