【问题标题】:onBackPressed() not working while coming from another activityonBackPressed() 在来自另一个活动时不起作用
【发布时间】:2014-08-13 06:14:25
【问题描述】:

我有三项活动:第一、第二和第三。我在第二个活动中使用了这种方法:

public void onBackPressed() {
    super.onBackPressed();
    finish();
}

这在第三次活动中:

public void onBackPressed() {
    super.onBackPressed();
    Intent i = new Intent(Third.this, Second.class);
    startActivity(i);
    finish();
}

问题是当我从第三个活动后按下返回按钮时,我将进入第一个活动而不是finish()。当我在来自第一个活动后立即单击返回按钮而不是在来自第三个活动之后,我成功退出了应用程序。

如何解决这个问题?

编辑:感谢大家的回答,“Ved Prakash”的回答为我解决了这个问题。但我现在有一个奇怪的问题。当我按下后退按钮时,应用程序成功退出,但我最小化为最近的应用程序应用程序按钮出现在屏幕上并退出。例如,如果我在打开我的应用程序之前打开了设置应用程序,当我按下返回按钮时,我的应用程序正在退出,并且设置应用程序也立即打开和退出。可能是什么有问题吗?

【问题讨论】:

  • 请添加一个标签,表明您使用的语言。
  • 我不明白你在期待什么,得到什么。您在第二个活动中的 onBackPressed 没有做任何事情。 super.onBackPressed() 将关闭当前活动并完成同样的操作。
  • super.onBackPressed() 自然地调用 finish() ......这就是它的作用。它会杀死当前的活动。如果您想从第三个活动切换并终止应用程序,那么您可能应该切换到片段,而不是在替换时使用“addToBackStack(null)”方法。

标签: java android button back


【解决方案1】:

好的,你的代码是错误的。 如果您查看活动源,您会看到activity.onBackPressed() 正在调用finish()。所以如果调用 super.onBackPressed() 你不需要调用完成。 Finish() 不会停止您的应用程序,它会停止当前活动。 您在第三个活动上的代码非常奇怪。您正试图停止活动并开始另一个相同的活动。 你到底想达到什么目标?

如果你想从你的第三个活动中退出应用程序,你需要清除你的后台堆栈。但我认为你的应用程序结构有问题。

【讨论】:

  • 感谢您的解释。实际上我的第一个活动是登录活动,当我登录时我会得到第二个活动。所以当我按下第二个时我不应该得到第一个(登录)活动活动。我确实在第一个活动中调用了finish(),它在进入第二个活动后工作。但是当我进入第三个活动并再次回到第二个活动并单击返回按钮时,我将进入第一个(登录)活动再次。
  • @Ramu 在这种情况下,您不需要覆盖 onBackPressed。您只需要设置登录活动的标志“noHistory”。看这里developer.android.com/guide/topics/manifest/…。而且您将永远不会使用返回按钮返回登录活动。
【解决方案2】:

好的。那么当你像这样进行第二个活动时,你应该完成你的第一个活动(如果你正在为此使用意图):

Intent it=new Intent(FirstActivity.this,SecondActivity.class);
finish();
startactivity(it);

第二个活动也一样:

 Intent it=new Intent(SecondActivity.this,ThirdActivity.class);
 finish();
 startactivity(it);

这完成了你的工作......当你在第三个活动时,上述活动已经完成...... 当您按下 backButton 时,您将退出应用程序.. 祝你好运。

【讨论】:

    【解决方案3】:

    你可以使用 -

    public static final int FLAG_ACTIVITY_CLEAR_TOP

    如果设置,并且正在启动的活动已经在 当前任务,而不是启动该任务的新实例 活动,除此之外的所有其他活动都将关闭,并且 此 Intent 将作为 新意图。

    方法如下 -

    当用户希望退出所有打开的活动时,他们应该按下一个按钮,该按钮会加载您的应用启动时运行的第一个活动,在我的例子中是“MainActivity”。

    Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("EXIT", true);
    startActivity(intent);
    

    上面的代码清除了除LoginActivity之外的所有Activity。 LoginActivity 是用户运行程序时启动的第一个活动。然后将此代码放入 LoginActivity 的 onCreate 中,以在传递“退出”消息时发出信号。

      if (getIntent().getBooleanExtra("EXIT", false)) {
            finish();
        }
    

    这个解释部分在exit-an-android-app也有介绍。

    【讨论】:

    • 感谢您的回答,它运行良好。但我现在有一个奇怪的问题。当我按下返回按钮时,应用程序成功退出,但我最小化到最近应用程序按钮的应用程序正在进入屏幕并退出。例如,如果我在打开我的应用程序之前打开了设置应用程序,当我按下后退按钮时,我的应用程序正在退出并且立即设置应用程序也正在打开和退出。可能是什么问题?我希望你明白什么我想说。
    • 不知道我是否明白你说的。任何其他应用程序与此代码没有关系。代码很简单,只需从堆栈中清除所有活动,然后从启动活动调用完成以退出应用程序。
    【解决方案4】:

    您的问题是您似乎不了解活动的工作原理。 finish()函数结束当前Activity,然后你从backstack中接收上一个Activity。

    我的建议是您应该使用单个 Activity,并将 Fragments 保存在其中。如果您希望按“后退”按钮在显示的任何屏幕上结束应用程序,您可以执行以下操作:

    活动 XML:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/initial_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    

    保存片段的活动:

    public class InitialActivity extends FragmentActivity implements ReplaceWith
    {
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_initial);
    
            getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener()
            {
                public void onBackStackChanged()
                {
                    int backCount = getSupportFragmentManager().getBackStackEntryCount();
                    if (backCount == 0)
                    {
                        finish();
                    }
                }
            });
    
            if (savedInstanceState == null)
            {
                getSupportFragmentManager().beginTransaction().add(R.id.initial_container, new FirstFragment()).commit();
            }
        }
    
        @Override
        public void replaceWith(Fragment fragment)
        {
            getSupportFragmentManager().beginTransaction().replace(R.id.initial_container, fragment).commit();
        }
    } 
    

    片段示例:

    public class FirstFragment extends Fragment implements View.OnClickListener
    {
        private ReplaceWith activity_replaceWith;
    
        private ImageView exampleImage;
    
        public FirstFragment()
        {
            super();
        }
    
        @Override
        public void onAttach(Activity activity)
        {
            super.onAttach(activity);
            try
            {
                activity_replaceWith = (ReplaceWith) activity;
            }
            catch (ClassCastException e)
            {
                Log.e(getClass().getSimpleName(), "Activity of " + getClass().getSimpleName() + "must implement ReplaceWith interface!", e);
                throw e;
            }
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View rootView = inflater.inflate(R.layout.fragment_first, container, false);
            exampleImage = (ImageView) rootView.findViewById(R.id.fragment_first_example_image);
            exampleImage.setOnClickListener(this);
            return rootView;
        }
    
        @Override
        public void onClick(View v)
        {
            if(v == exampleImage)
            {
                activity_replaceWith.replaceWith(new SecondFragment());
                    //please note that this should be done only if you are planning
                    //only on single-screen applications 
                    //with no other layouts based on orientation or size
                    //otherwise, the Activity needs to be responsible for this, not the Fragment
            }
    
        }
    }
    

    这样,当您按下返回按钮时,您的应用程序将从任何显示的屏幕结束。

    【讨论】:

    • 应用程序结束的原因是Fragment没有放入backstack。如果您需要它让 Back 按钮返回到上一个 Fragment,请在 commit() 之前调用 addToBackStack(null)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多