https://github.com/979451341/AppAlive

本人在学习音视频时无意发现的黑科技,发现在使用AudioTrack播放音乐时,使用手机的一键清理发现程序还在,我指的是Activity还活着。

我当时就想起来了酷狗音乐也是这样,当我没有播放音乐时,这个酷狗音乐通过我一键清理会死掉,如果我播放音乐再一键清理就不会死,而且它还有前台通知存活,但是如果暂停音乐再一键清理还是会死。

我再说说我的程序

我在raw文件下放了一个pcm文件,然后播放这个pcm

DataInputStream dis = new DataInputStream(

new BufferedInputStream(getResources().openRawResource(R.raw.a)));

// 实例AudioTrack

AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC,

mFrequence,

mPlayChannelConfig, mAudioEncoding, bufferSize,

AudioTrack.MODE_STREAM);

track.setStereoVolume(0,0);

// 开始播放

track.play();

其中我还通过track.setStereoVolume(0,0);将播放pcm文件时的音量调成0,也就是静音

还有就是播放这个pcm是不断循环的,而且是处于后台的,所以我使用了AsyncTask来调控这个进程,通过mIsPlaying来控制这个播放的停止

class PlayTask extends AsyncTask {

@Override

protected Void doInBackground(Void... arg0) {

mIsPlaying = true;

for(;mIsPlaying;){

int bufferSize = AudioTrack.getMinBufferSize(mFrequence,

mPlayChannelConfig, mAudioEncoding);

short[] buffer = new short[bufferSize ];

try {

// 定义输入流,将音频写入到AudioTrack类中,实现播放

DataInputStream dis = new DataInputStream(

new BufferedInputStream(getResources().openRawResource(R.raw.a)));

// 实例AudioTrack

AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC,

mFrequence,

mPlayChannelConfig, mAudioEncoding, bufferSize,

AudioTrack.MODE_STREAM);

track.setStereoVolume(0,0);

// 开始播放

track.play();

// 由于AudioTrack播放的是流,所以,我们需要一边播放一边读取

while (mIsPlaying && dis.available() > 0) {

int i = 0;

while (dis.available() > 0 && i < buffer.length) {

buffer[i] = dis.readShort();

i++;

}

// 然后将数据写入到AudioTrack中

track.write(buffer, 0, buffer.length);

}

// 播放结束

track.stop();

dis.close();

} catch (Exception e) {

// TODO: handle exception

Log.e("slack","error:" + e.getMessage());

}

}

return null;

}

protected void onPostExecute(Void result) {

}

protected void onPreExecute() {

}

}

对于AudioTrack占住资源能够使得app在android7.0的手机一键清理下存活,这个原理在下不懂,求大神留言教教在下

还有我试验的时候用了android7.0的华为,程序通过一键清理可以不死,但是在android7.2的魅族的一键清理下还是死了,果然定制内存管理就是强大

原文:http://blog.51cto.com/13591594/2069860

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐