`

如何在你的应用中处理Home键的点击和长按事件

阅读更多
首先一看到这个问题我们可能会想到用
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {}

来处理

但是结果却不如人意,这是为什么呢?
我们来看看系统对Home键的处理机制:


看完了这张图我们就会明白:Home键不同于Back键和软键盘,它属于系统键。但在按压时会发出一个广播。所以我们可以通过广播接收者的方式来处理它的按压事件

我们自定义一个Home键监听类,里面来定义一个广播接收者:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

/** 
 * Home键监听封装 
 *  
 * @author way 
 *  
 */
public class HomeWatcher
{
    
    static final String TAG = "HomeWatcher";
    
    private Context mContext;
    
    private IntentFilter mFilter;
    
    private OnHomePressedListener mListener;
    
    private InnerRecevier mRecevier;
    
    public HomeWatcher(Context context)
    {
        mContext = context;
        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";
        
        
        public InnerRecevier(){
            
        }
        
        @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))
                        {
                            // 长按home键  
                            mListener.onHomeLongPressed();
                        }
                    }
                }
            }
        }
    }
}



然后写一个回调的接口,好让应用中需要处理Home键事件的地方来实现:
// 回调接口  
public interface OnHomePressedListener
{
    public void onHomePressed();
    
    public void onHomeLongPressed();
}


接着在清单文件中定义接收器的属性:
        <receiver android:name="com.myapp.plugin.HomeWatcher$InnerRecevier">
            <intent-filter >
                <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS"/>
            </intent-filter>
        </receiver>



接下来就可以在需要的地方来处理了:
        @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_ptt_call_in);
		
		mHomeWatcher = new HomeWatcher(this);
		mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
			@Override
			public void onHomePressed() {
				Log.i(TAG, "onHomePressed");
				notification(); // 在后台运行,通知栏显示小图标				
			}

			@Override
			public void onHomeLongPressed() {
				Log.e(TAG, "onHomeLongPressed");
				// TODO
				
			}
		});
		mHomeWatcher.startWatch();	
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		mHomeWatcher.stopWatch();		
	}
  • 大小: 37 KB
1
0
分享到:
评论

相关推荐

    android里面屏蔽home键/禁止Home键或者随你DIY

    首先,我们来看一种简单的实现方式,通过重写`Activity`的`onKeyDown()`方法来捕获并处理Home键的点击事件。在`onKeyDown()`方法中,我们可以检查按键事件的`keyCode`是否为`KeyEvent.KEYCODE_HOME`,如果是,则执行...

    Android监听home键的方法详解

    首先,我们要了解Android系统是如何处理Home键的。默认情况下,当用户按下Home键时,当前的Activity会被暂停(Paused),而系统会回到主屏幕。如果想要监听Home键,通常需要特殊处理,因为通常的生命周期方法如`...

    iPhone手机面板导航菜单

    这个区域包括三个主要元素:Home键(在较早的iPhone型号中)、屏幕左侧的“返回”键和右侧的“控制中心/多任务处理”键。Home键在新款iPhone中被Face ID取代,但其功能可以通过屏幕底部向上轻扫来模拟。 1. **Home...

    玩转苹果iPad-air技巧教程大全.docx

    4. **快速返回页面顶端**:在Safari或其他应用中,点击顶部的状态栏可快速回到页面顶部。 5. **点击翻页**:除了滑动,还可以通过点击屏幕左下角或右下角进行页面切换。 6. **隐藏指南针**:在地图应用中双击“我...

    Android_Home

    8. **多任务处理**:Android Home也支持多任务处理,用户可以通过长按Home键或者滑动主屏幕底部的任务栏来切换最近使用的应用。 9. **语音助手集成**:许多Android设备集成了Google Assistant或其他语音助手,用户...

    玩转苹果iPad air技巧教程大全.pdf

    iPad Air用户可以尝试同时长按电源键和HOME键几秒钟,以强制重启设备。如果某个应用程序出现卡顿,短按HOME键即可尝试退出该程序;若卡顿依旧,应长按电源键直到出现关机滑块,然后快速按下HOME键持续5秒,这样可以...

    苹果iphone4s使用技巧大全.docx

    21. DFU模式:在关机状态下,长按电源键和Home键,直至出现苹果标志后,只松开电源键,Home键保持几秒,进入DFU模式,可用于固件刷机。 22. 话筒与扬声器位置:3GS的右侧是话筒,左侧是扬声器,而在iPhone 4上则...

    iPad常用小技巧.docx

    10. **异常关机处理**:若iPad无法正常关机,可尝试长按电源键和Home键,直至设备重启。 11. **撤销输入**:误输入字符时,可以摇动iPad,屏幕会出现提示,允许撤销输入;再次摇动,可恢复撤销的内容。 12. **激活...

    苹果iphone4s使用技巧快捷键大全.pdf

    3. **截图功能**:同时按住电源键和Home键可以快速截图,截图后的图片会保存在照片应用中。 4. **计算器模式切换**:将计算器从竖直模式旋转到横向,会变为科学计算器,提供更复杂的计算功能。 5. **定时器与音乐...

    iPad平板电脑必备操作技巧.docx

    3. **屏幕截图**:按下电源键和Home键(在新款iPad上,是电源键和顶部的触控ID或Face ID按钮)同时并保持半秒,屏幕上的内容会被保存为PNG图像,自动存储在“照片”应用的“相机胶卷”中。 4. **VoiceOver功能**:...

    三星快捷键

    3. **多任务处理**:在主屏幕上,长按Home键可以开启多任务视图,快速切换或关闭正在运行的应用程序,实现高效操作。 4. **快速设置面板**:从屏幕顶部向下滑动可以打开快速设置面板,通过点击或滑动开关,快速调整...

    小米快捷键汇总

    在小米手机上,你可以通过同时按下电源键和音量减小键来快速截取当前屏幕,截图后会自动保存到相册中,方便分享或后期编辑。 二、快速开关手电筒 在锁屏状态下,长按电源键,屏幕上会出现快捷工具栏,其中包括手...

    安卓(Android)手机彩信图片的存储方法.doc

    同时按下电源键和音量下键(部分设备可能需要按下电源键和Home键),屏幕快照将被保存到你的手机相册中。然后,你可以通过图库应用找到并分享这个截图。 3. **使用内置彩信应用的导出功能** 部分安卓手机的彩信...

    apple使用说明

    9. **语音识别**:按住线控按钮或在非线控设备上长按Home键,可以启动语音识别,进行拨打电话或查询信息。 10. **地图与导航**:内置的Google地图提供街景模式和导航功能。点击地图上的小人图标进入街景,输入起点...

    Android 按Menu弹出菜单

    在Android系统中,Menu通常是通过按下设备屏幕右上角的菜单按钮或者长按Home键来触发的。这种九宫格样式的菜单设计,借鉴了QQ等流行社交应用的界面元素,为用户提供了一种直观且易于操作的方式去访问各种功能。 **1...

    android和ios在交互细节上的差异

    - 实体Home键可用于退出当前应用并返回主屏幕。 **Android导航模式:** - **特点:** Android 应用程序的导航更加灵活多样,既可以通过实体返回键也可以通过操作栏中的“向上”按钮实现。 - **细节说明:** - ...

    iPad如何用文件夹整理主屏幕上的图标.docx

    - 在iTunes中,选择你的iPad,然后点击顶部的“应用程序”面板。 - 在主屏幕预览区域,你可以拖动一个应用程序图标到另一个图标上方,创建一个新文件夹。完成后,记得点击“应用”按钮来保存更改。 3. 文件夹操作与...

    iPad十大基础操作.docx

    7. **截屏**:截取iPad屏幕图像,只需同时按下电源键和Home键,屏幕闪烁即表示截图成功,截图会保存在照片应用的“相机胶卷”中。 8. **返回页面顶部**:在浏览网页或其他应用时,只需轻轻触摸屏幕顶部的标题栏,...

    苹果iphone4s使用技巧快捷键大全.docx

    20. **强制重启**:长按电源键和Home键,直至看到苹果标志,松开电源键但继续按住Home键,可进入DFU模式,用于固件刷机,操作需谨慎。 21. **话筒和扬声器位置**:iPhone 3GS的右侧是话筒,左侧是扬声器;而iPhone ...

Global site tag (gtag.js) - Google Analytics