【Android】【后台运行-1】请求电池优化

本文展示了在Android应用中请求电池优化的代码实现,分别在不同型号手机如Samsung Galaxy S7、Xiaomi note3、Huawei mate10 pro、Vivo X60和Xiaomi MI10上进行了真机测试,运行在Android 7.0至11的系统版本。文中提及AndroidManifest.xml中申请相应权限,并讨论了Activity中相关实现。同时提到了OnActivityResult方法的弃用及其替代方案。

先上代码

AndroidManifest.xml中申请权限

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

Activity中实现:

override fun onCreate(savedInstanceState: Bundle?) {
	......
    if (!isIgnoringBatteryOptimizations()) {
        requestIgnoreBatteryOptimizations();
    }
}

private fun isIgnoringBatteryOptimizations(): Boolean {
    var isIgnoring = false
    val powerManager = getSystemService(POWER_SERVICE) as PowerManager
    isIgnoring = powerManager.isIgnoringBatteryOptimizations(packageName)
    return isIgnoring
}

private fun requestIgnoreBatteryOptimizations() {
    try {
    	//此Intent是在当前应用界面弹出提示框,供用户选择;Samsung S7和Xiaomi note3可用,且无设置路径
        val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
        //上一个Intent对Huawei Mate10pro不支持,提示没有响应此Intent的Activity,故换成下面的Intent,跳转到设置界面
        //val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS)
		//Approach 1:
		//startActivity(intent)
		//Approach 2: 因为startActivityForResult在ComponentActivity中被废弃了,故需要用替代方案来获取result
        //startActivityForResult(intent, 200)
        resultLauncher.launch(intent)
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

private var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data: Intent? = result.data
        // Do something
    }
}

真机效果

  • Samsung Galaxy S7 - Android 7.0
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
图片名称图片名称
没有在设置中找到打开/关闭的路径此界面应该是被隐藏了,用户无法自主找到
  • Xiaomi note3 - Android 8.0.1
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
图片名称图片名称
没有在设置中找到打开/关闭的路径此界面应该是被隐藏了,用户无法自主找到
  • Huawei mate10 pro - Android 8.0
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
不支持图片名称
  • Vivo X60 - Android11
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
不支持图片名称
提示:android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS }跳转界面显示异常,手机厂商未开放(咕咚运动APP的此项设置是假的,实际并未设置成功)
  • Xiaomi MI10 - Android11
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
不支持图片名称
registerForActivityResult().result.resultCode 0,且不进行界面跳转跳转界面显示异常,跳转路径不对,但是选择“无限制”后,电池优化会变成“不优化”,怀疑小米对两者进行了关联绑定

下图是手动到设置app中设置的路径:

在这里插入图片描述

参考连接:
OnActivityResult method is deprecated, what is the alternative?

<think>好的,我现在要帮助用户了解Android Studio中Sherpa-OnnxTTS后台运行的逻辑。首先,我需要先确认自己对这个主题的理解是否正确。Sherpa-OnnxTTS应该是一个基于ONNX(Open Neural Network Exchange)的文本转语音引擎,而用户关心的是它在后台如何运行。 首先,我需要回顾一下Android应用的后台服务机制。在Android中,如果应用切换到后台,默认情况下,长时间运行的任务会被系统限制,所以可能需要使用Service或者WorkManager来保持运行。Sherpa-OnnxTTS作为TTS引擎,可能在后台需要持续合成语音,比如在导航或音乐播放类应用中。 接下来,关于Sherpa-OnnxTTS的具体实现逻辑。ONNX框架支持跨平台推理,所以Sherpa可能利用ONNX Runtime来加载和运行预训练的TTS模型。后台运行时,需要确保模型推理部分能够在Service中正确执行,同时管理音频输出,避免主线程阻塞,这涉及到多线程处理。 另外,音频播放部分。在后台生成语音流后,需要通过AudioTrack或MediaPlayer进行播放,同时处理音频焦点,避免与其他应用冲突。这里可能需要注册合适的音频焦点请求,并在失去焦点时暂停或降低音量。 资源管理也很重要,尤其是内存使用。ONNX模型可能较大,需确保在后台运行时不会导致应用内存不足,进而被系统终止。可能需要优化模型加载方式,或者使用轻量级模型。 还有生命周期管理的问题。当应用进入后台时,Sherpa-OnnxTTS需要正确处理Activity的生命周期事件,比如在onPause或onStop时暂停合成,或者在onDestroy时释放资源。但如果是通过Service运行,Service的生命周期则需要独立管理。 用户可能还关心如何保持后台运行的稳定性,比如防止ANR(应用无响应)。这要求将合成任务放在后台线程中,避免主线程阻塞,可能需要使用Handler、AsyncTask或者Kotlin协程等异步处理机制。 另外,需要考虑不同Android版本的差异,尤其是后台执行限制(如Android 8.0以上的后台服务限制)。可能需要使用前台服务,通过显示通知来保持活跃,或者改用JobScheduler/WorkManager来调度任务。 最后,权限问题也是关键。后台运行可能需要WAKE_LOCK权限来保持设备唤醒,或者请求忽略电池优化,确保合成过程不被中断。 总结下来,Sherpa-OnnxTTS的后台运行逻辑涉及服务管理、多线程处理、音频播放、资源优化、生命周期处理和系统兼容性等多个方面。需要结合Android的组件和最佳实践来确保稳定高效的后台语音合成。</think>在Android Studio中,**Sherpa-OnnxTTS**的后台运行逻辑主要基于Android系统组件和ONNX推理框架。以下是其核心逻辑的分步解析: --- ### 1. **服务架构** - **后台服务(Service)** Sherpa-OnnxTTS通常通过`Service`实现后台运行,确保在应用退到后台时仍能持续工作。 - 使用`startService()`或`bindService()`启动服务,通过`onStartCommand()`处理合成请求- 若需长时间运行(如导航场景),需结合`startForegroundService()`显示前台通知。 - **关键代码示例** ```kotlin class TtsService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { // 处理TTS合成任务 return START_STICKY // 服务被终止后自动重启 } } ``` --- ### 2. **ONNX推理流程** - **模型加载** 使用ONNX Runtime加载预训练的TTS模型(如FastSpeech2、VITS等): ```kotlin val env = OrtEnvironment.getEnvironment() val session = env.createSession("model.onnx", SessionOptions()) ``` - **文本预处理** 将输入文本转换为模型所需的数值特征(如音素ID、音调标记等)。 - **推理执行** 在后台线程中执行模型推理,生成梅尔频谱或波形数据: ```kotlin CoroutineScope(Dispatchers.Default).launch { val inputs = mapOf("text" to inputTensor) val outputs = session.run(inputs) val melSpectrogram = outputs.get("mel_output").tensor } ``` --- ### 3. **音频合成与播放** - **声码器转换** 将梅尔频谱通过声码器(如HiFi-GAN)转换为波形音频: ```kotlin val vocoderSession = OrtEnvironment.getEnvironment().createSession("hifigan.onnx") val audio = vocoderSession.run(mapOf("mel" to melSpectrogram)) ``` - **音频流输出** 通过`AudioTrack`或`MediaPlayer`播放生成的PCM数据: ```kotlin val audioTrack = AudioTrack.Builder() .setAudioFormat(AudioFormat.Builder().setSampleRate(22050).build()) .build() audioTrack.write(audioData, 0, audioData.size) audioTrack.play() ``` --- ### 4. **后台资源管理** - **线程隔离** 使用`HandlerThread`或协程(`Dispatchers.IO`)分离推理任务,避免主线程阻塞。 - **内存优化** - 限制并发合成任务数量。 - 释放无用模型中间张量(通过`close()`方法)。 - **生命周期绑定** 在`Service`的`onDestroy()`中释放ONNX会话和音频资源: ```kotlin override fun onDestroy() { session.close() audioTrack.release() super.onDestroy() } ``` --- ### 5. **系统兼容性处理** - **电量优化适配** 针对Android 9+系统,需在`AndroidManifest.xml`声明`FOREGROUND_SERVICE`权限: ```xml <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> ``` - **后台限制规避** 使用`WorkManager`调度非实时任务,或通过`PowerManager.WakeLock`保持CPU唤醒。 --- ### 6. **错误处理与恢复** - **异常捕获** 在推理和音频播放阶段添加`try-catch`块,防止崩溃。 - **断点续合成** 缓存中间结果,在进程被终止后恢复合成进度(通过`onSaveInstanceState()`或数据库存储)。 --- ### 总结 Sherpa-OnnxTTS的后台运行逻辑围绕**服务生命周期管理**、**异步ONNX推理**、**音频流处理**和**系统资源优化**展开。开发者需平衡性能与功耗,确保在后台稳定输出高质量语音。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值