今天我注意到了一些很有趣的事情。当手机显示超时时,活动生命周期似乎略有差异。让我举个例子来解释。
我有一个活动,用加速度计振动电话。在onPause
事件中,我取消了SensorManager
侦听器的注册,这样当我的活动不再是主要焦点时,我就不会震动电话。
但是,我注意到,如果显示关闭,然后回到我的活动中,甚至在我解锁屏幕、输入密码和显示我的活动之前,SensorManager
侦听器就已经注册了。
现在我意识到这是我自己对我期望它如何工作的解释,但对我来说,这似乎是相当奇怪的,因为我的活动还不是主要的焦点。我希望SensorManager
侦听器没有注册,因为onResume
还没有被调用。这显然不是这样,当我可以使我的手机振动从锁屏幕和密码屏幕。
那么,谁能解释一下为什么会有这种行为?第二,我能做些什么来绕过它呢?
谢谢。
编辑以实现清晰性
我用加速度计通过移动手机触发震动。这是通过SensorManager
侦听器完成的。
设想情况:
我的活动在前台(主要焦点)。我通过移动电话触发震动。显示超时。此时我无法触发震动。我按家庭/电源显示屏幕。我现在可以振动我的手机,即使锁屏幕或密码屏幕显示,我的活动不在前台。
我无法验证,当显示器关闭时,我不能震动手机的原因是因为onPause
被调用了,还是操作系统有一些固有的东西阻止了它。或者换一种说法,我也无法验证当显示器打开时是否调用了onResume
。
所有这些的关键是了解手机显示被关闭时的活动生命周期。不幸的是,我的期望是它会遵循我们都学到的相同的生命周期图。我的看法是,这是不同的。
发布于 2011-09-08 19:45:34
这是你说的。
“希望SensorManager侦听器没有注册,因为onResume还没有被调用。显然,当我的手机可以在锁屏和密码屏幕上振动时,情况就不是这样了。”
onResume 是在你解锁手机之前打给的
发布于 2011-11-12 06:52:22
下面的代码将处理屏幕关闭和屏幕的意图。也许您可以在屏幕打开后才调用onResume()中的onResume(),并在活动再次聚焦时调用和调用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();
}
}
发布于 2011-01-30 02:47:54
阿。你的编辑告诉我们为什么会发生这种事。
问题是,当你的“屏幕超时”和手机变黑,正在发生的是手机实际上是要睡觉。操作系统可能会进入低功耗状态,不同事物的听者都会转向,并且可能会关闭加速度计和/或振动器。
如果你真的想要活动能够振动,试着保持一个唤醒锁。
http://developer.android.com/reference/android/os/PowerManager.WakeLock.html
https://stackoverflow.com/questions/4840691
复制相似问题