Xamarin Android 监听音量键(下)

别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述Xamarin Android 监听音量键(下)相关的知识,希望能为你提供帮助。
Xamarin android 开发,获取按键状态,并利用publish-subscribe模式通知到子界面。上篇在 MainActivity 中重写了按键事件(OnKeyDown),获取了音量键键值并打印了出来,当然,手机物理按键和虚拟按键(音量键、返回键、菜单键等)均可通过该按键事件被捕获。
 
但是,按键重写在  MainActivity 中,音量键按下时执行的方法在其他页面中。
 
作者冒出了一个不成熟的想法:利用(publish-subscribe)模式,在 MainActivity 中定义发布者(publish),实例化后层层传递到达 我的页面中,,再将实例化后的订阅者(subscribe)连接上。如图从左到右依次为类实例化的顺序:

Xamarin Android 监听音量键(下)

文章图片

方案实现:
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 == 24) {//音量键上 //Message.ShortAlert("音量键上"); SendData("VU"); } else if (keyCode == 25) {//音量键下 //Message.ShortAlert("音量键下"); SendData("VD"); }Console.WriteLine("按键按下:"+keyCode); }

 
欢迎讨论,非常感谢
【Xamarin Android 监听音量键(下)】 

    推荐阅读