Android7.0手機程序保活(附源碼下載)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章