3

我有一个包含多个活动的应用程序。

目前整个应用程序包含大约 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+,所以我不能使用任何更新的功能或任何东西......

非常感谢你

4

5 回答 5

3
  • 不要覆盖主页键功能。也许你会在某个地方找到可以让你这样做的东西。一个敬畏上帝、拥抱标准的应用程序不会以任何方式覆盖 home 键。
  • 只需将 android:clearTaskOnLaunch=true 放入清单中即可。这将确保每次按下启动器图标时都会启动您的主要活动。

我怀疑 GC 确实会在未使用 Settings 类的一段时间后删除我的所有变量 - 导致用户几小时后返回时所有设置都被擦除

  • Android 对您的应用执行此操作并没有那么邪恶。在一段时间不活动和/或需要更多内存后,它可能会杀死您的应用程序、服务以及在后台运行的任何内容,但绝不会让您的应用程序在没有变量的情况下挂在那里。
于 2012-04-10T15:07:23.597 回答
0

我实际上已经为 android 2.0 开发 2.0 定制了这个。现在可能有更好的选择。我所做的是将所有活动声明为全局,当你从任何地方单击主页按钮时,我们检查它们中的每一个是否不为空。如果不为空关闭它们并将引用设置为null。活动仅在全局范围内声明。仅在要使用它们时才定义它们。

于 2012-04-10T14:31:00.337 回答
0

如果您使用的是 Android 4.0 或更高版本,您可以在开发者选项中启用“不保留活动”?如果您没有 4.0 设备,请使用模拟器。

于 2012-04-10T14:36:04.170 回答
0

你必须杀死在主页按钮上当前活动顶部的所有活动,为此你必须覆盖你必须编写的主页键功能

Intent intent = new Intent(context,login.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

这将清除该活动顶部的所有活动,您按下主页键并将其切换到登录活动和

如果您不想覆盖 Home 键功能,那么您只需在Androidmanifest.xml中编写一个android:clearTaskOnLaunch=true,当您单击应用程序图标时,它将启动您的第一个活动

我建议第二种方法最适合您。

于 2012-05-15T06:57:27.007 回答
0

为了后代,在我的应用程序中,我刚刚添加了finish(); 在 我在那里所做的一切之后的onStop()方法中,它起到了一种魅力。

于 2012-10-03T21:39:28.910 回答