zoukankan      html  css  js  c++  java
  • 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的魅族的一键清理下还是死了,果然定制内存管理就是强大

  • 相关阅读:
    Shell 批量搜索关键词并保存结果到文件中(数组、循环)
    解决tensorflow的Session Exception问题
    解决h5py的FutureWarning问题
    【转】Ubuntu16.04安装WPS
    [Linux] 随机切分文件内容
    [Python] 动态函数调用(通过函数名)
    [Python] dict字典的浅复制与深复制
    基于sklearn进行文本向量化
    Asp.Net MVC SingleServiceResolver类剖析
    Asp.Net MVC 高级特性(附带源码剖析)
  • 原文地址:https://www.cnblogs.com/jianpanwuzhe/p/8426980.html
Copyright © 2011-2022 走看看