Android监听Home键和Back键的区别介绍
一:Android中Home键监听和Back键监听的区别:
(1).在Android中,当按下Home键的时候,默认情况下Stop前台的Activity,即Activity设置成停止状态【onStop()】,而不是销毁状态【onDestory()】。如果再次启动该Activity,不是调用onCreate()方法,而是调用onSavedInstanceState方法。则是从onRestart()开始-onStart()-onResume()。
(2).当按下back键则不同,back键默认finish前台的activity,即activity的状态为onDestory为止,再次启动该activity则从onCreate开始,不会调用onSavedInstanceState方法。
总而言之:按下Home键会返回桌面,而back则会返回前一个activity。
在这里Back键的实现方法就不赘述了,主要讲解一下Home键的实现方式吧。以下是我找的参考资料自己思考的。请大家给出建议。
Home键监听的实现方法:
(1).在onResum里面注册广播,OnPause里面注销广播。
(2).在广播中拦截Intent.ACTION_CLOSE_SYSTEM_DIALOGS这个Action,通过获取Reason字段来判断长按还是单击Home键。
代码如下:
(1).Home键监听封装类:
packagecom.scd.homewatcher.util; importandroid.content.BroadcastReceiver; importandroid.content.Context; importandroid.content.Intent; importandroid.content.IntentFilter; importandroid.util.Log; /** *Home键监听封装 * *@authorway * */ publicclassHomeWatcher{ //回调接口 publicinterfaceOnHomePressedListener{ publicvoidonHomePressed(); publicvoidonHomeLongPressed(); } privatestaticfinalStringTAG="HomeWatcher"; /**上下文*/ privateContextmContext; /**过滤器*/ privateIntentFiltermFilter; /**接口*/ privateOnHomePressedListenermListener; /**广播接收者*/ privateInnerReceviermRecevier; publicHomeWatcher(Contextcontext){ mContext=context; mRecevier=newInnerRecevier(); mFilter=newIntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); } /** *设置监听 * *@paramlistener */ publicvoidsetOnHomePressedListener(OnHomePressedListenerlistener){ mListener=listener; } /** *开始监听,注册广播 */ publicvoidstartWatch(){ if(mRecevier!=null){ mContext.registerReceiver(mRecevier,mFilter); } } /** *停止监听,注销广播 */ publicvoidstopWatch(){ if(mRecevier!=null){ mContext.unregisterReceiver(mRecevier); } } /** *广播接收者 */ privateclassInnerRecevierextendsBroadcastReceiver{ finalStringSYSTEM_DIALOG_REASON_KEY="reason"; finalStringSYSTEM_DIALOG_REASON_GLOBAL_ACTIONS="globalactions"; finalStringSYSTEM_DIALOG_REASON_RECENT_APPS="recentapps"; finalStringSYSTEM_DIALOG_REASON_HOME_KEY="homekey"; @Override publicvoidonReceive(Contextcontext,Intentintent){ Stringaction=intent.getAction(); if(action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){ Stringreason=intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if(reason!=null){ Log.i(TAG,"action:"+action+",reason:"+reason); if(mListener!=null){ if(reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)){ //短按home键 mListener.onHomePressed(); }elseif(reason .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)){ //长按home键 mListener.onHomeLongPressed(); } } } } } } }
(2).MainActivity类:
packagecom.scd.homewatcher; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.KeyEvent; importandroid.widget.Toast; importcom.scd.homewatcher.util.HomeWatcher; importcom.scd.homewatcher.util.HomeWatcher.OnHomePressedListener; publicclassMainActivityextendsActivityimplementsOnHomePressedListener{ privateHomeWatchermHomeWatcher; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protectedvoidonResume(){ mHomeWatcher=newHomeWatcher(this); mHomeWatcher.setOnHomePressedListener(this); //注册广播 mHomeWatcher.startWatch(); super.onResume(); } @Override protectedvoidonPause(){ mHomeWatcher.setOnHomePressedListener(null); //注销广播 mHomeWatcher.stopWatch(); super.onPause(); } @Override publicvoidonHomePressed(){ //TODO Toast.makeText(this,"短按Home键,实现自己的逻辑",Toast.LENGTH_SHORT).show(); } @Override publicvoidonHomeLongPressed(){ //TODO Toast.makeText(this,"长按Home键,实现自己的逻辑",Toast.LENGTH_SHORT).show(); } @Override publicbooleanonKeyDown(intkeyCode,KeyEventevent){ if((keyCode==KeyEvent.KEYCODE_BACK)){ System.out.println("按下了back键onKeyDown()"); returnfalse; }else{ returnsuper.onKeyDown(keyCode,event); } } @Override publicvoidonBackPressed(){ //super.onBackPressed()会自动调用finish()方法,关闭 super.onBackPressed(); } }