【问题标题】:How to know "Don't keep activities" is enabled in ICS?如何知道 ICS 中启用了“不保留活动”?
【发布时间】:2012-07-25 12:40:57
【问题描述】:

如何知道设置中的“不保留活动”选项已通过代码在 ics 中启用。如果已启用,如何阻止该活动。

注意:我在我的应用程序中使用了更多活动。由于该设置,如果我将一个活动移动到另一个活动,第一个活动将被销毁。我可以将我的数据保存在 onSaveInstanceState 上。如果不使用保存的实例状态,有什么办法可以做...

提前谢谢..

【问题讨论】:

    标签: android android-4.0-ice-cream-sandwich


    【解决方案1】:

    导入以下包

    import android.provider.Settings;
    

    然后您可以使用以下代码检查该选项是否启用:

    Settings.System.getInt(getContentResolver(),Settings.System.ALWAYS_FINISH_ACTIVITIES, 0);
    

    你可以用这个来改变它:

    Settings.System.putInt(getContentResolver(),Settings.System.ALWAYS_FINISH_ACTIVITIES,  0);
    

    希望对你有帮助

    【讨论】:

    • 我收到警告:设置 always_finish_activities 已从 android.provider.Settings.System 移至 android.provider.Settings.Global,返回只读值。并且设置 always_finish_activities 已从 android.provider.Settings.System 移至 android.provider.Settings.Global,值不变。
    • 请帮助我,禁用 ALWAYS_FINISH_ACTIVITIES
    • 当你尝试禁用它时它不会生效,putInt() 就像你说的那样。但是当它打开/关闭时,读数会返回正确的值。知道为什么吗? WRITE_SETTINGS 权限也在清单中
    【解决方案2】:
        Settings.System.ALWAYS_FINISH_ACTIVITIES 
    

    现在已弃用,因此您应该使用

        Settings.Global.ALWAYS_FINISH_ACTIVITIES.equals("1")
    

    检查此选项是否启用

    更新(感谢 Aviv Ben Shabat 评论):

    为了处理所有 sdk 版本,我创建了一个方法:

      public static boolean isFinishActivitiesOptionEnabled(Context context) {
        int result;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
            result = Settings.System.getInt(context.getContentResolver(), Settings.System.ALWAYS_FINISH_ACTIVITIES, 0);
        } else {
            result = Settings.Global.getInt(context.getContentResolver(), Settings.Global.ALWAYS_FINISH_ACTIVITIES, 0);
        }
    
        return result == 1;
    }
    

    【讨论】:

    • 我觉得第二行也应该是“Settings.SYSTEM.getInt”
    • 请注意,您无法更改全局设置(与系统不同)
    【解决方案3】:

    正是出于这个原因,该标志在那里。这个想法是检查并确保您的应用程序处理其被破坏的活动。您无法覆盖它,因为在现实世界中,如果设备内存不足,即使没有该标志,它也可能发生。您需要编写代码来处理这种情况而不是覆盖它。

    【讨论】:

    • 有没有办法通过代码找到“不保留活动”设置...?
    • 我不知道又一次 - 你为什么要这样做?你永远不应该使用该标志作为做任何事情的理由。
    • 我有一个简单的案例:一个有 Preference 活动的应用程序。设置此单元格参数时,单击选项按钮立即关闭首选项...了解提防用户很有用
    • 我不同意这里,开发人员应该能够检查此设置并适当地提示用户应用程序可能会在该设置打开时出现异常行为。即使开发人员编写了一个完美的应用程序,该应用程序在 Activity 重新启动后仍然存在,但在您的 Activity 启动另一个 Activity 并且另一个 Activity 属于另一个进程(例如画廊)的情况下,此设置会导致问题,即使使用 startActivityForResults Android 也会关闭我们的 Activity 而我们不会曾经从 Gallery Activity 中获取 Activity 结果。
    • @KevinKrumwiede 试用我提到的测试用例,然后声称人们“无能”。开发人员最好了解系统的限制,在这些限制下他的应用程序无法运行,而不是让用户对为什么某些东西无法运行一无所知。
    【解决方案4】:

    我同意@Kaediil 的观点,即在选中“不保留活动”选项时,Android 应用程序必须运行良好。

    由于某种原因,如果您必须检查“alwaysFinishActivities”值,您可以使用下面的代码;

    /**
     * returns true if AlwaysFinishActivities option is enabled/checked
     */
    private boolean isAlwaysFinishActivitiesOptionEnabled() {
        int alwaysFinishActivitiesInt = 0;
        if (Build.VERSION.SDK_INT >= 17) {
            alwaysFinishActivitiesInt = Settings.System.getInt(getApplicationContext().getContentResolver(), Settings.Global.ALWAYS_FINISH_ACTIVITIES, 0);
        } else {
            alwaysFinishActivitiesInt = Settings.System.getInt(getApplicationContext().getContentResolver(), Settings.System.ALWAYS_FINISH_ACTIVITIES, 0);
        }
    
        if (alwaysFinishActivitiesInt == 1) {
            return true;
        } else {
            return false;
        }
    }
    

    如果选中了 alwaysFinishActivities 选项并且您希望取消选中它;

    您可以将用户引导至“设置 -> 开发人员选项”以取消选中该值。 (这比获得额外可怕的权限并以编程方式设置此值要好)

    /**
     * shows Settings -> Developer options screen
     */
    private void showDeveloperOptionsScreen(){
        Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
        intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        startActivity(intent);
    }
    

    【讨论】:

      【解决方案5】:

      提问者是对的,他有一个很好的问题,但仍然没有回答:-)

      我用一个干净简单的例子测试了这个问题。 The fact is, that when the option 'do not keep activities' is checked, then activities will be killed.例如:一个 Mainactivity 调用一个 subactivity。主要活动被杀死。按下子活动会导致重新启动 Mainactivity。这可能是一个问题,当 mainactivity 正在执行诸如加载内容之类的长时间运行的事情时。

      我对此的结论。 “不保留活动”选项是开发人员选项,不应在正常用户条件下设置。所以开发者应该能够检测到这个设置。

      【讨论】:

      • 你没有抓住重点。该选项可能未设置,但在内存不足的手机上,效果可能完全相同。操作系统将立即摆脱活动以回收内存,因此即使未设置标志,您也可能会发生完全相同的事情。
      • 同意@Kaediil。不管它是否打开,相同的行为都可能基于低内存条件或各种其他情况发生。你的应用应该可以正常运行。
      • 即使是内存不足的手机也不会像选中此选项那样强大。以 Facebook 登录为例,它是在单独的活动中启动的,并且永远不会在选中“不保留活动”的情况下工作,但是,它适用于所有手机。
      • 在正常情况下不应该设置它,但设置它的唯一后果应该是应用程序可能会使用更多的 CPU 和电池,因为它们会不断地重新创建活动。从用户的角度来看,打开此选项后,应用程序应该可以正常运行。如果他们不这样做,则开发人员做错了什么。
      【解决方案6】:

      int value = Settings.System.getInt(getContentResolver(), Settings.System.ALWAYS_FINISH_ACTIVITIES, 0);

      【讨论】:

        【解决方案7】:

        您也可以使用意图并每次都终止活动。只需在 onBackPressed() 中调用 ReturnToMain,它就会解决“不保留活动”的问题。这一直是我在海外使用外国手机时面临的问题之一。

        public void ReturnToMain() {
            Intent view_user = new Intent(PanicAddUpdate.this, PanicAddMain.class);
            view_user.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(view_user);
            finish();
        }
        

        另一个选项是@aegean 下面的解决方案。您必须将用户引导至“设置 -> 开发人员选项”以取消选中该值。这是我在对话框中使用的。确保添加finish(),这样应用程序在按下后退按钮时不会崩溃,或者在按下主页按钮后尝试重新启动应用程序。

        public void showDeveloperOptionsScreen(){
        
            new AlertDialog.Builder(this)
            .setTitle("Developer Options Detected!")
            .setMessage("In order for Sender to work properly, please uncheck the \"Don't keep activities\" option.")
            .setNegativeButton(android.R.string.no, null)
            .setPositiveButton(android.R.string.yes, new OnClickListener() {
        
                public void onClick(DialogInterface arg0, int arg1) {
                    Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                    startActivity(intent);
                    finish();
                }
            }).create().show();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-26
          • 1970-01-01
          • 1970-01-01
          • 2016-10-20
          相关资源
          最近更新 更多