項目地址,求star
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<Void,Void,Void> {
@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的魅族的一鍵清理下還是死了,果然定製內存管理就是強大