您的位置:首页 > 其它

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

2017-09-15 18:17 211 查看
上一篇文章我写了退出应用的其中一个方法:利用广播退出应用,地址: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即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: