编程语言
首页 > 编程语言> > java-Android-如何在按下HOME时取消所有活动?

java-Android-如何在按下HOME时取消所有活动?

作者:互联网

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

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

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

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

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

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

编辑:实际上,通过查看我保存在Settings类中的变量,我看到确实保存了以像素为单位的屏幕的宽度和高度.宽度,用于将自定义对话框的宽度设置为屏幕宽度的特定百分比.如果设置被擦除,那么这可能可以解释为什么宽度设置为0时为什么看不到任何对话框…如果不是我的所有变量都被擦除,我似乎无法弄清楚正在发生什么-确实所有事情都指向这一点.

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类中的变量可能会发生什么的人,或者给我一些有关如何使用“活动”设置正确.

编辑:该应用程序将运行Android 1.6,所以我不能使用任何较新的功能…

非常感谢你

解决方法:

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

I suspect that the GC does delete all my variables after a while when
the Settings class haven’t been used – causing all settings to be
wiped when the user returns a few hours later

> Android对您的应用执行此操作并不是那么邪恶.在一段时间不活动和/或需要更多内存之后,它可能会杀死您的应用程序,服务以及在后台运行的任何内容,但永远不会在没有变量的情况下将应用程序挂在那儿.

标签:manifest,android-activity,java,android,garbage-collection
来源: https://codeday.me/bug/20191201/2081243.html