从android中的堆栈中删除一个活动

发布于 2024-12-05 05:23:53 字数 496 浏览 1 评论 0原文

我想使用代码从堆栈中删除活动。这是我的案例

  1. 从页面 AI 前往页面 B。
  2. 我必须使用返回按钮从页面 B 返回到页面 A。
  3. 在页面 BI 中,有一个按钮可以转到页面 C。
  4. 当我点击页面 B 中的按钮时,我正在拨打电话
finish(); //to remove PageB from stack

“好的,这是问题所在”,从页面 C 当我单击返回按钮时,我会被带到页面 A。因为它在堆栈中。

当我单击页面 B 中的按钮时,我想从堆栈中删除页面 A。

请注意,在调用页面 B 时,我无法在页面 A 中调用 finish(),因为我想返回到页面 A。唯一的情况是我不想返回是当页面B中的按钮被点击时。

我怎样才能在安卓中做到这一点? 谢谢

I want to remove an activity from stack using code.Heres my case

  1. From page A I am going to page B.
  2. From page B i have to return to page A using return button.
  3. In page B I am having a button which takes to page C.
  4. When I click that button in page B , I am calling
finish(); //to remove PageB from stack

Ok, Here is the issue, From Page C when I click the return button I am taken to page A. because it is in stack.

I want to remove Page A from stack when I click the button in page B.

Please note that I cant call a finish() in page A when calling Page B because I want to return back to page A. Only case I dont want to return is when the button in page B is clicked.

How can I do this in android?
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

过气美图社 2024-12-12 05:23:53

当启动 B 时,不要在 A 中调用 startActivity,而是调用 startActivityForResult。然后,在 A 的活动中,处理 onActivityResult

现在,在 B 中,当您打开 C 时,调用 setResult 在调用完成之前。这将允许您设置一些数据以传递回 A 的 onActivityResult 方法。传递一个标志来指示 A 应该关闭自身,然后调用 finish。在 A 的 onActivityResult 中处理该标志。

这样,每个活动都负责自行关闭,并且您不会人为地弄乱返回堆栈。使用意图标志在简单的 A、B、C 情况下工作得很好,但如果这 3 个屏幕是更大解决方案的一部分(即 A、B 和 C 位于您不希望的活动堆栈的深处,则可能会崩溃)搞乱)。

Rather than calling startActivity in A when you start B, call startActivityForResult. Then in, your activity for A, handle onActivityResult.

Now, in B, when you open C, call setResult before calling finish. This will allow you to set some data to get passed back to A's onActivityResult method. Pass a flag to indicate that A should close itself and then call finish. Handle that flag in A's onActivityResult.

This way, each activity is responsible for closing itself and you're not artificially messing with the back stack. Using intent flags work fine in a simple A,B,C case, but will probably fall apart if these 3 screens are part of a larger solution (i.e. A,B and C are deep under a stack of activities you don't want to mess with).

久伴你 2024-12-12 05:23:53

您可以通过启动 Intent 直接跳转到另一个 Activity,而不是完成当前的 Activity。

Intent intent = new Intent(this, MyTarget.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

Instead of finishing the current Activity you can jump directly to another Activity by starting an Intent.

Intent intent = new Intent(this, MyTarget.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
月棠 2024-12-12 05:23:53

您可以使用 startActivity() 从 B 再次调用 A。

You can use startActivity() to call A again from B.

塔塔猫 2024-12-12 05:23:53

当然此页面上有更好的答案但是,作为解决方法,您可以使用 SharedPreferences 将消息传递给 Activity A,请求它也完成。

活动 A:

public class A extends Activity {

  public static final String CLOSE_A_ON_RESUME = "CLOSE_A_ON_RESUME";

  @Override
  public void onResume(){
    super.onResume();

    //Retrieve the message
    SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    boolean IShouldClose=mPrefs.getBoolean(A.CLOSE_A_ON_RESUME,false);

    if (IShouldClose){

       //remove the message (will always close here otherwise)
       mPrefs.edit().remove(A.CLOSE_A_ON_RESUME).commit();

       //Terminate A
       finish();
    }
}

活动 C:

public class C extends Activity {

  /*
   * Stores an application wide private message to request that A closes on resume
   * call this in your button click handler
   */
  private void finishCthenA(){

    //Store the message
    SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    mPrefs.edit().putBoolean(A.CLOSE_A_ON_RESUME,true).commit();

    //finish C
    finish();
}

请注意,这有一定的风险,因为首选项在重新启动后仍然存在,并且如果您的应用程序在 A 之前被终止,它可能会阻止 A 启动继续。
要解决此问题,您还应该删除 A.onCreate() 中的消息

Surely there is a better answer on this page but, as a workaround, you could use SharedPreferences to pass a message to Activity A, requesting that it also finishes.

Activity A:

public class A extends Activity {

  public static final String CLOSE_A_ON_RESUME = "CLOSE_A_ON_RESUME";

  @Override
  public void onResume(){
    super.onResume();

    //Retrieve the message
    SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    boolean IShouldClose=mPrefs.getBoolean(A.CLOSE_A_ON_RESUME,false);

    if (IShouldClose){

       //remove the message (will always close here otherwise)
       mPrefs.edit().remove(A.CLOSE_A_ON_RESUME).commit();

       //Terminate A
       finish();
    }
}

Activity C:

public class C extends Activity {

  /*
   * Stores an application wide private message to request that A closes on resume
   * call this in your button click handler
   */
  private void finishCthenA(){

    //Store the message
    SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    mPrefs.edit().putBoolean(A.CLOSE_A_ON_RESUME,true).commit();

    //finish C
    finish();
}

Note that this is somewhat risky since the preferences survive the reboots and it can prevent A to start if, for example, your application is killed before A resumes.
To work around this, you should also remove the message in A.onCreate()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文