我有一个包含多个活动的应用程序。
目前,整个应用程序包含大约8个活动。首先,我展示一个闪屏屏幕几秒钟,在这里加载和设置所有偏好项(从sharedPreferences中)-这些保存在我为此制作的“Setting”类中 - 这个类基本上只有一堆静态变量,所以应用程序中的所有活动都可以读取这些变量,并根据需要进行修改。
编辑:随着应用程序运行,更多的数据将存储在此类中,其中一些来自Web服务 - 数据被解析为对象,并将对这些对象的引用也保存在Settings类中(或对象列表)。
我的问题是,当用户按HOME键时,当前活动将被放入后台。如果活动长时间在后台(很多用户通过按home而不是back键来“关闭”应用程序),然后重新打开它,它会显示在HOME键被按下之前正在运行的活动。
例如-假设用户启动应用程序,看到闪屏屏幕几秒钟。然后闪屏屏幕启动一个新活动并在其上调用finish。
这意味着现在活动堆栈只有MainActivity(主菜单)。在MainActivity中,我在onCreate方法中为所有按钮提供侦听器,大多数按钮都需要来自上述Settings类的一些信息。
然后当我按HOME并几个小时后重新打开应用程序时,所有按钮都无效了-似乎图形正在反应等,但仍然出现某些问题。其中一个即使所有设置被清除也应该工作的按钮只会打开带有一些文本的对话框。
侦听器:
Button b = (Button)v.findViewById(R.id.id_b1);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Dialog dialog = createDialog(MainActivity.this, DIALOG_CONST1);
dialog.show();
}
});
我有一些对话框类型的常量,由于我正在使用一些自定义设计来创建对话框,因此我创建了一个类来为我创建对话框。
从包含按钮的活动(稍微简化一下):
public static Dialog createDialog(final Context c, int dialogId) {
Dialog dialog = null;
CustomDialog.Builder customBuilder;
switch (dialogId) {
...
case d1:
customBuilder = new CustomDialog.Builder(c, DIALOG_CONST1);
//Sets up the parapters to create the dialog afterwards
customBuilder.setTitle("Header").setMessage("Content")
.setPositiveButton("", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog = customBuilder.create(); //Creates the dialog from the above settings
dialog.setCanceledOnTouchOutside(true);
break;
...
}
... //Set the width of the dialog
return dialog;
}
CustomDialog类继承了Dialog类,然后根据提供的常量之一来填充多个对话框布局并添加内容等。通常情况下运行良好,但在应用程序被HOME暂停一段时间后,当我按下按钮时不会显示任何对话框。我看到其他按钮上有一个加载对话框的闪烁,但之后什么也没有发生 - 没有显示对话框。奇怪的是,如果我再次在屏幕中间按下按钮,则无法按下它(图形不会反应),但是当我先在屏幕侧面按下一次,然后再在中间按下时,图形会反应,对话框在按下外部时会被取消,因此我想知道是否存在一些非常薄的“透明”对话框或其他问题 - 我真的不知道为什么会发生这种情况。
编辑:实际上,在查看Settings类中保存的变量时,我发现我确实保存了屏幕的宽度和高度(以像素为单位)。将宽度设置为屏幕宽度的某个百分比用于设置自定义对话框的宽度。如果设置被删除,那么宽度被设置为0可能解释了为什么我看不到任何对话框... 如果不是所有我的Settings类中的变量都被删除,我真的无法弄清楚发生了什么 - 一切似乎都指向这一点。
dialog.getWindow().setLayout(Settings._widthpx - (Settings._widthpx/5), dialog.getWindow().getAttributes().height); //Width = 80%
实际上我必须承认,我对Android还比较新手,不太清楚是什么导致了这个问题。我怀疑当Settings类没有被使用时,GC会在一段时间后删除所有变量,导致用户几个小时后返回时所有设置都被清除。但这并不能解释为什么按钮不起作用(其中一个按钮不需要设置)。
这个主要活动可以启动其他活动,这些活动又可以启动新的活动。
我认为,如果我能强制在HOME键按下时关闭整个应用程序,那么我的所有问题都可以得到解决,并在下次点击应用图标时强制重新启动应用程序-从而强制监听器和设置加载。
我在这里阅读了关于“android:clearTaskOnLaunch”,“android:launchMode”和“android:finishOnTaskLaunch”的内容,但我不太确定如何正确使用它们。
请有人能向我解释为什么按钮不起作用,或者当应用程序长时间处于后台时Settings类中的变量可能发生的情况,或者给我一些关于如何正确使用“activity”设置的好提示。
编辑:该应用程序将运行Android 1.6+,因此我无法使用任何更新的功能或其他东西...
非常感谢。