处理返回键的事件,监听任务键和home键的监听。
返回键
对于一般应用,要对系统的返回键进行友好处理,不能让用户误触就返回到上一栈的页面,或者直接退出应用了。
所以对于退出应用的时候,需要重写返回键的监听,对返回键点击处理。
- 对于音乐类、下载类应用需要返回桌面而不是关闭应用。
private long time =0;
/**
* 双击返回桌面
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if ((System.currentTimeMillis() - time > 1000)) {
Toast.makeText(this, "再按一次返回桌面", Toast.LENGTH_SHORT).show();
time = System.currentTimeMillis();
} else {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
- 其他类应用
private long time =0;
/**
* 双击退出
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if ((System.currentTimeMillis() - time > 1000)) {
Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT).show();
time = System.currentTimeMillis();
} else {
//如果添加了actiyity的生命周期控制类,可需要进行操作
//如果有后台服务下载,就不能退出了。可以设置状态判断处理。
finish();
System.exit(0)
}
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
home键和任务键
以前4.0以下的系统是可以屏蔽系统的home键的,后来由于流氓应用谷歌不允许屏蔽掉home键.
通过keyCode == KeyEvent.KEYCODE_HOME
已经不会又返回结果了。
现在被系统底层拦截住了,并会发送一个广播,在广播中设置监听回调。代码如下
package com.hu.glmenu.utils;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
/**
* Created by TT on 2017/5/26.
*/
public class HomeListener {
static final String TAG = "HomeListener";
private Context mContext;
private IntentFilter mFilter;
private OnHomePressedListener mListener;
private InnerRecevier mRecevier;
// 回调接口
public interface OnHomePressedListener {
//home回调
void onHomePressed();
//任务回调
void onHomeLongPressed();
}
public HomeListener(Context context) {
mContext = context;
//找到intent的标识ACTION_CLOSE_SYSTEM_DIALOGS指示意思为:
//广播行为:当用户操作请求临时退出当前对话框时发送广播
mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
}
/**
* 设置监听
*
* @param listener
*/
public void setOnHomePressedListener(OnHomePressedListener listener) {
mListener = listener;
mRecevier = new InnerRecevier();
}
/**
* 开始监听,注册广播
*/
public void startWatch() {
if (mRecevier != null) {
mContext.registerReceiver(mRecevier, mFilter);
}
}
/**
* 停止监听,注销广播
*/
public void stopWatch() {
if (mRecevier != null) {
mContext.unregisterReceiver(mRecevier);
}
}
/**
* 广播接收者
*/
class InnerRecevier extends BroadcastReceiver {
final String SYSTEM_DIALOG_REASON_KEY = "reason";
final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
if (reason != null) {
// Log.e(TAG, "action:" + action + ",reason:" + reason);
if (mListener != null) {
if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
// home键
mListener.onHomePressed();
} else if (reason
.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
// 任务键
mListener.onHomeLongPressed();
}
}
}
}
}
}
}
上面写的为回调和广播类,所以需要在处理的activity中添加回调如下:
在onResume和onPause中监听和注册广播
@Override
protected void onResume() {
homeListener = new HomeListener(this);
homeListener.setOnHomePressedListener(new HomeListener.OnHomePressedListener() {
@Override
public void onHomePressed() {
//处理按了home后的事
Log.e("tag==","Home键");
}
@Override
public void onHomeLongPressed() {
//处理按了任务键后的事
Log.e("tag==","任务切换键");
}
});
homeListener.startWatch();//注册广播
super.onResume();
}
@Override
protected void onPause() {
homeListener.stopWatch();//注销广播
super.onPause();
}
任务和home键现在只能做到监听效果,没法去拦截事件!要做到拦截估计要在framework层。