自定义基类activity实现双击back键退出应用

上一篇文章我写了退出应用的其中一个方法:利用广播退出应用,地址:http://blog.csdn.net/gxp1182893781/article/details/77993561


但是那种方法如果只是用来实现退出应用,似乎就太浪费代码量了,因为每一个activity都要创建listener并调用begin方法开始监听广播,还要在onDestory方法中反注册监听器,代码量似乎有点大。


为了简化代码,再加上双击退出的功能,下面来自定义一个基类activity,命名为BaseActivity,继承自AppCompatActivity类。


我们通过接收自定义的“ExitAPP”广播来finish掉activity,所以我们首先要有一个自定义的广播接收器ExitAPPBroadcastReceiver extends BroadcastReceiver,在BaseActivity中重写onCreate方法,来注册广播,重写onDestory方法来反注册广播。


当我们的广播接收器接收到广播后,需要调用activity的finish方法,所以我就把广播接收器的类作为内部类写在了BaseActivity中了。


之后,我们怎么做到双击back返回呢?可以重写activity的onBackPressed()方法,也可以重写onKeyDown()方法,看你心情。在这里,因为我的项目中有的activity包含三个Fragment,而我需要使用back键来退回到上一个显示的Fragment中,所以我重写了onKeyDown()方法,这样我就可以拦截点击事件了,不会造成点击后finish掉activity的后果了。


对于双击退出,重点是“双击”,为了判断是不是第二次点击,我定义了一个Boolean型的变量isExitAPP并为他初始化为false标识不要finish。当我监听到back键被点击的时候,我就判断这个变量是不是true,如果是true,当然就会发送广播退出应用,如果是false,那么我就把它更改为true,并为他设置2s的时间,如果两秒后没有收到第二次back键的点击,就再次将它更改为false,这样就实现了2s内点击第二次会退出应用的功能。


那么,这两秒时间怎么做呢?一提到时间,大家很容易想到用定时器,可我不喜欢定时器,因为他还要使用TimerTask,懒得用。其实熟悉Android animator的童鞋很容易想到使用ValueAnimator,设置2s的动画时长,然后为其增加一个监听器,的那个动画结束时更改isExitAPP为false即可。


下面给出全部代码:


/**
 * Created by Qiju on 2017/9/12.
 * 这个基类实现了双击退出应用的功能
 */

public class BaseActivity extends AppCompatActivity {
    //自定义的接收退出应用广播对象
    private ExitAPPBroadcastReceiver receiver;
    //是否将要退出应用
    protected Boolean isExitAPP = false;

    /**
     * 当启动activity的时候,注册广播
     *
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        receiver = new ExitAPPBroadcastReceiver();
        registerReceiver1(receiver);
        super.onCreate(savedInstanceState);
    }

    /**
     * 当销毁activity的时候,解除注册
     */
    @Override
    protected void onDestroy() {
        unRegisterReceiver1(receiver);
        super.onDestroy();
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK&&event.getAction() == KeyEvent.ACTION_DOWN){
            if (isExitAPP == false) {
                isExitAPP = true;
                Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
                ValueAnimator animator = ValueAnimator.ofFloat(0, 1.0f);
                animator.setDuration(2 * 1000);
                animator.start();
                animator.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        isExitAPP = false;
                        super.onAnimationEnd(animation);
                    }
                });
            } else {
                SharedPreferences sp = getSharedPreferences("qiju", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = sp.edit();
                editor.putString("tc", "0");
                editor.commit();
                Intent intent = new Intent();
                intent.setAction("ExitAPP");
                sendBroadcast(intent);
            }
            return false;
        }
        return super.onKeyDown(keyCode, event);
    }

    /**
     * 执行退出时要做的事
     */
    protected void onExitAPP() {
//        Intent intent = new Intent();
//        intent.setAction("ExitAPP");
//        sendBroadcast(intent);
        finish();
    }

    /**
     * 注册监听“ExitAPP”的广播
     *
     * @param receiver
     */
    private void registerReceiver1(ExitAPPBroadcastReceiver receiver) {
        IntentFilter filter = new IntentFilter();   //filter将会设置监听的地点,当有操作就会发出广播
        filter.addAction("ExitAPP");
        registerReceiver(receiver, filter);
    }

    /**
     * 取消注册“ExitAPP”广播
     *
     * @param receiver
     */
    private void unRegisterReceiver1(ExitAPPBroadcastReceiver receiver) {
        unregisterReceiver(receiver);
    }

    /**
     * 自定义的接受“ExitAPP”的广播
     */
    private class ExitAPPBroadcastReceiver extends BroadcastReceiver {
        private String action;

        @Override
        public void onReceive(Context context, Intent intent) {
            action = intent.getAction();
            switch (action) {
                case "ExitAPP":
                    onExitAPP();
                    break;

            }
        }
    }
}

关于BaseActivity的使用:

只需要在我们项目中需要双击退出的activity中把activity修改为继承自BaseActivity即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值