Android Hander 通信

2024-03-05 05:48
文章标签 android 通信 hander

本文主要是介绍Android Hander 通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在某个Activity的onCreate()方法中添加如下方法

setVolumeControlStream(AudioManager.STREAM_MUSIC);

可以达到提示静音

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(1)public AudioService(Context context) {
......
createAudioSystemThread();
......
}
(2)private void createAudioSystemThread() {
        mAudioSystemThread = new AudioSystemThread();
        mAudioSystemThread.start();
        waitForAudioHandlerCreation();
}
    /** Waits for the volume handler to be created by the other thread. */
(3)private void waitForAudioHandlerCreation() {
        synchronized(this) {
            while (mAudioHandler == null) {
                try {
                    // Wait for mAudioHandler to be set by the other thread
                    wait();
                } catch (InterruptedException e) {
                    Log.e(TAG, "Interrupted while waiting on volume handler.");
                }
            }
        }
    }
(4)/** Thread that handles native AudioSystem control. */
    private class AudioSystemThread extends Thread {
        AudioSystemThread() {
            super("AudioService");
        }
        @Override
        public void run() {
            // Set this thread up so the handler will work on it
            Looper.prepare();
            synchronized(AudioService.this) {
                mAudioHandler = new AudioHandler();
                // Notify that the handler has been created
                AudioService.this.notify();
            }
            // Listen for volume change requests that are set by VolumePanel
            Looper.loop();
        }
(5) /** Handles internal volume messages in separate volume thread. */
    private class myHandler extends Handler {
        private void userDefinedfuntionTest1() {
            ........
            // Post a persist msg
            sendMsg();
        }
        private void userDefinedfuntionTest2() {
            .......
            // Post a persist msg
            sendMsg();
        }
        private void userDefinedfuntionTest1() {
            ........
        }
        private void userDefinedfuntionTest2() {
            .......
            
        }
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_ONE:
                    break;
                case MSG_TWO:
                    break;
                case MSG_THREE:
                    break;
                case MSG_FOURCE:
                    break;
                case MSG_SIX:
                    break;
            }
        }
    }
(6)private static void sendMsg(Handler handler, int msg, int existingMsgPolicy, int arg1, int arg2, Object obj, int delay) {
        if (existingMsgPolicy == SENDMSG_REPLACE) {
            handler.removeMessages(msg);
        } else if (existingMsgPolicy == SENDMSG_NOOP && handler.hasMessages(msg)) {
            Log.d(TAG, "sendMsg: Msg " + msg + " existed!");
            return;
        }
        handler.sendMessageDelayed(handler.obtainMessage(msg, arg1, arg2, obj), delay);
    }
(7)Handler的sendMessageDelayed (Message msg, long delayMillis) 说明:
public final boolean sendMessageDelayed (Message msg, long delayMillis)
Added in API level 1
Enqueue a message into the message queue after all pending messages before (current time + delayMillis).
You will receive it in handleMessage(Message), in the thread attached to this handler.
Returns
Returns true if the message was successfully placed in to the message queue.
Returns false on failure, usually because the looper processing the message queue is exiting.
Note that a result of true does not mean the message will be processed --
 if the looper is quit before the delivery time of the message occurs then the message will be dropped.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

JNI调用方法:
(1)在AudioSystem.java中添加
   /**
     * @hide
     */
    public static native int setMasterVolume(int vol);
(2)在android_media_AudioSystem.cpp中添加如下信息:

a)
static int
android_media_AudioSystem_setMasterVolume(JNIEnv *env, jobject thiz, jint vol)
{
    return check_AudioSystem_Command(AudioSystem::setMasterVolume((float)vol / 100));
}
b)   static JNINativeMethod gMethods[] = {
    {"setParameters",        "(Ljava/lang/String;)I", (void *)android_media_AudioSystem_setParameters},
    {"getParameters",        "(Ljava/lang/String;)Ljava/lang/String;", (void *)android_media_AudioSystem_getParameters},
    ......

    {"setMasterVolume",         "(I)I",     (void*)android_media_AudioSystem_setMasterVolume},
};
(3) 在AudioSystem.h和AudioSystem.cpp中声明和实现
    static status_t setMasterVolume(float value);

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

这篇关于Android Hander 通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/775487

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R