强制关闭后音频继续播放

the*_*ldm 7 audio android taskkill

首先,感谢您对这个伟大的网站,我通过搜索这里回答的问题找到了大量的信息.但是我有一个问题,我只发现了一个(没有答案).

我正在编写一个应用程序,它使用AudioTrack通过耳机插孔循环运行时生成的正弦波(以控制其他电子设备).它以定时间隔(使用Handler.postDelayed)执行此操作,并且它工作正常 - 除非您碰巧强制关闭应用程序.在这种情况下,即使在应用程序本身已经过去之后,正弦波仍在继续播放,而字面上我唯一能做的就是重启手机.

如果应用程序正确关闭,即使它崩溃,声音就会停止.

我试过了:

  • 创建一个onDestroy()方法来停止和释放AudioTrack实例,但不幸的是,它甚至都没有被调用.
  • 为声音循环使用更大的音频缓冲区(希望小缓冲区大小导致错误); 没有不同.
  • 再次启动我的应用程序:现在我有两个正常的正弦波!
  • 完全卸载(!)应用程序:正弦波仍然在那里困扰着我的坟墓.
  • 将手机置于静音模式:没有区别.(我不希望这发生在我的用户身上.)
  • 将媒体音量一直调低,等待15分钟以上:没有区别.
  • 将采样率更改为11,22或44.1 kHz:无差异.
  • 一次又一次地开始和杀死应用程序:我实际上可以通过这种方式让8种不同的不朽正弦波相互干扰.实际上非常酷.:P

我知道在Android上使用任务杀手并不"健康",但很多人仍然这样做,而且我不希望我的用户的手机变成不可阻挡的噪音发生器,以防我的应用程序碰巧挂起并让它的屁股发出声响.

以下是生成正弦波的代码:

int bufSize = (int)(11025.0 / 60.0); // the number of samples needed for a seamless loop at 60Hz
AT = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO,
    AudioFormat.ENCODING_PCM_8BIT, bufSize, AudioTrack.MODE_STATIC);

byte buffer[] = new byte[bufSize];

float angle = 0.0f;
for (int i=0; i < bufSize; i++){
    buffer[i] = (byte)(Math.sin(angle) * 255);
    angle += (float)(2*Math.PI) * 60 / 11025;
}

if (AT.write(buffer, 0, bufSize) != bufSize){
    log("Error: Couldn't write audio buffer!");
} else {
    AT.setLoopPoints(0, bufSize, -1);
    AT.play();
}
Run Code Online (Sandbox Code Playgroud)

虽然我很确定这个bug本身就在Android中,但我一直在拼命寻找一种检测力关闭的方法,以便在我的应用程序死亡之前运行最后一行代码来阻止这种情况发生.我找不到任何解决方案,即使我知道这可能是某种方式(我有一个邪恶的警报应用程序,即使你用任务杀手杀死它恢复生机).如果有人能够启发我,我将非常感激!

我还注意到,当我的应用程序在后台运行并返回时(从"最近的应用程序"菜单或通过任何其他方式),似乎每次都创建一个新实例.这意味着你无法阻止在后台播放的其他实例 - 除非你使用任务杀手......我确信这一定是一些琐碎的初学者我犯的错误,但我想知道它是否可能是相关的死亡的正弦波.

在Xperia X10 mini pro上运行Android 2.1.1.

Com*_*are 1

尽管我很确定这个 bug 存在于 Android 本身

看起来确实是这样。我有机会说服您发布一个完整的项目来演示这个问题吗?另外,您在哪些 Android 操作系统版本上尝试过此操作?

我一直在拼命寻找一种方法来检测强制关闭,以便在我的应用程序崩溃之前运行最后一行代码来阻止这种情况发生。

根据定义,这是不可能的。

我没有找到解决方案,尽管我知道这是可能的

不,不是。

(我有一个邪恶的警报应用程序,即使你用任务杀手杀死它,它也会复活)。

这并不意味着被强制关闭的“邪恶警报应用程序”实例发现了这一事实。这意味着“邪恶警报应用程序”正在使用其他技术来查明已经死亡并开始新的副本。而且,即使你自己尝试这样做,正如你所指出的,这也无济于事——你得到的最好的结果就是你的“8 个不同的不朽正弦波”场景。

我还注意到,当我的应用程序在后台运行时

你为什么要费心编写一个Service来播放正弦波?我可以看到当您的活动位于前台时正在播放它,但您应该停止 中的正弦波onPause(),因此当您不在前台时,噪音就会停止。

然后我返回它(从“最近的应用程序”菜单或通过任何其他方式),似乎每次都会创建一个新实例

根据“在后台运行”的含义以及进入“后台”的方式,这是正常的。例如,按“BACK”按钮将破坏该 Activity;以任何方式返回它都会创建一个新的活动实例。