【问题标题】:How to prevent activity from reloading itself when coming back after visiting other activities?访问其他活动后返回时如何防止活动重新加载?
【发布时间】:2021-02-06 22:19:37
【问题描述】:

我的应用中有 5 个不同的活动,我允许用户通过单击按钮在这些活动之间导航。主要活动中有一个RecyclerView(用于制作提要)。其他活动用于搜索、个人资料、通知等。用户打开应用程序,显示主要活动。用户可以在主活动中滚动浏览提要(即RecyclerView),现在用户决定转到其他活动、搜索、个人资料等。现在,当用户单击导航到主活动的按钮时活动,我想打开主活动并在相同的滚动位置显示回收器视图,并显示与用户刚刚关闭时相同的项目。

注意:我在这里不是在谈论按下back 按钮或使用任何goBack 功能。我想让用户能够使用主要活动并访问所有其他活动,然后他将能够返回到主要活动并完全按照他离开的方式找到提要。

在每个活动中,我有五个导航按钮,允许用户从每个活动转到每个活动:单击 profileBtn 将打开个人资料活动等。

有一种方法可以在用户想要转到其他活动之前备份主要活动中的回收站视图的状态,并在用户点击homeBtn时恢复它?

代码:

HomeActivity.java:

public void profileBtn_OnClick(android.view.View view)
{
    Intent intent = new Intent(getBaseContext(), ProfileActivity.class);
    startActivity(intent);
}

ProfileActivity.java、SerachActivity.java、NotificationsActivity.java:

public void homeBtn_OnClick(android.view.View view)
{
    /* HERE I WANT TO OPEN BACK THE HOME ACTIVITY AND DISPLAY THE FEED
       EXACTLY AS IT WAS WHEN THE USER LEFT IT, HOW DO I DO THAT? */

    Intent intent = new Intent(getBaseContext(), HomeActivity.class);
    startActivity(intent);
}

【问题讨论】:

标签: java android android-intent android-activity


【解决方案1】:

您可以使用launchMode="singleTask"

系统在新任务和路由的根目录创建活动 它的意图。但是,如果活动的一个实例已经 存在,系统将意图路由到现有实例 调用它的 onNewIntent() 方法,而不是创建一个新方法。

您可以在此处获取有关启动模式的更多信息:https://developer.android.com/guide/topics/manifest/activity-element

android:launchMode=["standard" | "singleTop" | "singleTask" | "singleInstance"]

<activity
     android:name=".ui.HomeActivity"
     android:launchMode="singleTask" />

【讨论】:

  • 使用特殊启动模式singleTasksingleInstance 不适合正常使用。这些启动模式具有微妙的副作用,这些副作用并不明显,并且通常会导致比它们解决的问题更多的问题。有关此问题的正确解决方案,请参阅我的答案。
【解决方案2】:

请不要为此使用特殊的启动模式singleTask。它带来的问题多于解决的问题。这些启动模式具有复杂的副作用,并不明显,并且会在以后给您带来更多问题。

使用标准的 Android 行为很容易解决您的问题。将您的方法更改为如下所示:

public void homeBtn_OnClick(android.view.View view)
{
    Intent intent = new Intent(getBaseContext(), HomeActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                    Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
}

CLEAR_TOP 标志告诉 Android 从任务中删除目标 Activity 之上的所有活动(在这种情况下,目标 ActivityHomeActivity

SINGLE_TOP 标志告诉 Android 不要重新创建 HomeActivity,而是重用它的现有实例。

【讨论】:

  • 如果你提到你在使用启动模式singleTask时遇到了什么样的问题,那将对其他人有好处。
  • @AmanKumar 好吧,我已经发布了无数关于使用特殊启动模式问题的答案和 cmets。主要问题是launchModetaskAffinity 之间的混淆/冲突,如果您使用特殊的启动模式并且您的应用程序有多个Activity,这会使用户感到困惑,因为会在“最近的任务”列表。但也有其他微妙的问题。
猜你喜欢
  • 2019-01-25
  • 1970-01-01
  • 2011-09-21
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多