2

我在这里想说的是我面临的问题,即从之前离开的相同状态重新启动我的应用程序。我在这方面做了很多研发,并且已经解决了stackoverflow中发布的问题。所以请不要说它是重复的。


objIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
我尝试在开始活动时放置这些选项。我也试过这个,

objIntent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 

最后我也尝试了这种方法

    objIntent.setAction(Intent.ACTION_MAIN);
    objIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

但这些似乎都不适合我。

场景是这样的,但失败了。

  1. 我运行我的应用程序,从最初的活动中进行一些活动,比如从 A 到 B

  2. 现在我将按下我的手机主页按钮并执行一些操作,例如单击照片等。

  3. 我再次尝试从主屏幕启动应用程序。

哎呀!!现在我的应用程序没有保留它的状态,它是从初始状态启动的。

笔记:

  1. 然而,并非在所有情况下都是如此。有时说大约 10 或 15 次中的 1 或 2 次,它从之前离开的相同状态发射。

  2. 我还有一个疑问是我需要为所有意图设置这个吗?假设我有大约 10 个以上的意图位置,即开始活动。我需要在所有这些地方添加这段代码吗?我将这个包含在 2 或 3 个案例中

更新:

这在调试模式下有效,但是当涉及到 apk 创建点时,它会失败。但是,如果我尝试多次,它会给我所需的结果,然后按照预期的方式运行。打破我的头来理解为什么会这样。

有人对此有答案吗?

4

3 回答 3

2

让活动在后台运行不是你的事。当您按下主页按钮时,您当前的活动将进入后台并且可以随时终止(onDestroy() 将被调用),具体取决于您启动的其他应用程序的内存需求。

您启动的应用程序越多,杀死您的后台应用程序的机会就越大。

于 2011-12-16T11:02:56.610 回答
0

如果你想以用户离开它的相同状态“重新启动”你的应用程序,你应该在方法中保存所有应用程序状态onSaveInstanceState(Bundle),并在方法中恢复它onRestoreInstanceState (Bundle savedInstanceState)。就像之前回答中提到的 Saurabh 一样,您无法控制您的应用程序何时可能被终止。

您可以使用几种方法中的一种来“保存”您的状态 - SharedPreferences 和 SQLite DB 是突出的方法。

于 2011-12-19T04:14:47.473 回答
0

是的,终于可以了!!感谢谷歌论坛。我提到了这个https://github.com/cleverua/android_startup_activity

我根据这个做的是,创建一个启动活动。在它的 oncreate 方法中,检查一个名为 needStartApp() 的自定义方法或符合您的约定的方法。在此获取正在运行的任务信息并将其与我们的应用程序包名称进行比较。如果是真的,请开始您的初始活动。休息一切顺利。

这是您应该添加的额外活动,

public class StartupActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (needStartApp()) {
        Intent i = new Intent(StartupActivity.this, MainActivity.class);
        startActivity(i);
    }

    finish();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // this prevents StartupActivity recreation on Configuration changes 
    // (device orientation changes or hardware keyboard open/close).
    // just do nothing on these changes:
    super.onConfigurationChanged(null);
}

private boolean needStartApp() {
    final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    final List<RunningTaskInfo> tasksInfo = am.getRunningTasks(1024);

    if (!tasksInfo.isEmpty()) {
        final String ourAppPackageName = getPackageName();
        RunningTaskInfo taskInfo;
        final int size = tasksInfo.size();
        for (int i = 0; i < size; i++) {
            taskInfo = tasksInfo.get(i);
            if (ourAppPackageName.equals(taskInfo.baseActivity.getPackageName())) {
                // continue application start only if there is the only Activity in the task
                // (BTW in this case this is the StartupActivity)
                return taskInfo.numActivities == 1;
            }
        }
    } 

    return true;
   }
 }

最后,不要忘记将此权限添加到清单中

    <uses-permission android:name="android.permission.GET_TASKS" />

“Android 操作系统确实不错,但并不完美。”

于 2011-12-20T04:33:26.867 回答