Android app监听普通的按键有两种方式:

实现Activity的onKeyDown方法

public class Android_game extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_android_game);    }    public boolean onKeyDown(int keyCode, KeyEvent event) {        if(keyCode == KeyEvent.KEYCODE_BACK){                Intent i = new Intent(this,Android_game_menu.class);                startActivity(i);        }         return false;    }}

实现OnClickListener接口的方式

public class MyActivity extends Activity implementsOnClickListener {    // ...    public void onClick(View v) {        switch (v.getId()) {            case R.id.about_button:                Intent i = new Intent(this, About.class);                startActivity(i);                break;    // More buttons go here (if any) ...        }    }}

Android app Home Key的监听方式:

对于Home键的监听不是那么容易,因为Home键可以将程序退出放在后台,所以这个事件是直接分发给系统,系统接收到之后做相应处理,Home键的事件不是直接传递到应用里面.所以在上述监听一般的按键(比如volume key等)的代码中,相应的回调中是收不到Home键的事件的.
对Home键的监听主要通过注册广播接收器实现,拦截让窗口关闭的系统动作,然后根据Intent里面的具体参数,分析当前到底是Home键, 应用切换键,还是其他功能按键.

public class HomeWatcherReceiver extends BroadcastReceiver {    private static final String LOG_TAG = "HomeReceiver";    private static final String SYSTEM_DIALOG_REASON_KEY = "reason";    private static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";    private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";    private static final String SYSTEM_DIALOG_REASON_LOCK = "lock";    private static final String SYSTEM_DIALOG_REASON_ASSIST = "assist";    @Override    public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        Log.i(LOG_TAG, "onReceive: action: " + action);        if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {            // android.intent.action.CLOSE_SYSTEM_DIALOGS            String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);            Log.i(LOG_TAG, "reason: " + reason);            if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) {                // 短按Home键                Log.i(LOG_TAG, "homekey");            }            else if (SYSTEM_DIALOG_REASON_RECENT_APPS.equals(reason)) {                // 长按Home键 或者 activity切换键                Log.i(LOG_TAG, "long press home key or activity switch");            }            else if (SYSTEM_DIALOG_REASON_LOCK.equals(reason)) {                // 锁屏                Log.i(LOG_TAG, "lock");            }            else if (SYSTEM_DIALOG_REASON_ASSIST.equals(reason)) {                // samsung 长按Home键                Log.i(LOG_TAG, "assist");            }        }    }}

注意不同手机的按键不同,所以需要对不同理由做区分.
Home键监听广播注册:
广播接收器的注册有两种方式,一种是静态注册,即写在manifest里面声明;另一种是动态注册,即在Java代码里面注册.
上面对Home键实现监听的这个receiver的静态注册如下:

        <receiver android:name="com.mengdd.hellohome.HomeWatcherReceiver" >            <intent-filter>                <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" />            </intent-filter>        </receiver>

但是发现静态注册不起作用,即收不到onReceive回调??
采用动态注册:

    private static HomeWatcherReceiver mHomeKeyReceiver = null;    private static void registerHomeKeyReceiver(Context context) {        Log.i(LOG_TAG, "registerHomeKeyReceiver");        mHomeKeyReceiver = new HomeWatcherReceiver();        final IntentFilter homeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);        context.registerReceiver(mHomeKeyReceiver, homeFilter);    }    private static void unregisterHomeKeyReceiver(Context context) {        Log.i(LOG_TAG, "unregisterHomeKeyReceiver");        if (null != mHomeKeyReceiver) {            context.unregisterReceiver(mHomeKeyReceiver);        }    }

在Activity的onResume和onPause里面分别调用:

    @Override    protected void onResume() {        super.onResume();        registerHomeKeyReceiver(this);    }    @Override    protected void onPause() {        unregisterHomeKeyReceiver(this);        super.onPause();    }

当然也可以根据需要在其他合适的时机注册和注销.

更多相关文章

  1. java后台接收android客户端通过http方式发送的数据
  2. Android上传文件到Django服务器
  3. 疯狂android讲义---事件处理2
  4. Android创建和删除桌面快捷方式
  5. android 监听 USB 拔插广播消息
  6. android EditText 监听
  7. Android中如何使用基于监听的事件处理(上)
  8. Android(安卓)Socket网络通信
  9. Android桌面快捷方式的实现

随机推荐

  1. 状态机设计
  2. 聊聊java中的注解
  3. 授权与认证实战
  4. Android(安卓)Studio多渠道打包、自定义
  5. java关键字系列(6)void
  6. ConcurrentHashMap.computeIfAbsent 死循
  7. java多线程(11)AtomicBoolean原子类分析
  8. 作为一个Java程序员必须要知道的单元测试
  9. 解决CAS机制中ABA问题的AtomicStampedRef
  10. Java基础系列:线程同步和线程池