在我的代码中,我为街景开始了一项新活动。
Intent streetView = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(streetView);
它开启街景就好了。如果我没有做太多,我可以点击后退按钮,我的应用程序正坐在那里等待没有任何改变。
但是,如果我稍微使用街景并环顾四周并移动视图,我会在logcat中看到这一点:
01-27 10:53:27.526:INFO / ActivityManager(1079):内存不足:没有更多后台进程。
01-27 10:53:27.636:DEBUG / dalvikvm(32218):GC_FOR_MALLOC在655ms内释放了3054个对象/ 198608字节
01-27 10:53:27.831:DEBUG / dalvikvm(32164):GC_FOR_MALLOC在342ms内释放了1054个对象/ 51664字节
01-27 10:53:27.862:INFO / dalvikvm-heap(32164):将堆(frag case)增长到3.656MB,用于87396字节分配
01-27 10:53:27.878:INFO / ActivityManager(1079):进程com.favorite.me(pid 32135)已经死亡。
01-27 10:53:27.878:INFO / ActivityManager(1079):内存不足:没有更多后台进程。
01-27 10:53:27.482:INFO / ActivityManager(1079):进程com.myapp.app(pid 31481)已经死亡。
01-27 10:53:27.490:INFO / WindowManager(1079):WIN DEATH:Window {44c68ba8 com.myapp.app/com.myapp.app.MyLocation paused = false}
然后当我点击后退按钮返回我的应用程序时,似乎所有变量都已重置为null,就像我丢失了应用程序的状态一样。修复它的唯一方法是再次点击后退按钮并重新启动该活动。
据我所知,它没有调用onpause()或onSaveInstanceState()方法,操作系统正在查看我的应用程序内存以运行streetview。
我需要做些什么不同的事情吗?
这是我的oncreate,onRestoreInstanceState和onSaveInstanceState方法:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
sLong = savedInstanceState.getDouble("sLong");
sLat = savedInstanceState.getDouble("sLat");
sMapStyle = savedInstanceState.getBoolean("sMapStyle");
sMapUpdate = savedInstanceState.getBoolean("sMapUpdate");
sMapStreet = savedInstanceState.getBoolean("sMapStreet");
sFirstTime = savedInstanceState.getBoolean("sFirstTime");
locationAvailable = savedInstanceState.getBoolean("locationAvailable");
sGPSFlag = savedInstanceState.getBoolean("sGPSFlag");
sMessage = savedInstanceState.getString("sMessage");
sMap = savedInstanceState.getString("sMap");
sGPS = savedInstanceState.getString("sGPS");
sAddressIn = savedInstanceState.getString("sAddressIn");
sGPSLat = savedInstanceState.getString("sGPSLat");
sGPSLong = savedInstanceState.getString("sGPSLong");
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putDouble("sLong",sLong);
savedInstanceState.putDouble("sLat",sLat);
savedInstanceState.putBoolean("sMapStyle",sMapStyle);
savedInstanceState.putBoolean("sMapUpdate",sMapUpdate);
savedInstanceState.putBoolean("sMapStreet",sMapStreet);
savedInstanceState.putBoolean("sFirstTime",sFirstTime);
savedInstanceState.putBoolean("locationAvailable",locationAvailable);
savedInstanceState.putBoolean("sGPSFlag",sGPSFlag);
savedInstanceState.putString("sMessage",sMessage);
savedInstanceState.putString("sMap",sMap);
savedInstanceState.putString("sGPS",sGPS);
savedInstanceState.putString("sAddressIn",sAddressIn);
savedInstanceState.putString("sGPSLat",sGPSLat);
savedInstanceState.putString("sGPSLong",sGPSLong);
}
我想我可能会对这种情况发生的原因有所了解。还不确定它有多正确。
我设置了一些调试消息,我看到onRestoreInstanceState()
和onSaveInstanceState()
方法运行。
问题是,在我的onCreate()
方法完成后之前,它不会恢复我保存的实例。但是在onCreate()
方法期间我需要这些变量,此时这些变量仍为空。如何让我的代码在onCreate()
之后运行但不需要任何用户输入?或者如何在我的代码之前运行onRestoreInstanceState()
?
答案 0 :(得分:2)
您可能没有正确使用onSaveInstanceState
。
确保将代表您应用状态的变量写入onSaveInstanceState
传递给您的Bundle。
onCreate
中,使用给定的Bundle恢复您的状态。或者,您可以在onRestoreInstanceState
。
有关完整示例,请参阅this stackoverflow问题。
答案 1 :(得分:1)
如果您的应用程序被杀死以释放资源,那么您无法阻止它甚至在实例数据被杀死之前保存它。
在Android开发网站上查看Saving Persistent State。他们建议可能需要更积极地保存您的实例状态 - 这可以防止您的应用被Android杀死时失去状态:
你可能想提交你的 关键数据更加积极 活动期间的时间 生命周期:例如在开始之前 一个新的活动,在完成你的 用户切换时自己的活动 在输入字段等之间
我可以建议您在启动街景活动之前明确保存实例状态。
如果这对您的onCreate中的实例状态为null没有帮助,并且您确定它已正确保存,那么您可能希望在onCreate中的其余代码之前恢复实例状态。
同样请注意:
对于onRestoreInstanceState:
在onStart()之后调用此方法 当活动正在进行时 从之前保存的重新初始化 国家,在这里给出 savedInstanceState。
现在开始:
在onCreate(Bundle)之后调用 - 或 在onRestart()之后的活动 已经停止了,但现在又来了 正在向用户显示。
因此,您无法从onRestoreInstanceState恢复onCreate中所需的任何状态 - 您必须在onCreate中执行此操作。
答案 2 :(得分:0)
在onSaveInstanceState函数中,“super.onSaveInstanceState”应该在最后。