ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-01 14:01:26  阅读:225  来源: 互联网

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


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

目前,整个应用程序包含约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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有