重新启动我的应用程序从同一状态失败,哎呀:(

时间:2011-12-16 10:54:43

标签: android android-activity android-intent flags relaunch

我想在这里说的是我面临的问题,即重新启动我的应用程序来自之前留下的状态。我已经做了很多研发并且已经完成了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. 我再次尝试从主屏幕启动应用程序。

  4. 糟糕!!现在我的应用程序尚未保留其状态,它从初始状态启动。

    注意:

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

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

    3. 更新

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

      任何人都有答案吗?

3 个答案:

答案 0 :(得分:2)

保持在后台运行的活动不在您手中。当您按下主页按钮时,您当前的活动会转到后台并且可以随时被杀死(onDestroy()将被调用),具体取决于您启动的其他应用程序的内存需求。

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

答案 1 :(得分:0)

如果您希望以与用户相同的状态“重新启动”您的应用,则应在onSaveInstanceState(Bundle)方法中保存所有应用状态,并使用onRestoreInstanceState (Bundle savedInstanceState)方法将其恢复。就像上一个回答中提到的Saurabh一样,你无法控制你的应用何时会被杀死。

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

答案 2 :(得分: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操作系统非常好,但并不完美。”