java - Android-按下HOME时如何取消所有 Activity ?

标签 java android android-activity garbage-collection manifest

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

目前,整个应用程序包含约8个 Activity 。首先,我显示一个启动屏幕几秒钟,其中所有首选项都已加载并设置(从sharedPreferences设置)-这些首选项保存在为此创建的“Setting”类中-此类基本上只有一堆静态变量,因此应用中的所有 Activity 都可以阅读并根据需要进行修改。

EDIT :随着应用程序的运行,此类中将存储更多数据,其中一些来自Web服务-数据被解析为对象,并且对这些对象的引用也保存在Settings类中(或对象列表) )。

然后我的问题是,当用户按下HOME键时,当前 Activity 被置于后台。如果 Activity 长时间处于后台(许多用户通过按下主屏幕而不是后退按钮来“关闭”应用程序),然后重新打开,则显示该 Activity 在按下HOME之前正在运行。

举个例子-假设用户启动了该应用,看到了Splash屏幕几秒钟。初始屏幕然后开始一个新 Activity ,并且呼叫本身完成。

这意味着现在“ 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();
  }
});

我对对话框类型有一些常数,因为我为对话框使用了一些自定义设计,所以我创建了一个类来为我创建对话框。

在包含按钮的 Activity 中(略有简化):
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对其进行扩展。
随附的s会放大几个对话框布局中的一个,并添加内容等。正常运行良好,但在HOME暂停应用程序一会后,出现问题了,当我按下按钮时,没有对话框显示。我确实在其他按钮上闪烁了加载对话框,但是此后什么也没发生-没有对话框显示。奇怪的是,如果我再次按下屏幕中间的按钮,我将无法按下按钮(grasics不会做出反应),但是当在屏幕侧面按下一次然后在中间按下图形时,它会做出反应,按下外部按钮时,对话框确实被取消了,所以我想知道中间是否有一些非常细长的“透明”对话框或其他内容-我只是不知道为什么会发生这种情况。

编辑:实际上,通过浏览我保存在Settings类中的变量,我发现确实保存了以像素为单位的屏幕宽度和高度。宽度,用于将自定义对话框的宽度设置为屏幕宽度的特定百分比。如果“设置”被擦除,那么这可能可以解释为什么宽度设置为0时为什么看不到任何对话框...如果不是我的所有变量都被擦除,我似乎无法弄清楚正在发生什么-确实所有事情都指向这一点。
dialog.getWindow().setLayout(Settings._widthpx - (Settings._widthpx/5), dialog.getWindow().getAttributes().height); //Width = 80%

实际上,我不得不承认我真的不知道是什么原因造成的,因为我是Android的新手。我怀疑一段时间未使用Settings类后,GC确实会删除我的所有变量-导致用户在数小时后返回时将擦除所有设置。但是,这不能解释为什么按钮不起作用(其中一个不需要设置)。

该主要 Activity 可以启动其他 Activity ,而这些又可以启动新 Activity 。

我认为,只要我能在按下HOME时强制关闭整个应用程序,并由此在每次按下图标时强制从头开始,就可以解决我的所有问题-强制按钮和设置加载监听程序。

我在这里阅读有关“android:clearTaskOnLaunch”,“android:launchMode”和“android:finishOnTaskLaunch”的信息,但我不太确定如何正确使用它们。

任何可以向我解释为什么按钮不起作用的人,或者当应用程序在后台运行了一段时间后,Settings类中的变量可能会发生什么的人,或者给我一些有关如何使用“ Activity ”设置正确。

编辑:该应用将运行Android 1.6+,因此我不能使用任何较新的功能...

非常感谢你

最佳答案

  • 不要覆盖主键功能。也许您会在某处找到可以使您做到这一点的东西。敬畏上帝,拥抱标准的应用程序不会以任何方式覆盖Home键。
  • 只需将android:clearTaskOnLaunch = true放入清单中即可。这将确保您每次按启动器图标时都会启动您的主要 Activity 。

  • 我怀疑GC会在一段时间后删除所有变量
    尚未使用Settings类-导致所有设置被
    几小时后用户返回时擦除
  • Android对您的应用执行此操作并不那么邪恶。在一段时间不 Activity 和/或需要更多内存之后,它可能会杀死您的应用程序,服务以及在后台运行的任何内容,但是永远不会在没有变量的情况下将应用程序挂在那儿。
  • 关于java - Android-按下HOME时如何取消所有 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10090579/

    相关文章:

    java - 尝试创建 Lotus Notes session 时出现 UnsatisfiledLinkerError

    java - 在合并两个 Excel 文件期间操作单元格

    用于在符号处按行分割 JSON 文本的 Java 例程

    java - 让代码在 x 秒后执行 - Java、Android

    android - 如何从代码中获取设备的IP地址?

    适用于手机和电视的 Android 通用应用程序 (Lollipop)

    java - 如何在 Mustache 模板语言中显示同一类的几个对象

    android - 使用 Android Navigation 组件的深层链接和动画

    android - 动态创建 Activity

    android - 为通知的未决 Intent 设置不同的 Activity