长按"Home"键
转载声明:http://book.51cto.com/art/201109/291313.htm
长按"Home"键也是系统消息,应用程序无法对长按"Home"键的消息做自定义处理。
在PhoneWindowManager的interceptKeyTi()方法中检测是否是长按"Home"键的消息,如果是,则发送一个异步消 息。处理该异步消息的是一个线程对象,名称为mHomeLongPress,该对象是在构造函数中创建的,其作用就是用户所看到的弹出一个对话框,里面包 含了最近启动的应用列表。而该线程内部的执行过程具体如下:
(1)调用performHapticFeedback()给用户一个震动提醒,Haptic的意思是"触觉反馈"。
(2)关闭所有系统窗口,常见的系统窗口包括状态栏、Toast窗口、系统警告或者错误对话框等。
(3)调用showRecentDialog()方法弹出最近任务列表对话框。而该方法内部则是首先创建一个RecentApplicationsDialog类对象,该对象基于Dialog类,然后再调用show()方法将该对话框显示出来。
关于RecentApplicationsDialog类的执行过程如下。
在该类的构造函数中,为该Dialog对象添加视图,使用的是系统内置的recent_apps_dialog.xml布局文件。该文件中包含了六个Button视图,如果读者想自定义该视图,则可以修改该文件。
在该Dialog对象的onStart()方法中,调用reloadButtons()为这六个Button视图设置具体的显示内容及onClick()事件。reloadButtons()方法的内部流程如下。
(1)调用AmS的getRecentTask()方法获取最近的Task列表,这个列表来源于AmS中的mRecentTask列表。但是并不是 直接返回mRecentTask里面的内容,而是把mRecentTask里面的TaskRecord数据类转换为 ActivityManager.RecentTaskInfo数据类。
(2)根据返回的RecentTaskInfo设置对话框中的六个按钮的显示和onClick()事件。显示包括任务名称和任务图标,而onClick()事件主要则是获取任务对应的Intent对象。
需要注意的是,任务的Intent对象是指该任务的baseIntent,即创建该任务时的Intent。同时,还给这个baseIntent添加 了一个FLAG_NEW_TASK标识,添加这个标识的原因有两个,第一是系统希望在一个新的任务中启动baseIntent,第二是当从Dialog类 中调用startActivity()时只能使用Context类的startActivity(),而Context的startActivity() 方法要求Intent的标识中必须包含NEW_TASK。
此时,长按"Home"键的操作就告一段落,接下来,如果用户单击任务对话框中的某个Button后,就会调用 getContext().startActivity()启动对应的Activity。注意,这里是使用Context中的 startActvity()方法,而不是Activity的startActivity()的方法。