版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法!一.Activity监听返回键这个其实大家都知道,首先我们要了解流程,你要屏蔽这个返回键,那你就要拿到这个返回键的事件了,所以我们要监听了,而在Activity中,有两种做法,首先,系统是提供了返回键的监听的 /* * 返回键监听 */ Override public void onBackPressed() /super.onBackPressed(); 我们只要不让使用父类的onBackPressed方法,那返回键就没作用了,还有一种办法就是系统提供的按键监听的方法了 /* * 按
2、键监听 * param keyCode * param event * return */ Override public boolean onKeyDown(int keyCode, KeyEvent event) switch (keyCode) case KeyEvent.KEYCODE_BACK: /返回键 Toast.makeText(this,"返回键",Toast.LENGTH_SHORT).show(); break; return super.onKeyDown(keyCode, event); onKeyDown是按下的动作,键盘按下的动作就可以,他可以
3、监听到很多的按键,比如数字键,当然,现在数字键的手机还是比较少的,KeyEvent 为我们封装了绝大多数的监听,我们来看一下演示的效果二.Service中监听Home键onKeyDown中有监听Home键的方法,但是你会发现监听起来是无效的,这里其实可以通过广播的形式来监听Home键,不光适用在Service,同样的也可以适用在Activity中,我们新建一个HomeServicepackage com.liuguilin.keyevevtsample;/* * 项目名: KeyEvevtSample * 包名: com.liuguilin.keyevevtsample * 文件名: Home
4、Service * 创建者: LGL * 创建时间: 2016/8/20 11:00 * 描述: Home键监听 */import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.IBinder;import android.widget.Toast;public class HomeServi
5、ce extends Service /监听Home private HomeWatcherReceiver mHomeKeyReceiver; public static final String SYSTEM_DIALOG_REASON_KEY = "reason" public static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey" Override public IBinder onBind(Intent intent) return null; Override public
6、void onCreate() super.onCreate(); /注册Home监听广播 mHomeKeyReceiver = new HomeWatcherReceiver(); final IntentFilter homeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); registerReceiver(mHomeKeyReceiver, homeFilter); Override public void onDestroy() super.onDestroy(); /取消监听 unregisterReceiv
7、er(mHomeKeyReceiver); /* * 监听Home键 */ class HomeWatcherReceiver extends BroadcastReceiver 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_REASO
8、N_KEY); if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason) Toast.makeText(context, "Home按键", Toast.LENGTH_SHORT).show(); OK,为了测试,我们加上两个button<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" android:layout_width="match_parent" and
9、roid:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:padding="10dp"> <Button android:id="+id/openHome" android:layout_width="match_parent" android:layout_height="wrap_content" and
10、roid:text="打开Home监听"/> <Button android:id="+id/closeHome" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="关闭Home监听"/></LinearLayout>同时增加两个点击事件 findViewById(R.id.openHome).setOnClickListener(new Vi
11、ew.OnClickListener() Override public void onClick(View view) startService(new Intent(MainActivity.this,HomeService.class); ); findViewById(R.id.closeHome).setOnClickListener(new View.OnClickListener() Override public void onClick(View view) stopService(new Intent(MainActivity.this,HomeService.class)
12、; );对了,别忘记了注册一下Service <service android:name=".HomeService"/>好的,我们来检验一下效果吧OK三.在Window中监听返回键这里,其实也是我项目中的一个需求,首选,我们先不说逻辑,先把window写好,我们为了阅读性,我们再新建一个ServiceWindowService,同时去注册一下<service android:name=".WindowService"/>11而我们的需求,就是启动一个service,service里加载一个window,但是这样做其实是拿不到我们
13、的按键时间的,都给其他人拿走了,但是这些都是后话了,我们先把window的代码写好package com.liuguilin.keyevevtsample;/* * 项目名: KeyEvevtSample * 包名: com.liuguilin.keyevevtsample * 文件名: WindowService * 创建者: LGL * 创建时间: 2016/8/20 11:11 * 描述: 窗口服务 */import android.app.Service;import android.content.Context;import android.content.Intent;impor
14、t android.graphics.PixelFormat;import android.os.IBinder;import android.view.View;import android.view.WindowManager;import android.widget.Button;public class WindowService extends Service implements View.OnClickListener /窗口管理器 private WindowManager wm; /view private View mView; /布局参数 private WindowM
15、anager.LayoutParams layoutParams; /取消window private Button btnCloseWindow; Override public IBinder onBind(Intent intent) return null; Override public void onCreate() super.onCreate(); initWindow(); /* * 初始化Window */ private void initWindow() /窗口管理器 wm = (WindowManager) getApplicationContext().getSys
16、temService(Context.WINDOW_SERVICE); /布局参数 layoutParams = new WindowManager.LayoutParams(); layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT; layoutParams.flags = /WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | 不能触摸 WindowMan
17、ager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; /格式 layoutParams.format = PixelFormat.TRANSLUCENT; /类型 layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; mView = View.inflate(getApplicationContext(), R.layout.layout_window_item, null); btnCloseWin
18、dow = (Button) mView.findViewById(R.id.btnCloseWindow); btnCloseWindow.setOnClickLener(this); Override public int onStartCommand(Intent intent, int flags, int startId) /显示window wm.addView(mView, layoutParams); return START_STICKY; Override public void onDestroy() super.onDestroy(); /* * 点击事件 * * pa
19、ram view */ Override public void onClick(View view) switch (view.getId() case R.id.btnCloseWindow: /取消window wm.removeView(mView); break; 这里有一点要注意的地方,首先,window是需要权限的<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>好的,为了测试,我们些个按钮 <Button android:id="+id/
20、openWindow" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="打开Window" android:textAllCaps="false"/>同时给他加上点击事件findViewById(R.id.openWindow).setOnClickListener(new View.OnClickListener() Override public void onClick
21、(View view) startService(new Intent(MainActivity.this, WindowService.class); );OK,到这里,我们的window算是写好了,但是写好了,也就出来我们今天要探讨的问题了你这个Window,拿不到返回事件,所以我按返回键的时候Activity退出了,window还在,那window就是没有拿到这个事件了,那我们应该怎么去拿到这个事件呢?我们怎么按返回键先退出Window再退出Activity呢?其实我们只要注意这行代码mView = View.inflate(getApplicationContext(), R.layo
22、ut.layout_window_item, null);11我们这里也是有一个View的,我们可用把这个事件给拦截过来,这都是有可能的,想到了就去做,那我们最终要怎么去做?我们可用重写这个view,把事件通过接口的方式绑定在这个window上,如果不听不明白,你可以跟我一起来看下这段代码,我们这个view,我给他一个容器,那我们就重写LinearLayoutpackage com.liuguilin.keyevevtsample;/* * 项目名: KeyEvevtSample * 包名: com.liuguilin.keyevevtsample * 文件名: SessionLinearLa
23、yout * 创建者: LGL * 创建时间: 2016/8/20 11:33 * 描述: 事件分发/拦截返回按钮 */import android.content.Context;import android.util.AttributeSet;import android.view.KeyEvent;import android.widget.LinearLayout;public class SessionLinearLayout extends LinearLayout private DispatchKeyEventListener mDispatchKeyEventListener
24、; public SessionLinearLayout(Context context) super(context); public SessionLinearLayout(Context context, AttributeSet attrs) super(context, attrs); public SessionLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) super(context, attrs, defStyleAttr); Override public boolean dispatch
25、KeyEvent(KeyEvent event) if (mDispatchKeyEventListener != null) return mDispatchKeyEventListener.dispatchKeyEvent(event); return super.dispatchKeyEvent(event); public DispatchKeyEventListener getDispatchKeyEventListener() return mDtchKeyEventListener; public void setDispatchKeyEventListener(Dispatch
26、KeyEventListener mDispatchKeyEventListener) this.mDispatchKeyEventListener = mDispatchKeyEventListener; /监听接口 public static interface DispatchKeyEventListener boolean dispatchKeyEvent(KeyEvent event); 我在这里,只是把他作为一个中转站,把事件给传递出来就好了,那我们现在window加载的layout的根布局就是他了<?xml version="1.0" encoding=
27、"utf-8"?><com.liuguilin.keyevevtsample.SessionLinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:alpha="0.3" android:background="color/colorAccent" android:gravity="center&quo
28、t; android:orientation="vertical"> <Button android:id="+id/btnCloseWindow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="关闭窗口"/></com.liuguilin.keyevevtsample.SessionLinearLayout>那我们的View也是他了,我们
29、直接来看详细的代码吧package com.liuguilin.keyevevtsample;/* * 项目名: KeyEvevtSample * 包名: com.liuguilin.keyevevtsample * 文件名: WindowService * 创建者: LGL * 创建时间: 2016/8/20 11:11 * 描述: 窗口服务 */import android.app.Service;import android.content.Context;import android.content.Intent;import android.graphics.PixelFormat;
30、import android.os.IBinder;import android.view.KeyEvent;import android.view.View;import android.view.WindowManager;import android.widget.Button;public class WindowService extends Service implements View.OnClickListener /窗口管理器 private WindowManager wm; /view private SessionLinearLayout mView; /布局参数 pr
31、ivate WindowManager.LayoutParams layoutParams; /取消window private Button btnCloseWindow; Override public IBinder onBind(Intent intent) return null; Override public void onCreate() super.onCreate(); initWindow(); /* * 初始化Window */ private void initWindow() /窗口管理器 wm = (WindowManager) getApplicationCon
32、text().getSystemService(Context.WINDOW_SERVICE); /布局参数 layoutParams = new WindowManager.LayoutParams(); layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT; layoutParams.flags = /WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | 不能触摸 WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH ; /格式 layoutParams.format = PixelFo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 代理英文合同范本
- 行业合同范本
- 灯饰销售合同范本
- 资料技术合同范本
- 百货店铺委托合同三篇
- 农村建房和工头签合同范本
- 家具简单合同范本
- 水表安装合同范本
- 展览 推广 合同范本
- 购置水表合同范本
- S7-1200PLC技术及应用 课件 项目7 跑马灯控制
- 项目二任务二《木质汤锅架的设计》课件浙教版初中劳动技术八年级上册
- IATF16949-2016质量管理体系程序文件全套
- 2024年江苏省安全生产知识竞赛考试题库(含答案)
- 2024年高中语文选修上册理解性默写全集(含答案)
- 电气工程施工验收规范
- 单位涉密人员保密审查表
- MTM(预定动作标准法)
- 集贸市场安全隐患分析报告
- MOOC 探索管理世界的心理与行为-组织行为学-西北大学 中国大学慕课答案
- MOOC 纺纱学-东华大学 中国大学慕课答案
评论
0/150
提交评论