我有一个包含多个活动的应用程序。
目前整个应用程序包含大约 8 个活动。首先,我显示了几秒钟的初始屏幕,其中所有首选项都已加载和设置(来自 sharedPreferences) - 这些保存在我为此制作的“设置”类中 - 这个类基本上只有一堆静态变量,所以应用程序中的所有活动都可以读取这些内容并根据需要进行修改。
编辑:当应用程序运行时,更多数据存储在此类中,其中一些来自网络服务 - 数据被解析为对象,对这些对象的引用也保存在 Settings 类(或对象列表)中。
我的问题是,当用户按下 HOME 键时,当前活动被置于后台。如果活动在后台很长时间(许多用户通过按主页而不是返回来“关闭”应用程序),然后重新打开它会显示在按下主页之前正在运行的活动。
举个例子 - 假设用户启动应用程序,看到启动屏幕几秒钟。然后启动屏幕开始一个新的活动并调用它自己完成。
这意味着现在 Activity 堆栈只是 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 类,然后根据它提供的 const 扩展几个对话框布局之一并添加内容等。正常工作,但是在应用程序被 HOME 暂停一段时间后,事情就出错了当我按下按钮时没有显示对话框。我确实在其他按钮上看到了一个加载对话框,但之后没有任何反应 - 没有显示任何对话框。奇怪的是,如果我在屏幕中间再次按下按钮,我就无法按下它(图形没有反应),但是当在屏幕侧面按下一次然后在中间图形确实有反应,按下外面时对话框确实会被取消,所以我想知道中间是否有一些非常纤细的“透明”对话框或其他东西 - 我只是不知道为什么会发生这种情况。
编辑:实际上查看我保存在设置类中的变量,我发现我确实保存了屏幕的宽度和高度(以像素为单位)。宽度用于将自定义对话框的宽度设置为屏幕宽度的某个百分比。如果设置被擦除,这可能解释了为什么当宽度设置为 0 时我看不到任何对话框...如果不是设置类中的所有变量都被擦除,我真的无法弄清楚发生了什么- 一切都确实指向这一点。
dialog.getWindow().setLayout(Settings._widthpx - (Settings._widthpx/5), dialog.getWindow().getAttributes().height); //Width = 80%
实际上我不得不承认我真的不知道是什么原因造成的,因为我对 Android 还很陌生。我怀疑 GC 确实会在未使用 Settings 类的一段时间后删除我的所有变量 - 导致用户几小时后返回时所有设置都被擦除。然而,这并不能解释为什么这些按钮不起作用(其中一个不需要设置)。
这个主要活动可以启动其他活动,这些活动可以再次启动新活动。
我认为如果我可以在按下 HOME 时强制关闭整个应用程序,从而在按下图标时强制它从头开始 - 强制按钮上的侦听器和要加载的设置,我认为我的所有问题都可以解决.
我在这里阅读了有关“android:clearTaskOnLaunch”、“android:launchMode”和“android:finishOnTaskLaunch”的信息,但我不太确定如何正确使用它们。
任何人都可以向我解释为什么按钮不起作用,或者当应用程序在后台运行一段时间后我的设置类中的变量可能会发生什么,或者给我一些关于如何使用的好提示“活动”设置正确。
编辑:该应用程序将运行 Android 1.6+,所以我不能使用任何更新的功能或任何东西......
非常感谢你