Android - 如何在按下HOME时杀死所有活动?

时间:2012-04-10 14:23:32

标签: java android android-activity garbage-collection manifest

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

目前整个应用程序包含大约8个活动。首先我显示一个启动画面几秒钟,其中所有首选项都被加载和设置(来自sharedPreferences) - 这些保存在我为此制作的“Setting”类中 - 这个类基本上只有一堆静态变量,所以应用程序中的所有活动都可以阅读这些内容并根据需要进行修改。

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

我的问题是,当用户按HOME键时,当前活动将被置于后台。如果活动在后台很长一段时间(许多用户通过按home而不是后退来“关闭”应用程序),然后重新打开它会显示在按下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它 与它一起提供的东西会膨胀几个对话框布局中的一个并添加内容等。通常工作得很好,但是在暂停应用程序暂停一段时间后,出现问题时按下按钮时没有显示对话框。我在其他按钮上执行了一个加载对话框,但之后没有任何反应 - 没有显示对话框。奇怪的是,如果我再次按下屏幕中间的按钮,我就无法按下它(grahics不反应),但是当在屏幕的一侧按下一次然后在中间时,图形会做出反应,按下外面时对话框确实被取消了,所以我想知道中间是否有一些非常纤细的“透明”对话框或者其他东西 - 我只是不知道为什么会发生这种情况。

编辑:实际上查看我在Settings类中保存的变量,我发现我确实保存了屏幕的像素宽度和高度。用于将自定义对话框的宽度设置为屏幕宽度的某个%的宽度。如果设置被擦除,这可能解释了为什么我没有看到任何对话框,因为宽度被设置为0 ...如果不是我在Settings类中的所有变量被擦除,我真的无法想象发生了什么 - 一切都确实如此。

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+,因此我无法使用任何新功能或任何其他功能......

非常感谢

5 个答案:

答案 0 :(得分:3)

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

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

  • 对你的应​​用来说,Android并不是那么邪恶。在一段时间不活动和/或需要更多内存之后,它可能会扼杀您的应用程序,服务以及在后台运行的任何内容,但如果没有您的变量,它们永远不会让您的应用程序挂在那里。

答案 1 :(得分:0)

我实际上已经为Android 2.0开发2.0定制了这个。可能现在有更好的选项。我做的是宣布所有活动全局,当你从任何地方点击主页按钮时我们检查它们是否都不是null。如果not null关闭它们并将引用设置为null。活动仅在全局声明。它们仅在使用它们时定义。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

如果你不想覆盖Home键功能,那么你必须在 androidmanifest.xml 中只编写一个 android:clearTaskOnLaunch = true 点击应用程序图标,它将开始您的第一个活动

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

答案 4 :(得分:0)

对于后人来说,在我的应用程序中,我只是在 onStop()方法中添加了完成(); ,之后我在那里做了所有事情,它就像魅力一样。