Xamarin Android 监听音量键(下)
上篇在 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 监听音量键(下)的更多相关文章
- xamarin Android 监听音量键(上)
public override bool OnKeyDown([GeneratedEnum]Android.Views.Keycode keyCode, KeyEvent e) { switch (k ...
- vs xamarin android 监听返回键退出程序
public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e) { if (keyCode == Keycode. ...
- Android监听返回键、Home键+再按一次返回键退出应用
Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME @Override public boolean onKeyDown( ...
- android 监听返回键
android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE ...
- Android 监听返回键退出程序的两种实现
1.Android 双击返回键退出程序 思路:用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定 ...
- Android 监听返回键、HOME键
拦截返回键,HOME键,继承BaseActivity即可 import android.app.Activity; import android.content.BroadcastReceiver; ...
- android 监听Home键
/** * Home 键监听,当按下Home键时,系统会发出action为Intent.ACTION_CLOSE_SYSTEM_DIALOGS的BroadcastReceiver * 在程序里动态注册 ...
- Android监听Home键
监听广播 ACTION_CLOSE_SYSTEM_DIALOGS private void registerHomeReceiver(){ IntentFilter homeFilter = new ...
- Android监听HOME键的最简单的方法
public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; public void onCreate(Bundle savedInsta ...
随机推荐
- 一套简单的web即时通讯——第一版
前言 我们之前已经实现了 WebSocket+Java 私聊.群聊实例,后面我们模仿layer弹窗,封装了一个自己的web弹窗 自定义web弹窗/层:简易风格的msg与可拖放的dialog,生成博客园 ...
- Dokcer基础使用总结(Dockerfile、Compose、Swarm)
Dokcer基础 查看Linux版本 uname -r 查看Linux详尽信息 cat /etc/*elease CentOS Linux release (Core) NAME="Cent ...
- Linux命令学习-tail命令
Linux中,tail命令的全称就是tail,主要用于监控日志文件. 对于一个正在运行应用来说,其对应的log日志文件肯定是在不断的更新,此时,便可通过tail命令来动态显示日志文件的内容.假设当前目 ...
- Tensorflow教程(2)Tensorflow的常用函数介绍
1.tf.constant tf.constant用来定义一个常量,所谓常量,广义上讲就是“不变化的量”.我们先看下官方api是如何对constant函数来定义的: tf.constant( valu ...
- java高并发系列-第1天:必须知道的几个概念
java高并发系列-第1天:必须知道的几个概念 同步(Synchronous)和异步(Asynchronous) 同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后, ...
- 洛谷p1216 IOI1994 Day1T1
洛谷p1216 IOI1994 Day1T1 洛谷原题 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下 ...
- 【POJ - 2676】Sudoku(数独 dfs+回溯)
-->Sudoku 直接中文 Descriptions: Sudoku对数独非常感兴趣,今天他在书上看到了几道数独题: 给定一个由3*3的方块分割而成的9*9的表格(如图),其中一些表格填有1- ...
- python的ORM技巧记录
# -*- coding:utf-8 -*- from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, In ...
- 嵌入式web服务器BOA的移植及应用
嵌入式web服务器子系统 一.嵌入式web服务器的控制流程 如下图所示,嵌入式web服务器可实现通过网络远程控制嵌入式开发板,便捷实用. 控制流程:浏览器 --->>>嵌入式开发板 ...
- .Net微信网页开发之使用微信JS-SDK自定义微信分享内容
第一步.微信JS-SDK的使用步骤,配置信息的生成获取讲解: 关于JS-SDK的使用步骤和timestamp(时间戳),nonceStr(随机串),signature(签名),access_token ...