Java 如果用户手动终止应用程序,则从其离开的位置恢复活动

Java 如果用户手动终止应用程序,则从其离开的位置恢复活动,java,android,android-activity,android-lifecycle,Java,Android,Android Activity,Android Lifecycle,我正在开发一个应用程序,其中我从活动A(主要活动)转到活动B再转到活动C。 所有这些都可以正常工作,但当用户通过从任务托盘中移除应用程序而终止应用程序时,就会出现问题 为了理解我的问题,假设用户从A移动到B,然后移动到C,但在完成活动C中的任务之前,用户杀死了该应用程序。 因此,当用户再次按应用程序图标打开应用程序时,我想启动上一个活动C,即用户停止应用程序时的位置,而不是android默认的再次启动(主活动A)新应用程序实例的行为 我所尝试的: 1) 我试着使用“onSaveInstanceS

我正在开发一个应用程序,其中我从活动A(主要活动)转到活动B再转到活动C。 所有这些都可以正常工作,但当用户通过从任务托盘中移除应用程序而终止应用程序时,就会出现问题

为了理解我的问题,假设用户从A移动到B,然后移动到C,但在完成活动C中的任务之前,用户杀死了该应用程序。 因此,当用户再次按应用程序图标打开应用程序时,我想启动上一个活动C,即用户停止应用程序时的位置,而不是android默认的再次启动(主活动A)新应用程序实例的行为

我所尝试的:

1) 我试着使用“onSaveInstanceState”和“onRestoreInstanceState”,但我认为它们在方向改变或按下后退按钮返回时使用

2) 我试图在“onPause”中保存所有内容,因为当活动被破坏时,onPause调用了99.99%的次数,通过使用静态标志,我打开了最后一个活动,它对我起到了作用,但我希望这项工作有一些好的示例或技巧

那么,有谁能帮助我实现同样的目标呢

我请其他成员提供代码示例


提前感谢。

当进程即将终止时,系统将保存用于启动活动的意图。一旦用户返回已终止的应用程序,则应用程序将恢复,并触发相同的意图(在您的情况下为活动A)以启动活动,包括其可能具有的所有额外功能

选择SharedPreferences:
请参阅官方文档。

当进程即将终止时,系统将保存用于启动活动的意图。一旦用户返回已终止的应用程序,则应用程序将恢复,并具有相同的意图(在您的情况下为活动A)被激发以启动活动,包括它可能拥有的所有额外功能

选择SharedPreferences:
请参阅官方文档。

您可以使用SharedReferences存储上次用户状态。@onPause活动

SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME,  MODE_PRIVATE).edit();
editor.putString("state", "A/B/C");   
editor.commit();
恢复活动

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String stateApp = prefs.getString("state", null);

if (stateApp != null) {
   switc(stateApp){
      case 'A':
        // Go TO A activity
        break;

      case 'B':
        // Go TO B activity
        break;
      default:
       // Go TO C activity
        break;

   }
}

您可以使用SharedReferences存储上次用户状态。@onPause活动

SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME,  MODE_PRIVATE).edit();
editor.putString("state", "A/B/C");   
editor.commit();
恢复活动

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String stateApp = prefs.getString("state", null);

if (stateApp != null) {
   switc(stateApp){
      case 'A':
        // Go TO A activity
        break;

      case 'B':
        // Go TO B activity
        break;
      default:
       // Go TO C activity
        break;

   }
}

在每个
活动的
@onPause()
中存储状态

因此,在每个
活动中
都需要:

@Override
protected void onPause() {
    super.onPause();

    SharedPreferences prefs = getSharedPreferences("RESTART", MODE_PRIVATE);
    Editor editor = prefs.edit();
    editor.putString("last_left", getClass().getName());
    editor.commit();
}
和一个
Shell
活动,它将是一个启动器,主要活动:

public class Shell extends Activity {

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

        Class<?> classActivity;

        try {
            SharedPreferences prefs = getSharedPreferences("RESTART", MODE_PRIVATE);
            classActivity = Class.forName(prefs.getString("last_left", getClass.getName()));
        } 
        catch(ClassNotFoundException ex) {
            classActivity = your_Activity1.class;
        }

        startActivity(new Intent(this, classActivity));
    }
}
公共类Shell扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
课堂活动;
试一试{
SharedReferences prefs=GetSharedReferences(“重启”,模式为私有);
classActivity=Class.forName(prefs.getString(“最后一个左键”,getClass.getName());
} 
捕获(ClassNotFoundException ex){
classActivity=你的活动1.class;
}
startActivity(新意图(此,类活动));
}
}

[源代码修改]

将状态存储在每个
活动的
@onPause()

因此,在每个
活动中
都需要:

@Override
protected void onPause() {
    super.onPause();

    SharedPreferences prefs = getSharedPreferences("RESTART", MODE_PRIVATE);
    Editor editor = prefs.edit();
    editor.putString("last_left", getClass().getName());
    editor.commit();
}
和一个
Shell
活动,它将是一个启动器,主要活动:

public class Shell extends Activity {

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

        Class<?> classActivity;

        try {
            SharedPreferences prefs = getSharedPreferences("RESTART", MODE_PRIVATE);
            classActivity = Class.forName(prefs.getString("last_left", getClass.getName()));
        } 
        catch(ClassNotFoundException ex) {
            classActivity = your_Activity1.class;
        }

        startActivity(new Intent(this, classActivity));
    }
}
公共类Shell扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
班级活动;
试一试{
SharedReferences prefs=GetSharedReferences(“重启”,模式为私有);
classActivity=Class.forName(prefs.getString(“最后一个左键”,getClass.getName());
} 
捕获(ClassNotFoundException ex){
classActivity=你的活动1.class;
}
startActivity(新意图(此,类活动));
}
}

[Source Modified]

尝试使用SharedReferences概念,在打开该活动时将活动名称保存在SharedReferences中,然后在重新打开应用程序时检查SharedReferences值。我想你明白了! 示例教程链接:

尝试使用SharedReferences概念,在打开该活动时将活动名称保存在SharedReferences中,然后在重新打开应用程序时检查SharedReferences值。我想你明白了! 示例教程链接:

尝试使用SharedReferences概念,在打开该活动时将活动名称保存在SharedReferences中,然后在重新打开应用程序时检查SharedReferences值。我想你明白了!您走上了正确的道路。@W4R10CK感谢您的ans,您的方法是正确的,但正如我已经提到的,我已经尝试过这个方法,并且效果很好。所以,别介意,我正在寻找更好的解决办法,我的问题是,是否有人能提供更好的方法来解决这个问题。@RajatPorwal,我建议悬赏。你会发现这个问题更有吸引力。!尝试使用SharedReferences概念,在打开该活动时将活动名称保存在SharedReferences中,然后在重新打开应用程序时检查SharedReferences值。我想你明白了!您走上了正确的道路。@W4R10CK感谢您的ans,您的方法是正确的,但正如我已经提到的,我已经尝试过这个方法,并且效果很好。所以,别介意,我正在寻找更好的解决办法,我的问题是,是否有人能提供更好的方法来解决这个问题。@RajatPorwal,我建议悬赏。你会发现这个问题更有吸引力。!我认为,只有当系统关闭应用程序时才是这样。i、 e.当资源不足时。是的,但问题是“所有这些都可以正常工作,但当用户通过从任务托盘中删除应用程序时,问题就会出现。”。这类似于手动从任务托盘中删除应用程序。我认为,只有当系统关闭应用程序时才是这样。i、 e.当资源不足时。是的,但问题是“所有这些都可以正常工作,但当用户通过将应用程序从任务托盘中移除而终止应用程序时,问题就会出现。”。这类似于手动k