【问题标题】:open last activity when the app is killed当应用程序被杀死时打开最后一个活动
【发布时间】:2024-04-13 11:40:02
【问题描述】:

然后在我的应用程序中有 103 个活动,按顺序 SplashActivity -> 菜单 ---> Q_001 ---> Q_002 ... (...) ..... Q_finish。 在每个活动中,我都有一个用于退出应用程序的按钮(如主页按钮),以及一个返回菜单的按钮。 现在我希望如果用户杀死该应用程序,并在另一个时间打开它返回到正在使用的活动,

我知道我必须尝试更改 SpalshActivity 你正在做的最后一个活动,如果你没有进行任何活动来继续他的工作 这是SplashActivity的代码:

package org.somename;



import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle TravisIsAwesome) {
        super.onCreate(TravisIsAwesome);
        setContentView(R.layout.splash);



        Thread logoTimer = new Thread (){


            @Override
            public void run(){
                try{
                    sleep(500);
                    Intent menuIntent = new Intent("org.somename.MENU");
                    startActivity(menuIntent);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                finally{
                    finish();

                }
            }
    };

    logoTimer.start();


    }






    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

继续说我不关心保存活动菜单,而是保存从“Q_001”开始到结束活动“Q_finish”的所有活动。我尝试使用新的这种方法:我在上一个问题中提出了建议并且我已经实现了这个代码:

package org.somename;



import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle TravisIsAwesome) {
        super.onCreate(TravisIsAwesome);
        setContentView(R.layout.splash);

         int last_activity = getLastActivityIdFromSharedPreferences();
            if (last_activity == 1)
            {
                this.startActivity(new Intent(this, Q_001.class));
                finish();
            }

            int last_activity2 = getLastActivityIdFromSharedPreferences2();
            if (last_activity2 == 2)
            {
                this.startActivity(new Intent(this, Q_002.class));
                finish();
            }

        Thread logoTimer = new Thread (){


            @Override
            public void run(){
                try{
                    sleep(500);
                    Intent menuIntent = new Intent("org.somename.MENU");
                    startActivity(menuIntent);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                finally{
                    finish();

                }
            }
    };

    logoTimer.start();


    }






    private int getLastActivityIdFromSharedPreferences2() {
        // TODO Auto-generated method stub
        return 2;
    }






    private int getLastActivityIdFromSharedPreferences() {
        // TODO Auto-generated method stub
        return 1;
    }






    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

但它不是 SplahActivity 的一部分,并且不会返回执行的 Activity。 直接进入菜单,SplahActivity 为空白页

提前致谢

【问题讨论】:

  • 1.在 Android 中,启动画面通常是不受欢迎的(阅读此内容,例如:cyrilmottier.com/2012/05/03/…) 2. 103 活动!听起来你有一个设计问题!如果你能解释一下你的应用到底在做什么,我们可能会帮助你... 3. menuIntent 到底在做什么?
  • 我正在开发一个测验,103活动中有100个问题
  • 每个测验问题真的很复杂吗?喜欢视频+绘画?还是只是琐碎的追求测验?
  • 每个Activity都有一个webview和4个按钮

标签: android android-activity kill


【解决方案1】:

我同意@2Dee。

我认为,首先你的想法是,你并没有真正学习当前的 Android 开发。我想大多数人会选择一项用于启动的活动(如果您真的需要一项),另一项活动用于按住 100 个按钮。这 100 个按钮将保存在一个查看器中。一开始理解起来有点复杂,但在我看来,这是要走的路。视图寻呼机将回收利用,是高效且强大的工具。

但也许你正在做学校练习?

编辑:我看到了 2 种方法,可能有人能找到更好的方法。

  1. 您可以保存在用户所在的内存中。当用户单击退出时,只需将当前问题保存在 SharedPreferences 中并在开始时检索它:sharedPreferences
  2. 您可以让单击退出按钮只调用 onBackPressed() 并可能覆盖 onBackPressed。如果你这样做,活动将被发送到后台,用户将被发送到主页。如果他回到它,它将在最后一个活动上重新开始。您仍然必须保存它,以防用户终止应用或 Android 终止应用以进行资源管理。

编辑 2:

在 Splash Activity 中,您检索一个整数。在主要活动中(拿着问题和按钮的活动)你问题编号。

这给出了类似的东西:

飞溅活动:

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

   // Restore preferences
   SharedPreferences settings = getSharedPreferences(LAST_QUESTION, 0);
   int number = settings.getInt("last_question", 1); // default value is to start again
   goToQuestionNumber(number); // you better call this in onResume(). 
}

在onClik()启动的退出方法中

 SharedPreferences settings = getSharedPreferences(LAST_QUESTION, 0);
  SharedPreferences.Editor editor = settings.edit();
  editor.putInt("last_question", currentQuestionNumberThatYouShouldKnow);

【讨论】:

  • 不,我不是在做学术练习,我只是想在应用死机时打开最后一个活动
  • 但是由于我的起始页是一个启动页面,所以我希望得到比我更有经验的你的帮助
  • 我编辑了。我希望你会在我给你的链接中找到足够的代码。问我是否需要更多。
  • here点点滴滴,尝试自己搜索更多。它是一个你自己定义的字符串:private String LAST_QUESTION = "lastQuestionUserDid"; 定义一个常量用于代码维护是一个好习惯。
  • goToQuestionNumber 是您必须自己编写的方法。仔细查看@2Dee 的答案,您需要在里面做很多事情才能获得更普遍的看法。但我认为你现在应该开始自己做几个小时的事情并尝试理解。您应该学习下载和运行许多虚拟项目,以了解您可以做什么并拥有完整的应用程序代码。比尝试在 *.com 上完成所有工作要好。这是给你的:github.com/commonsguy/cw-omnibus尝试运行他的一些项目(viewpager 等)。看他的代码。爱那个男人!!
【解决方案2】:

好的,正如我所想,我认为您需要重新考虑您的应用架构 :)

制作一个活动和一个片段。 Activity 将负责在视图中切换 Fragment 并创建它们。它还将包含对 webview 所需的 url 的引用。

这是我会做的方式(但它可能需要对您的代码进行完全重构 - 如果您考虑一下,这不是一个糟糕的练习):

在活动中:

// declare your urls in the res/values/strings.xml and use them here.
private int[] webViewsUrls = {R.string.url1, R.string.url2, ...}; 

在 Activity 的 onCreate 中:

SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0);
int activityIndex = prefs.getInt("lastActivityIndex", 0);
QuestionFragment fragment = new QuestionFragment();
Bundle bundle = new Bundle();
bundle.putInt("INDEX", activityIndex);
bundle.putString("WEBVIEW_URL", webViewsUrls[activityIndex]);
fragment.setArguments(bundle);
// Show fragment

在 Activity 布局中向 ViewGroup 添加新的 Fragment(如果您不使用 ViewPager 而是使用按钮来更改视图中的问题):

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
// create you fragment using the method I give above
fragmentTransaction.add(R.id.fragment_container_in_activity_layout, fragment, STRING_FRAGMENT_TAG);
fragmentTransaction.commit();

要替换已在视图中的片段,请使用 replace 方法而不是 add。

单击按钮或在 ViewPager 中,更改视图中的 Fragment,并且在启动 Fragment 时不要忘记在 SharedPreferences 中保存 activityIndex 的新值。

我相信@Poutrathor的建议很好,如果你想使用ViewPager,你可以参考我昨天给的this answer,我认为它比拥有100多个活动更符合你的要求。

【讨论】:

  • 我相信我会考虑你的帮助,但我想在另一个时间,因为我的应用程序几乎完成了我只是在寻找一种方法来记住最后一个正在关闭的活动,但感谢您的帮助
  • 我敦促您重新考虑,考虑一下:如果您的应用需要更新,您有 103 个类要修改和 103 个布局文件要编辑。使用 ViewPager 和 Fragments,您有 2 个类和 2 个要修改的布局文件。它也会让你的 apk 更轻。就我而言,这绝对是明智之举;)
  • 你知道你是对的,并且通过上述方式你可以重新打开用户关闭的最后一个会话?
  • 是的,当你的activity启动时,它会检查activityIndex是否存在,并将相应的Fragment添加到应该包含它的ViewGroup中,或者添加默认的第一个Fragment,这就是prefs中的0 .getInt,如果 SharedPrefs 不包含键为 lastActivityIndex 的 int,则将索引设置为第一个元素...不要忘记将新索引保存在 Fragment 的 onStart 中,让魔术发生;)这样,您也摆脱了顺便说一句,SplashActivity。