【问题标题】:Android: Closing the application and opening it from recent listAndroid:关闭应用程序并从最近的列表中打开它
【发布时间】:2014-05-08 09:40:03
【问题描述】:

我知道这个问题已经在 SO 上被问过很多次了,所以请花一点时间再否决它。我已经通过How to remove application from recent application list?

Quitting an application - is that frowned upon?

Close application and remove from recent apps

还有许多其他关于 SO 的问题。

在我的应用程序中,我将用户登录详细信息存储在 SharedPreferences 中。基本上当我的应用程序启动时 - 活动 A - 启动屏幕将从 3 秒开始显示。然后它将转到活动 B - 用户登录页面,在按下登录时,凭据存储在 SharedPreference 中。然后它将转到活动 C - 主页。 我不希望用户每次都输入登录详细信息,因此我将它们存储在 SharedPreference 中,如果存在该值,则直接重定向到活动 C - 主页。

所以流程是这样的,

如果 SharedPreference 为空

A->B->C

如果 SharedPreference 中存在值

A->B->C, I'm checking in Activity B and when the values are present redirect it to C without making the B to come to front.

如果我从启动器打开应用程序,这一切都很好。但是,如果我从最近的列表中打开它,即使 SharedPreference 中存在这些值,它也会进入活动 B。当我从启动器或最近的列表中打开它时,活动 A(启动屏幕)不会出现。只有当我注销并打开应用程序时它才会显示。会有什么问题?

我厌倦了把<activity android:excludeFromRecents="true"> 放在最近的列表中。即使在此之后,如果我从启动器打开它,它也会进入登录页面,即 Activity B。

我在 Activity C 上像这样覆盖后退按钮

public void onBackPressed() {


    if (backPressedOnce) {
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        super.onBackPressed();
        return;
    }
    this.backPressedOnce = true;

    Toast.makeText(this, "Please press back again to exit.", Toast.LENGTH_SHORT).show();
    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            backPressedOnce = false; 

        }
    }, 3000);



} 

public void onResume()
{
    super.onResume();
    this.backPressedOnce = false ;
}

所以我有两个问题

Q1) 每次用户启动时如何让启动画面出现? Q2) 如果从最近的列表中启动,为什么即使 SharedPreference 有值,它也不会重定向到 Activity C?

很抱歉问了很长的问题,我知道这不合适。 谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

    我会把我的想法...

    1. 你为什么要检查 B 中的 sharedpreference 呢?如果您存储在 sharedprefernce 中,则将用户直接从 A 重定向到 C。

      if(sharedPreference) -> C

      其他 B -> C

    2. 当您从最近的 afaik 启动时,它会调用 onresume 而不是 oncreate,而且我相信您正在检查 oncreate,因此从最近启动时它不会执行,使用日志来了解周期也请参考活动寿命循环。

    3. 如果您不需要该活动存在,您可以调用 finish() 并将 noHistory='true' 放入清单中...

    如果我在任何地方错了,请查看这些要点并纠正我......

    谢谢,希望对你有帮助...

    【讨论】:

    • 只有在我第一次运行并注销时才能看到活动 A。如果 SharedPreferences 中存在值,则它不会启动。
    • 请参阅此答案的#2。您可以关闭 C 并从那里启动 A。如果屏幕方向发生变化,这可能是一个问题 - 您无法知道 OnResume 是由它调用还是由最近的启动调用的。哦,顺便说一句:从最近的“启动”实际上只是把应用程序带回到前面,它从来没有被杀死。如果你想杀死它,你可以在 OnPause 中使用#3。
    猜你喜欢
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多