【问题标题】:Android: Clear Activity StackAndroid:清除活动堆栈
【发布时间】:2011-10-27 20:51:28
【问题描述】:

我的应用程序中有几个活动。并且流程非常复杂。当我单击注销应用程序导航到登录屏幕时,用户可以从那里通过取消按钮退出(调用 system.exit(0)

当我退出或返回按钮时,系统会从堆栈中调用一个活动 :( 当我到达登录屏幕时如何清除堆栈中的所有活动?调用finish() 是不切实际的,因为有这么多活动和一些活动在活动时不应关闭,例如本机相机调用活动。

validateuser logoutuser = new validateuser();
logoutuser.logOut();
Intent loginscreen = new Intent(homepage.this, Login2.class);
(homepage.this).finish();
loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(loginscreen);

【问题讨论】:

标签: android android-activity stack


【解决方案1】:

当你在最后一个活动上调用startActivity 时,你总是可以使用

Intent.FLAG_ACTIVITY_CLEAR_TOP

作为该意图的标志。

阅读更多关于标志here的信息。

【讨论】:

  • 这也无济于事。我只是提出了一个不以finish()结尾的活动; :(
  • 我猜 FLAG_ACTIVITY_CLEAR_TOP 清除了顶部的活动。我的问题是底部的活动:(
  • 我想这取决于流程的实际情况。您应该在此处阅读更多信息:developer.android.com/reference/android/content/…developer.android.com/guide/topics/fundamentals/…
  • 感谢您提供正确的资源。我犯的错误是关闭登录活动。我不应该关闭它。当活动首先加载时。所以当我使用 Clear_top 标志回调它时,登录活动会清除顶部的所有活动。由于登录是第一个进入活动,它会清除之后开始的所有活动。所以宾果游戏成功了:)
  • 从文档中,FLAG_ACTIVITY_CLEAR_TOP仅在特定活动“已经在当前任务中运行”时清除堆栈
【解决方案2】:

就我而言,LoginActivity 也已关闭。结果,

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK

没有帮助。

但是,设置

Intent.FLAG_ACTIVITY_NEW_TASK

帮了我。

【讨论】:

  • 我让用户通过意图一个接一个地进行许多活动。我是否需要做任何事情来确保应用程序不会因堆栈上的太多活动而崩溃?谢谢!
【解决方案3】:

你们大多数人都错了。如果您想关闭现有的活动堆栈而不管那里有什么并创建新的根,正确的标志集如下:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

From the doc:

public static final int FLAG_ACTIVITY_CLEAR_TASK
在 API 级别 11 中添加

如果在传递给的 Intent 中设置 Context.startActivity(),此标志将导致任何现有任务 将与要在 活动开始。也就是说,活动成为一个新的根 否则为空任务,任何旧活动都已完成。这个可以 只能与FLAG_ACTIVITY_NEW_TASK结合使用。

【讨论】:

  • 完美运行。谢谢。奇怪的是 minSDK=9 没有给出错误。
  • 坦白说我从来没有使用过这个功能,崩溃后复活等,而是专注于修复导致崩溃的问题)
  • 同样的功能还提供来自支持库的IntentCompat.makeRestartActivityTask
  • 仅添加这两个标志会留下活动堆栈跟踪(从前一个标志开始),然后添加 Intent.FLAG_ACTIVITY_CLEAR_TOP 它只是重新启动应用程序然后完全退出。我没有明确地在活动中添加任何标志。可能是什么问题?
  • 最好的开端之一:“你们大多数人都错了。”
【解决方案4】:

这是一个简单的辅助方法,用于启动一个新的活动作为新的顶级活动,从 API 级别 4 一直到当前版本 17:

static void startNewMainActivity(Activity currentActivity, Class<? extends Activity> newTopActivityClass) {
    Intent intent = new Intent(currentActivity, newTopActivityClass);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        intent.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK which is only available from API level 11
    currentActivity.startActivity(intent);
}

从你当前的活动中这样称呼它:

startNewMainActivity(this, MainActivity.class);

【讨论】:

  • 难道你不能总是只使用intent.addFlags(0x8000);并简化?
  • 由于这个标志是在 Honeycomb 中首次引入的,我不知道它对早期版本可能有什么影响。所以,这是我的先兆。但我想删除条件应该不是问题。
  • 当 API 级别 Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB 否则 intent.addFlags(0x8000); 将永远不会添加
  • 我让用户通过意图一个接一个地进行许多活动。我是否需要做任何事情来确保应用程序不会因堆栈上的太多活动而崩溃?谢谢!
【解决方案5】:

Clear Activity Backstate 通过以下代码:

Intent intent = new Intent(Your_Current_Activity.this, Your_Destination_Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

完成

【讨论】:

  • 我让用户通过意图一个接一个地进行许多活动。我是否需要做任何事情来确保应用程序不会因堆栈上的太多活动而崩溃?谢谢!
  • @RuchirBaronia,如果你去 A -> B -> C -> D -> E -> F -> G -> H,现在是 H -> 你写我的代码而不是我Last Activity 之后您按下 Back 按钮应用程序将关闭,因为应用程序没有返回状态活动,希望这对您有所帮助。
  • 我需要这样做吗?如果我从不清理活动堆栈会发生什么?
  • @RuchirBaronia,后压:H -> G -> F -> E -> D -> C -> B -> A
  • 但有时它在调用新活动时显示白屏。何来解决这个问题?
【解决方案6】:
Intent intent = new Intent(LoginActivity.this, Home.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //It is use to finish current activity
startActivity(intent);
this.finish();

【讨论】:

  • 为什么你同时使用this.finish()setFlags() 来清除当前活动?
【解决方案7】:

我注意到您要求提供不依赖于finish() 的解决方案,但我想知道这是否会有所帮助。

我跟踪了一个静态类变量是否引发了退出标志,该变量在整个应用程序生命周期中都存在。在每个相关活动的onResume()中,使用

@Override
public void onResume() {
    super.onResume();
    if (ExitHelper.isExitFlagRaised) {
        this.finish();
    }
}

ExitHelper 类

public class ExitHelper {
    public static boolean isExitFlagRaised = false;
}

假设在 mainActivity 中,用户按下按钮退出 - 您可以设置ExitHelper.isExitFlagRaised = true;,然后设置finish()。此后,其他自动恢复的相关活动也将完成。

【讨论】:

  • 如果我使用 MainActivity onresume() 中的代码然后从第二个活动 onbackpress 回到 mainactivity 会发生什么
【解决方案8】:

这个决定效果很好:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

但是新活动启动时间很长,并且您会在一段时间内看到白屏。如果这很关键,请使用以下解决方法:

public class BaseActivity extends AppCompatActivity {

    private static final String ACTION_FINISH = "action_finish";

    private BroadcastReceiver finisBroadcastReceiver;

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

        registerReceiver(finisBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                finish();
            }
        }, new IntentFilter(ACTION_FINISH));
    }

    public void clearBackStack() {
        sendBroadcast(new Intent(ACTION_FINISH));
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(finisBroadcastReceiver);
        super.onDestroy();
    }
}

如何使用:

public class ActivityA extends BaseActivity {

    // Click any button
    public void startActivityB() {
        startActivity(new Intent(this, ActivityB.class));
        clearBackStack();
    }
}

缺点:所有必须在栈上关闭的activity都必须继承BaseActivity

【讨论】:

    【解决方案9】:

    对于 Xamarin 开发人员,您可以使用:

    intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);
    

    【讨论】:

      【解决方案10】:

      使用 Kotlin:

      您可以使用 setter 方法直接设置标志。在 Kotlin 中,or 是 Java 按位的 replacement|

      intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
      

      如果你打算经常使用这个,创建一个 Intent 扩展函数

      fun Intent.clearStack() {
          flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
      }
      

      然后您可以在启动意图之前直接调用此函数

      intent.clearStack()
      

      【讨论】:

        【解决方案11】:

        Intent 意图 = new Intent(LoginActivity.this,MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 开始活动(意图); 完成();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-19
          • 1970-01-01
          • 2011-09-19
          • 1970-01-01
          • 1970-01-01
          • 2012-04-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多