今天我发现了一些相当有趣的东西。当手机显示超时时,活动生命周期似乎略有差异。让我用一个例子来解释。
我有一项使用加速度计振动手机的活动。在onPause
事件中,我取消注册SensorManager
听众,这样当我的活动不再是主要焦点时,我就不会振动手机。
但是,我注意到,如果显示屏关闭,然后在我的活动中重新启动SensorManager
侦听器,即使在我解锁屏幕,输入密码,我的活动显示之前也已注册。
现在我意识到这是我对自己希望如何运作的解释,但对我来说这似乎很奇怪,因为我的活动还不是主要关注点。我预计SensorManager
侦听器未注册,因为尚未调用onResume
。当我可以从锁定屏幕和密码屏幕振动手机时,情况显然不是这样。
那么,任何人都可以解释为什么这种行为?其次,我该怎样做才能解决它?
谢谢。
为清晰起见编辑
我使用加速计通过移动手机来触发振动。这是通过SensorManager
监听器完成的。
情景:
我的活动在前台(主要焦点)。我通过移动手机触发振动。显示超时。此时我无法触发振动。我按家/电源显示屏幕。即使显示锁定屏幕或密码屏幕且我的活动不在前台,我现在也可以振动我的手机。
我无法验证当显示器关闭时我无法振动手机的原因是因为调用了onPause
或者操作系统有固有的东西阻止了它。换句话说,当显示器打开时,我也无法验证是否调用了onResume
。
所有这一切的关键是了解手机显示屏关闭时的活动生命周期。不幸的是,我的期望是它将遵循我们所学到的相同的生命周期图。我的意见是不同的。
答案 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