項目地址,求starhttps://github.com/979451341/AppAlive本人在學習音視頻時無意發現的黑科技,發現在使用AudioTrack播放音樂時,使用手機的一鍵清理髮現程式還在,我指的是Activity還活著。 我當時就想起來了酷狗音樂也是這樣,當我沒有播放音樂時,這個酷狗 ...
項目地址,求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的魅族的一鍵清理下還是死了,果然定製記憶體管理就是強大