在我的应用程序中有一个静态变量,当我从外部浏览器返回我的应用程序时,该变量被设置为null。如果我正在发布的外部网页足够复杂,似乎应用程序或其中某些部分被杀死。
如果应用程序被完全杀死然后从主要活动中重新启动就可以了,但是重新启动来自启动浏览器的活动 - 并且它并不意味着设置应用程序状态,因此它在访问时会崩溃null静态变量。这对我来说是一个六分之一的设备问题所以我需要一些建议。
是否设置了一个标志来阻止此行为?
答案 0 :(得分:41)
这是大多数移动操作系统的标准行为,绝对包括Android。您的应用 实际上经常被杀死,如果其他具有更高优先级的应用程序(通常,如果它在前台,它的优先级更高)需要资源。这是由于移动设备的性质相对有限。
您应该将数据保存在更耐用的地方。您可能会发现这篇关于通用Data Storage的文章很有用。这个问题也应该是相关的:Saving Android Activity state using Save Instance State
请注意,这实际上是不六分之一设备问题。这是所有设备上的“问题”,它在您的某个设备上更明显,可能是因为它的内存较少。如果您在任何其他设备上运行内存密集型应用程序,您应该会看到相同的行为。也没有防止这种情况的旗帜。这是标准的和预期的。
答案 1 :(得分:20)
通常,当设备进入睡眠模式时会发生这种情况。
可以通过以下步骤模拟设备的此行为:
如果任务是活动,应用程序将在最后一个活动上打开,并且(很可能)将生成错误,因为所有静态变量已经离开。
答案 2 :(得分:5)
不...你不应该在android上的静态变量中存储数据。如果你坚持这样做,你需要能够在它为空时从中恢复。你应该用捆绑或其他方式保存你的状态。
答案 3 :(得分:5)
在Android中使用static(singleton's)的解决方案非常简单:
实现一个扩展android.app.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)
每当您离开应用程序并切换浏览器时,您的应用程序就会进入后台。所以您需要遵循以下步骤
首先按照以下步骤在Sharedpreferece或savedInstanceState中初始化静态变量
sharedpreference.purString("your_static_variable_name","your_static_variable_value").
或
savedInstanceState.putString("your_static_variable_name","your_static_variable_value").
在oncreate()
活动方法的首次执行中或在其他地方
onResume()
方法中重新初始化静态变量。