Android7.0手机程序保活(附源码下载)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的魅族的一键清理下还是死了,果然定制内存管理就是强大

以上是关于Android7.0手机程序保活(附源码下载)的主要内容,如果未能解决你的问题,请参考以下文章

Android7.0以上 安装Ca证书

appium在android7.0上无法启动问题

2023年Android黑科技保活方案,应用永生,拒绝强制杀死 最高适配Android 13 小米 华为 Oppo vivo 等最新机型 拒绝强杀 开机自启动 附demo apk 附研究资料

android 7.0下的iframe加载问题

使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)

Android Geolocation在模拟器中工作但不在手机中工作