14

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

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

提前致谢..

4

7 回答 7

22

导入以下包

import android.provider.Settings;

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

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

你可以用这个来改变它:

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

希望能帮助到你

于 2012-10-19T14:54:11.963 回答
15
    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;
}
于 2013-03-15T09:24:34.740 回答
14

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

于 2012-07-25T12:57:49.487 回答
9

我同意@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);
}
于 2013-04-12T07:11:10.577 回答
7

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

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

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

于 2012-08-10T02:33:40.257 回答
1

您还可以使用意图并每次都终止活动。只需在 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();
}
于 2014-02-15T00:46:53.077 回答
1

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

于 2013-09-26T07:01:15.283 回答