在关闭应用之前处理最后一次点击的最合适方式是什么

时间:2015-07-08 20:52:34

标签: android performance android-fragments android-lifecycle back-stack

我正在尝试实施确认消息以退出我的应用。我需要这个,因为有人可能会不小心点击后退按钮多次,这将关闭应用程序,如果内存不足,它将在此之后被杀死,因为现在它不在前台。
我尝试了不同的方法,但其中一些需要大量检查,其他方法根本不起作用 我曾尝试使用onKeyDown事件,onBackPressed ...
问题是因为我不仅仅处理活动,还处理嵌套片段(内部活动) 我需要在退出之前处理最后一次按下后退的点击,这意味着当前活动的所有片段都必须从堆栈中弹出,而且还必须弹出活动,如果这不是最后一个活动,则执行相同操作对于前面的活动,直到这不是最后一个活动,并且所有碎片都会弹出 我该如何实现呢?我试图用背板做这件事,但不幸的是没有成功 请建议处理此类事件的最佳方法。我想有一种简单的方法可以做到这一点。

3 个答案:

答案 0 :(得分:1)

基本覆盖主要活动中的onBackPressed(),如果用户选择“否”退出应用,则无法调用父super.onBackPressed()

代码建议:

@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
        .setTitle("Exiting app?")
        .setPositiveButton("Yes", new OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                // user really do want to exit
                MainActivity.super.onBackPressed();
            }
        }).create().show();
     // If negative, show a Fragment or do nothing
}

答案 1 :(得分:1)

我不确定,但我认为您可以使用整数来计算您的片段,在添加新片段时增加它,并在每次背压时减少。它可能是这样的:

@Override public void onBackPressed() { 
if( fragCount > 0) {
    --fragCount;
    super.onBackPressed();
    return;
}

new     AlertDialog.Builder(this) .setTitle("Exiting app?") .setPositiveButton("Yes", new OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { // user really do want to exit    
 MainActivity.super.onBackPressed(); } }).create().show();
 }

注意:抱歉打字不好我正在打电话。

答案 2 :(得分:1)

感谢大家的答案和建议 通过在堆栈中使用片段计数,我达到了预期的结果 至于我的主要活动将是第一个活动,最后一个活动是退出,我可以在其中覆盖onBackPressed方法。
所以解决方案很简单。

public class MainActivity extends BaseSingleFragmentActivity {
    @Override
    public void onBackPressed() {
        if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
            new AlertDialog.Builder(this)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .setTitle(R.string.title_exit_message)
                    .setMessage(R.string.message_exit)
                    .setPositiveButton(R.string.button_text_yes, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            MainActivity.super.onBackPressed();
                        }
                    })
                    .setNegativeButton(R.string.button_text_no, null)
                    .show();

        } else {
            MainActivity.super.onBackPressed();
        }
    }
} 

因此,只有当您的活动在活动堆栈中排在最后时才会起作用,因此您必须将其覆盖启动器活动,而不是某些基本活动类或其他活动。

我的想法有点改进。

 package com.crosp.solutions.qrcodereader.dialogs;

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.util.Log;

import com.crosp.solutions.qrcodereader.R;
import com.crosp.solutions.qrcodereader.constants.FragmentConstants;

/**
 * Created by crosp on 7/9/15.
 */
public class ConfirmationDialog extends DialogFragment implements DialogInterface.OnClickListener {
    private OnConfirmDialogClickListener mOnConfirmDialogListener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mOnConfirmDialogListener = (OnConfirmDialogClickListener) activity;
        } catch (ClassCastException ex) {
            Log.e(getString(R.string.error_tag), "Activty has to implement " + OnConfirmDialogClickListener.class.getSimpleName() + " interface");
        }
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
                .setPositiveButton(R.string.button_text_yes, this)
                .setNegativeButton(R.string.button_text_no, this);
        Bundle bundle = getArguments();
        String message = getString(R.string.message_exit);
        String title = getString(R.string.title_exit_message);
        int iconId = android.R.drawable.ic_dialog_alert;
        if (bundle != null) {
            String argumentMessage = bundle.getString(FragmentConstants.Arguments.DIALOG_MESSAGE_ARGUMENT);
            String argumentTitle = bundle.getString(FragmentConstants.Arguments.DIALOG_TITLE_ARGUMENT);
            int argumentIconId = bundle.getInt(FragmentConstants.Arguments.DIALOG_ICON_ID_ARGUMENT);
            message = argumentMessage != null ? argumentMessage : message;
            title = argumentTitle != null ? argumentTitle : title;
            iconId = argumentIconId != 0 ? argumentIconId : iconId;
        }
        builder.setIcon(iconId);
        builder.setMessage(message);
        builder.setTitle(title);
        return builder.create();
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (which == DialogInterface.BUTTON_POSITIVE) {
            mOnConfirmDialogListener.onConfirmClick();
        } else if (which == DialogInterface.BUTTON_NEGATIVE) {
            mOnConfirmDialogListener.onCancelClick();
        }
    }

    public interface OnConfirmDialogClickListener {
        void onConfirmClick();

        void onCancelClick();
    }
}

活动

public class MainActivity extends BaseSingleFragmentActivity implements ExitConfirmDialogFactory.OnExitDialogClickListener {
 @Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
        Bundle arguments = new Bundle();
        if(mExitDialog==null) {
            arguments.putInt(FragmentConstants.Arguments.DIALOG_ICON_ID_ARGUMENT, android.R.drawable.ic_dialog_alert);
            arguments.putString(FragmentConstants.Arguments.DIALOG_MESSAGE_ARGUMENT, getString(R.string.message_exit));
            arguments.putString(FragmentConstants.Arguments.DIALOG_TITLE_ARGUMENT, getString(R.string.title_exit_message));
            DialogFragment exitDialog = new ConfirmationDialog();
            exitDialog.setArguments(arguments);
            mExitDialog = exitDialog;
        }
        mExitDialog.show(getSupportFragmentManager(),FragmentConstants.Tags.EXIT_DIALOG_TAG);
    } else {
        super.onBackPressed();
    }
}

@Override
public void onConfirmClick() {
    super.onBackPressed();
}

@Override
public void onCancelClick() {

}