【问题标题】:Check whether an activity is active or not from a different activity从不同的活动中检查活动是否处于活动状态
【发布时间】:2014-11-13 09:14:58
【问题描述】:

我的应用程序中有这样的流程:

对于新用户:

启动画面 --> 登录活动 --> 主页活动

对于已经注册的用户:

启动画面 --> 主页活动

基本上,启动画面有一个 if else 来决定去哪个活动。一旦用户第一次登录,他的状态就会保存在一个首选项变量中,以便启动屏幕决定下次不打开登录活动。

现在的情况就是这样。如果新用户登录并进入家庭活动,然后注销。他被重定向到登录屏幕,这几乎是应该发生的。但是,如果现有用户打开应用程序,他会看到启动画面并直接移动到 Home Activity。现在,如果用户注销,他就会退出应用程序。发生这种情况是因为 Login Activity 没有创建任何实例,因此完成 Home Activity 会完成整个应用程序。注销实际上完成了 Home Activity,自然应该打开最后一个活动的活动。这没有发生。

我想做的是,我想实现一个逻辑来检查登录活动是否可用。如果可用,则将调用 finish(),否则将通过 Intent 调用登录活动。

请告诉我如何做到这一点。

P.S:我的应用使用自定义主题和自定义操作栏。如果我同时调用完成和意图,或者我使用标志来清除现有活动,则会出现奇怪的过渡效果,会在瞬间显示黑色标准操作栏,从而造成糟糕的用户体验。

【问题讨论】:

    标签: java android android-activity activity-lifecycle activity-finish


    【解决方案1】:

    现在,如果用户退出,他就会退出应用程序。发生这种情况是因为 登录活动没有创建任何实例,因此 完成 Home Activity 完成整个应用程序。

    如果我理解你的问题,为什么不在用户点击logout 按钮后手动调用Login Activity

    对于像你这样的应用程序,我一直都是这样做的

    【讨论】:

    • 因为,如果用户是新用户,他已经创建了登录活动的实例,如果我再次调用登录活动,那么它正在堆叠登录活动。将有多个登录活动实例,这将破坏整个流程。
    • @kittu88 为什么每次登录活动转到家庭活动时不打电话给finish?所以不会有“多实例”
    • 我希望我能做到。我试过了,实际上我在我的应用程序中使用了一个自定义主题,主题还有一个自定义的操作栏,如果我完成活动并调用另一个意图,那么过渡会在一瞬间显示一个黑色的操作栏,这将是一个非常糟糕的用户体验。
    • @kittu88 我明白了..所以你不能在任何地方打电话给finish? (因为所有活动都使用自定义主题)
    • @kittu88 更新您的问题以告诉您的custom theme 问题会很有用,这样人们就可以看到它并更好地帮助您:)
    【解决方案2】:

    当用户登录完成登录活动并开始家庭活动时。 当用户注销完成家庭活动并开始登录活动时

    【讨论】:

    • 我希望我能做到。我试过了,实际上我在我的应用程序中使用了一个自定义主题,主题还有一个自定义的操作栏,如果我完成活动并调用另一个意图,那么过渡会在一瞬间显示一个黑色的操作栏,这将是一个非常糟糕的用户体验。
    • 第一次开始活动而不是完成当前活动,这要显示空白操作栏。试试看
    • 嘿朋友,它不显示操作栏,而是堆叠登录活动
    • 当您从登录移动到家时只需完成登录活动,当您注销时只需完成家庭活动并开始登录活动,它就会起作用
    • 我不能那样做,因为有某些活动和服务依赖于登录活动,完成它会沉没整艘船!
    【解决方案3】:

    您始终可以通过意图调用登录活动。如果活动可用,android 将显示此活动。否则 android 将自动创建新活动。 实际上这就是我们使用意图来显示活动而不是手动创建活动的原因。系统捕捉到这个意图并做所有脏活。

    【讨论】:

    • 我已经按照您建议的方式对其进行了测试,并且可能会注意到堆叠。
    • 哦,对不起,我以为你怕双创活动。然后你需要使用标志来表示意图。如 FLAG_ACTIVITY_CLEAR_TASK 或 FLAG_ACTIVITY_CLEAR_TOP。有关更多信息,请阅读文档developer.android.com/reference/android/content/Intent.html
    • 这真的很奇怪。你能展示你的风格代码吗?
    • ActionBar 没有样式。您可能会以编程方式更改样式吗?
    • yeah // 设置动作栏 ActionBar bar = getActionBar(); bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#009945"))); bar.setTitle("学习故事"); bar.setIcon(R.drawable.statusbar_icon); int titleId = getResources().getIdentifier("action_bar_title", "id", "android"); TextView yourTextView = (TextView) findViewById(titleId); yourTextView.setTextColor(getResources().getColor(R.color.white_colour)); yourTextView.setTypeface(TypeFaceController.titleFace(getApplicationContext()));
    【解决方案4】:

    编辑:

    嗯,但你不会有过渡问题吗? (如果您已经登录,然后退出 - 使用 intent/finish() 您将遇到相同的黑色操作栏问题吗?)

    也许考虑以下(我实际上是在我的应用程序中这样做的):

    将启动画面和登录合并到一项活动中,具体取决于您是否已登录 - 显示登录字段或进入主屏幕。然后,无论用例如何,您都有一个开箱即用的一致活动堆栈,并且没有 mambo-jumbo 我是否已经拥有这个。


    由于缺少 4 个代表,我无法发表评论,所以我将在此处发布作为答案:

    我认为@Blaze Tama 是对的。您还可以在意图上使用 FLAG_ACTIVITY_CLEAR_TOP 以避免堆栈流问题:

    来自文档:

    如果设置了,并且正在启动的 Activity 已经在当前任务中运行,那么不会启动该 Activity 的新实例,而是关闭它之上的所有其他 Activity,并且此 Intent 将被传递到(现在在顶部)作为新 Intent 的旧活动。

    【讨论】:

    • 我希望我能做到。我试过了,实际上我在我的应用程序中使用了一个自定义主题,主题还有一个自定义的操作栏,如果我完成活动并调用另一个意图,那么过渡会在一瞬间显示一个黑色的操作栏,这将是一个非常糟糕的用户体验。
    【解决方案5】:

    如果用户已经登录,则始终启动登录活动并立即启动主页活动。

    在启动画面活动中

    Intent intent = new Intent(this, Login.class);
    If (user already logged in)
    {
        intent.putextra("Logged in", true);
    }
    
    startActivity(intent); 
    

    在登录活动中

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    
        Intent intent = getIntent();
        if (intent != null)
        {
            if (intent.getBooleanExtra("Logged in", false))
            {
                startActivityForResult(new Intent(this, Home.class), requestCode);
            }
        }
        else
        {
            // The existing code here
        }
    }
    

    在主页活动中发回一个代码以指示用户是注销还是只是 BackPress。如果 BackPress 完成此登录活动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 2019-12-10
      • 2013-04-06
      • 1970-01-01
      • 2021-11-28
      • 2012-06-02
      • 2017-12-30
      相关资源
      最近更新 更多