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

处理返回键的事件,监听任务键和home键的监听。

返回键

对于一般应用,要对系统的返回键进行友好处理,不能让用户误触就返回到上一栈的页面,或者直接退出应用了。
所以对于退出应用的时候,需要重写返回键的监听,对返回键点击处理。

  1. 对于音乐类、下载类应用需要返回桌面而不是关闭应用。
    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);
        }

    }
  1. 其他类应用
  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层。

你可能感兴趣的:(工作的学习)