主要应用程序在启动街景活动后被杀死

时间:2011-01-27 15:57:46

标签: android memory null android-activity

在我的代码中,我为街景开始了一项新活动。

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()

3 个答案:

答案 0 :(得分:2)

您可能没有正确使用onSaveInstanceState

  1. 确保将代表您应用状态的变量写入onSaveInstanceState传递给您的Bundle。

  2. 在您的活动onCreate
  3. ,使用给定的Bundle恢复您的状态。或者,您可以在onRestoreInstanceState

  4. 中执行此操作

    有关完整示例,请参阅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”应该在最后。