返回应用程序时静态变量为null

时间:2012-03-02 23:12:32

标签: android android-activity static null

在我的应用程序中有一个静态变量,当我从外部浏览器返回我的应用程序时,该变量被设置为null。如果我正在发布的外部网页足够复杂,似乎应用程序或其中某些部分被杀死。

如果应用程序被完全杀死然后从主要活动中重新启动就可以了,但是重新启动来自启动浏览器的活动 - 并且它并不意味着设置应用程序状态,因此它在访问时会崩溃null静态变量。这对我来说是一个六分之一的设备问题所以我需要一些建议。

是否设置了一个标志来阻止此行为?

8 个答案:

答案 0 :(得分:41)

这是大多数移动操作系统的标准行为,绝对包括Android。您的应用 实际上经常被杀死,如果其他具有更高优先级的应用程序(通常,如果它在前台,它的优先级更高)需要资源。这是由于移动设备的性质相对有限。

您应该将数据保存在更耐用的地方。您可能会发现这篇关于通用Data Storage的文章很有用。这个问题也应该是相关的:Saving Android Activity state using Save Instance State

请注意,这实际上是六分之一设备问题。这是所有设备上的“问题”,它在您的某个设备上更明显,可能是因为它的内存较少。如果您在任何其他设备上运行内存密集型应用程序,您应该会看到相同的行为。也没有防止这种情况的旗帜。这是标准的和预期的。

答案 1 :(得分:20)

通常,当设备进入睡眠模式时会发生这种情况。

可以通过以下步骤模拟设备的此行为:

  1. 运行该应用并按主页按钮
  2. 在左下角的Android Studio中,选择已调试应用程序并按应用程序名称左侧的X按钮(终止应用程序)。 (不知道如何使用Eclipse,但我认为类似)
  3. 点击设备上的应用程序图标
  4. 如果任务是活动,应用程序将在最后一个活动上打开,并且(很可能)将生成错误,因为所有静态变量已经离开

答案 2 :(得分:5)

不...你不应该在android上的静态变量中存储数据。如果你坚持这样做,你需要能够在它为空时从中恢复。你应该用捆绑或其他方式保存你的状态。

答案 3 :(得分:5)

在Android中使用static(singleton's)的解决方案非常简单:

实现一个扩展android.app.Application的类,并在onCreate()

中完成所有单例初始化

推理:

  • 首先执行扩展Application的类,即使你的应用程序的进程因内存不足而被杀死
  • 只要调用Application.onCreate()
  • ,您的应用就会有上下文

答案 4 :(得分:1)

您必须将值保存在onSaveInstanceState中并将其返回onRestoreInstanceState,因为当活动进入停止状态生命周期时,所有静态值都将为null。

例如:

        /* save my satatic hashmap in case of activity stopped to retrieve it again in  onRestoreInstanceState method*/
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);

    //Common.PERMISION_MAP static hashmap 
            if (Common.PERMISION_MAP != null) {
                Iterator<Permission> iterator = Common.PERMISION_MAP.values()
                        .iterator();
                ArrayList<Permission> permissionList = new ArrayList<Permission>();
                while (iterator.hasNext()) {
                    Permission permission = (Permission) iterator.next();
                    permissionList.add(permission);

                }
                outState.putParcelableArrayList("PERMISSION_LIST", permissionList);
            }


        }

        /* restore my satatic hashmap when activity stopped */
        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);

            try {
                ArrayList<Permission> permissionList = savedInstanceState
                        .getParcelableArrayList("PERMISSION_LIST");

                if (Common.PERMISION_MAP == null)
                    Common.PERMISION_MAP = new HashMap<Permission, Permission>();
for (Permission permission : permissionList) {
                Common.PERMISION_MAP.put(permission, permission);

            }   
                } catch (Exception ex) {
                String string = ex != null ? ex.getMessage() : "";
                Log.e(TAG, (string != null ? string : ""));
                ex.printStackTrace();

            }
        }

答案 5 :(得分:0)

你可能只想跟随kabuko的第二个链接。但是如果你想保留你的静态变量(也许你有一些很好的理由),你可以这样做:

private static MyObjType getVariable()
{
   if (myVar == null)
     myVar = new MyObjType();  // do whatever else you need to here

   return myVar;
}

这样你可以用getVariable()。test()替换你对myVar.test()的调用,你知道它永远不会导致空指针异常。

答案 6 :(得分:0)

使用应用程序类进行此类操作。它总是在应用程序的任何组件(活动,服务,接收器)开始之前进行实例化。所以你确定所有静态变量都存在并初始化。

答案 7 :(得分:0)

每当您离开应用程序并切换浏览器时,您的应用程序就会进入后台。所以您需要遵循以下步骤

  1. 首先按照以下步骤在Sharedpreferece或savedInstanceState中初始化静态变量

    sharedpreference.purString("your_static_variable_name","your_static_variable_value").
    

    savedInstanceState.putString("your_static_variable_name","your_static_variable_value").
    

oncreate()活动方法的首次执行中或在其他地方

  1. 第二,通过先前使用的sharedpreference或savedInstance在onResume()方法中重新初始化静态变量。