来自另一个活动时,onBackPressed()无法正常工作

时间:2014-06-23 08:58:10

标签: java android button back

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

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”的答案为我解决了问题。但我现在有一个奇怪的问题。当我按下后退按钮时,应用程序已成功退出,但我最小化的应用程序应用程序按钮即将进入屏幕并退出。例如,如果我在打开我的应用程序之前打开设置应用程序,当我按下后退按钮时,我的应用程序正在退出并立即设置应用程序也打开并退出自己。可能是什么问题

4 个答案:

答案 0 :(得分:1)

您的问题是您似乎无法理解活动的运作方式。 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
        }

    }
}

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

答案 1 :(得分:0)

好的,你的代码错了。 如果您查看活动源,您会看到activity.onBackPressed()正在调用finish()。因此,如果调用super.onBackPressed(),则不需要调用finish。 Finish()不会停止您的应用程序,它会停止当前活动。 你的第三个活动的代码非常奇怪。您正试图停止活动并开始另一项相同的活动。 你究竟想要实现什么目标?

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

答案 2 :(得分:0)

确定。那么当你去第二个这样的活动时你应该完成你的第一个活动(如果你正在使用它的意图):

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

和第二活动相同:

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

这完成了你的工作......当你参加第三项活动时,上述活动已经完成。 当你按BackButton时,你将退出应用程序.. 祝你好运。

答案 3 :(得分:0)

您可以使用 -

  

public static final int FLAG_ACTIVITY_CLEAR_TOP

     

如果设置,则正在启动的活动已在运行中   当前任务,然后而不是启动它的新实例   活动,其上的所有其他活动将被关闭   这个意图将作为一个传递到(现在在顶部)旧活动   新的意图。

以下是 -

当用户希望退出所有打开的活动时,他们应该按下一个按钮,加载应用程序启动时运行的第一个活动,在我的情况下为“MainActivity”。

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

上面的代码清除除LoginActivity之外的所有活动。 LoginActivity是用户运行程序时提出的第一个活动。然后将此代码放入LoginActivity的onCreate中,以便在传递“Exit”消息时自动解压缩信号。

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

此解释部分也在exit-an-android-app引入。