默认情况下,我的应用设置为方向横向。这导致设备被锁定时出现问题,因为方向将变为纵向(以容纳锁定的屏幕),这反过来强制onResume被调用。发生这种情况时,所有对象都为空,使应用程序容易崩溃。我做了一些更改,以防止崩溃和应用程序工作'确定'。 OK意味着当您从锁定屏幕返回应用程序时,半秒内UI处于纵向方向,然后再捕捉到正确的方向。
我已经做的事情要解决
我。添加了对onResume
中永远不会为null的所有对象的空检查II。在清单
中添加了android:configChanges="orientation|screenSize"
III。在清单
中添加了android:screenOrientation="landscape"
还可以做些什么来使锁定屏幕转换回我的应用程序更顺畅,没有闪烁,闪烁或方向变化?
答案 0 :(得分:1)
正如我从你的问题中可以理解的那样。您面临onResume()
中导致应用程序崩溃的所有对象的null。
你无法真正避免再次调用onResume()
。这是活动生命周期的预期行为。但是有一个技巧。您可以创建一个标志,以了解onPause()
中的屏幕是否已关闭/打开。一旦手机解锁,它将拨打onResume()
,您可以管理该标志。
boolean isScreenUnLock = false;
@Override
protected void onPause() {
super.onPause();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
isScreenUnLock = pm.isScreenOn();
}
@Override
protected void onResume() {
super.onResume();
if(isScreenUnLock){
//Do something
}
}
但这似乎不是更好的方式。我建议处理活动状态而不是避免Activity null中的所有对象。请查看this示例以获取更多详细信息。
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
// Save UI state changes to the savedInstanceState.
// This bundle will be passed to onCreate if the process is
// killed and restarted.
savedInstanceState.putBoolean("MyBoolean", true);
savedInstanceState.putDouble("myDouble", 1.9);
savedInstanceState.putInt("MyInt", 1);
savedInstanceState.putString("MyString", "Welcome back to Android");
// etc.
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore UI state from the savedInstanceState.
// This bundle has also been passed to onCreate.
boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
double myDouble = savedInstanceState.getDouble("myDouble");
int myInt = savedInstanceState.getInt("MyInt");
String myString = savedInstanceState.getString("MyString");
}
或快速处理上述状态。只需简单地使用此library。