上篇在 MainActivity 中重写了按键事件(OnKeyDown),获取了音量键键值并打印了出来,当然,手机物理按键和虚拟按键(音量键、返回键、菜单键等)均可通过该按键事件被捕获。

但是,按键重写在 MainActivity 中,音量键按下时执行的方法在其他页面中。

作者冒出了一个不成熟的想法:利用(publish-subscribe)模式,在 MainActivity 中定义发布者(publish),实例化后层层传递到达 我的页面中,,再将实例化后的订阅者(subscribe)连接上。如图从左到右依次为类实例化的顺序:

方案实现:

1、发布者订阅者类设计

namespace NetworkAssistant
{
//声明按键事件监听委托接口
public delegate void OnKeyDown_callback(int keyCode);
//按键事件发布者
public class MyKeyEventPublish
{
private int KeyCode;
public Action<int> OnKeyDown { set; get; }
public int OnKeyDownChanged
{
get { return KeyCode; }
set
{
KeyCode = value;
OnKeyDown?.Invoke(value);
}
}
}
//按键事件订阅者
public class MyKeyEventSubscribe
{
OnKeyDown_callback cb;
public MyKeyEventSubscribe(OnKeyDown_callback _cb)
{
cb = _cb;
} public void OnKeyDown( int newKeyCode)
{
Console.WriteLine($"[{newKeyCode}]");
cb?.Invoke(newKeyCode);
}
}
}

2、MainActivity.cs

//按键事件发布者
MyKeyEventPublish myKeyEventPublish;
protected override void OnCreate(Bundle savedInstanceState)
{
//实例化按键事件发布者
myKeyEventPublish = new MyKeyEventPublish();
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App(myKeyEventPublish));
} public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e)
{
//键值更改事件发布方法
myKeyEventPublish.OnKeyDown((int)keyCode); //switch (keyCode)
//{
// case Keycode.VolumeUp:
// Message.ShortAlert("音量上");
// break;
// case Keycode.VolumeDown:
// Message.ShortAlert("音量下");
// break;
// default:break;
//} return true;//屏蔽按键原有功能
//return base.OnKeyDown(keyCode, e);//不屏蔽原有功能
}

3、App.cs

namespace NetworkAssistant
{
public partial class App : Application
{
public App(MyKeyEventPublish myKeyEventPublish)
{
InitializeComponent(); MainPage = new MainPage(myKeyEventPublish);
} protected override void OnStart()
{
// Handle when your app starts
} protected override void OnSleep()
{
// Handle when your app sleeps
} protected override void OnResume()
{
// Handle when your app resumes
}
}
}

4、MainPage.cs

//按键事件发布者
MyKeyEventPublish myKeyEventPublish;
//按键事件接收者
MyKeyEventSubscribe myKeyEventSubscribe;
public MainPage(MyKeyEventPublish mkp)
{
//实例化按键事件发布者
myKeyEventPublish = mkp;
//实例化按键事件接收者
myKeyEventSubscribe = new MyKeyEventSubscribe(OnKeyDownCallBack);
//增加订阅
myKeyEventPublish.OnKeyDown += myKeyEventSubscribe.OnKeyDown; InitializeComponent();
}
void OnKeyDownCallBack(int keyCode)
{
if (keyCode == )
{//音量键上
//Message.ShortAlert("音量键上");
SendData("VU");
}
else if (keyCode == )
{//音量键下
//Message.ShortAlert("音量键下");
SendData("VD");
} Console.WriteLine("按键按下:"+keyCode); }

欢迎讨论,非常感谢

Xamarin Android 监听音量键(下)的更多相关文章

  1. xamarin Android 监听音量键(上)

    public override bool OnKeyDown([GeneratedEnum]Android.Views.Keycode keyCode, KeyEvent e) { switch (k ...

  2. vs xamarin android 监听返回键退出程序

    public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e) { if (keyCode == Keycode. ...

  3. Android监听返回键、Home键+再按一次返回键退出应用

    Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME @Override public boolean onKeyDown( ...

  4. android 监听返回键

    android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE ...

  5. Android 监听返回键退出程序的两种实现

    1.Android 双击返回键退出程序 思路:用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定 ...

  6. Android 监听返回键、HOME键

    拦截返回键,HOME键,继承BaseActivity即可 import android.app.Activity; import android.content.BroadcastReceiver; ...

  7. android 监听Home键

    /** * Home 键监听,当按下Home键时,系统会发出action为Intent.ACTION_CLOSE_SYSTEM_DIALOGS的BroadcastReceiver * 在程序里动态注册 ...

  8. Android监听Home键

    监听广播  ACTION_CLOSE_SYSTEM_DIALOGS private void registerHomeReceiver(){ IntentFilter homeFilter = new ...

  9. Android监听HOME键的最简单的方法

    public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; public void onCreate(Bundle savedInsta ...

随机推荐

  1. Spring 核心技术(2)

    接上篇:Spring 核心技术(1) version 5.1.8.RELEASE 1.3 Bean概述 Spring IoC 容器管理一个或多个bean,他们都是根据提供的配置元数据(例如 XML 中 ...

  2. python 的一些小项目

    1.在线教育平台(视频播放) 2.仿微信网页版(语音.视频.文字聊天) 3.高德API + Python 解决租房问题 4.仿知乎 5.Django打造文件分享系统.文件管理.搜索引擎(仿云盘) 6. ...

  3. 关系型数据库MySql 数据类型与约束

    MySql数据库 :数据类型与约束 注意 :  在创建数据表的时候,需要对数据表中的字段设置 数据类型和约束, 便于检测用户输入的数据是否正确有效. 1 数据类型 数据类型的选用原则 : 够用就行,尽 ...

  4. 使用wincc vbs脚本查找进程及如何运行进程

    使用vbs代码查看某个进程是否在运行,本文要检查的进程名为 QRscan.exe,其代码如下: sub CheckProcess Dim WMI,Objs,Process,ObjSet WMI=Get ...

  5. springcloud-eureka客户端服务注册(含demo源码)

    1. 场景描述 前几天介绍了下springcloud的Eureka注册中心(springcloud-注册中心快速构建),今天结合springboot-web介绍下eureka客户端服务注册. 2. 解 ...

  6. druid一步到位

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons) 在配置application.yml文件的时候,原本写的是MySQL的连 ...

  7. SSAS多维设计模型与报表客户端-Excel透视表制作

    VS:SSAS设计多维设计模型: 数据源视图.dsv: 数据源视图表,名称命名规范:vw_表名(事实表_F_/维表_D_),

  8. 为git伸冤(使用git中可能会踩的一些坑)

    窦娥被冤,六月飞霜.今天我两次遇到git被冤枉的情况,要是其它人也遇到这种情况导致git使用量缩小,那也要六月飞霜了. git第一次被冤枉是同事以为git的版本管理有问题.事情是这样的,同事提交新版本 ...

  9. Pascal到c++,求大佬翻译!

    请大佬翻译完毕后私信我谢谢! var a,b,c,d,f:array[1..1000]of longint; i,j,k,n,m,o:longint; procedure zx(p,q:longint ...

  10. JAVA 使用 POI进行读取Excel表格示例

    导包 编码 public class PoiTest { /** * 最终效果 * 表头一内容0 表头二内容1 表头三内容2 表头一内容1 表头二内容2 表头三内容3 表头一内容2 表头二内容3 表头 ...