电话显示超时期间的活动生命周期

时间:2011-01-30 02:03:21

标签: android android-activity listener lifecycle

今天我发现了一些相当有趣的东西。当手机显示超时时,活动生命周期似乎略有差异。让我用一个例子来解释。

我有一项使用加速度计振动手机的活动。在onPause事件中,我取消注册SensorManager听众,这样当我的活动不再是主要焦点时,我就不会振动手机。

但是,我注意到,如果显示屏关闭,然后在我的活动中重新启动SensorManager侦听器,即使在我解锁屏幕,输入密码,我的活动显示之前也已注册。

现在我意识到这是我对自己希望如何运作的解释,但对我来说这似乎很奇怪,因为我的活动还不是主要关注点。我预计SensorManager侦听器未注册,因为尚未调用onResume。当我可以从锁定屏幕和密码屏幕振动手机时,情况显然不是这样。

那么,任何人都可以解释为什么这种行为?其次,我该怎样做才能解决它?

谢谢。

为清晰起见编辑

我使用加速计通过移动手机来触发振动。这是通过SensorManager监听器完成的。

情景:

我的活动在前台(主要焦点)。我通过移动手机触发振动。显示超时。此时我无法触发振动。我按家/电源显示屏幕。即使显示锁定屏幕或密码屏幕且我的活动不在前台,我现在也可以振动我的手机。

我无法验证当显示器关闭时我无法振动手机的原因是因为调用了onPause或者操作系统有固有的东西阻止了它。换句话说,当显示器打开时,我也无法验证是否调用了onResume

所有这一切的关键是了解手机显示屏关闭时的活动生命周期。不幸的是,我的期望是它将遵循我们所学到的相同的生命周期图。我的意见是不同的。

3 个答案:

答案 0 :(得分:2)

你说的。

  

“预计SensorManager监听器未被注册,因为尚未调用onResume。当我可以从锁定屏幕和密码屏幕振动时,情况显然不是这样。”

在解锁手机之前,

onResume 被调用

答案 1 :(得分:2)

以下代码将处理Screen Off和Screen On意图。也许你只能在屏幕打开后调用onResume()中调用onPause(),并在活动再次调焦时调用onResume()。

public class ExampleActivity extends Activity {

   @Override
    protected void onCreate() {
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        BroadcastReceiver mReceiver = new ScreenReceiver();
        registerReceiver(mReceiver, filter);
    }

    @Override
    protected void onPause() {
        if (ScreenReceiver.wasScreenOn) {
            System.out.println("onPause() called because screen turned off.");
        } else {
            System.out.println("normal onPause() call");
        }
        super.onPause();
    }

    @Override
    protected void onResume() {
        if (!ScreenReceiver.wasScreenOn) {
            System.out.println("onResume() called when screen turns on");
        } else {
            System.out.println("normal onResume() call");
        }
        super.onResume();
    }

}

答案 2 :(得分:0)

阿。您的编辑告诉我们为什么会这样。

问题是,当你的“屏幕超时”并且手机变黑时,发生的事情是手机实际上正在睡觉。操作系统可能会进入低功耗状态并转动各种听众,并可能关闭加速度计和/或振动器。

如果您真的希望活动能够振动,请尝试按住唤醒锁定。

http://developer.android.com/reference/android/os/PowerManager.WakeLock.html