您的位置:首页 > 移动开发 > Android开发

Android返回键处理、任务和home键处理

2017-05-26 13:12 357 查看
处理返回键的事件,监听任务键和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层。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android