Android 如何防止ActivityManager杀死我的应用程序';s背景过程

Android 如何防止ActivityManager杀死我的应用程序';s背景过程,android,performance,android-mediaprojection,android-activitymanager,Android,Performance,Android Mediaprojection,Android Activitymanager,我正在开发一个在后台运行的移动应用程序。它每隔一段时间在后台拍摄屏幕截图,但是一段时间后,ActivityManager将使用日志终止进程,I/ActivityManager:killing com.example:yyyy期间cpu xxxx过多dur=zzzzz limit=2 如何防止ActivityManager终止应用程序 我使用LeakCanary检查内存泄漏,但发现0泄漏 我试过: -minifyEnabled true -收缩资源为真 -程序文件 我正在使用处理程序每隔一段时间自

我正在开发一个在后台运行的移动应用程序。它每隔一段时间在后台拍摄屏幕截图,但是一段时间后,ActivityManager将使用日志终止进程,
I/ActivityManager:killing com.example:yyyy期间cpu xxxx过多dur=zzzzz limit=2

如何防止
ActivityManager
终止应用程序

我使用LeakCanary检查内存泄漏,但发现0泄漏

我试过:
-minifyEnabled true
-收缩资源为真
-程序文件

我正在使用
处理程序
每隔一段时间自动运行我的程序(主要是
MediaProjection
ImageReader
)。在遵循了其他问题和google的教程之后,我将我的
处理程序设置为静态,但同样的问题仍然存在

MainActivity.java

    public void startCapturing() {
        try {
            mHandler.post(captureInterval);
            Toast.makeText(this, "started", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static class SafeRunnable implements Runnable {
        private final WeakReference<MainActivity> mReference;

        SafeRunnable(MainActivity reference) {
            mReference = new WeakReference<>(reference);
        }

        @Override
        public void run() {
            final MainActivity reference = mReference.get();
            if (reference != null) {
                runWithParent(reference);
            }
        }
        public void runWithParent(MainActivity reference) {

        }
    }

    private final Runnable captureInterval = new SafeRunnable(this) {
        @Override
        public void runWithParent(MainActivity reference) {
            android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
            destroyImageReader();
            destroyVirtualDisplay();
            if (!mKeyguardManager.isKeyguardLocked()) {
                if (mMediaProjection == null) {
                    startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
                } else {
                    createVirtualDisplay();
                }
            }
            reference.mHandler.removeCallbacksAndMessages(captureInterval);
            reference.mHandler.postDelayed(this, 5000);
        }
    };
public void startCapturing(){
试一试{
mHandler.post(捕获间隔);
Toast.makeText(这个“开始”,Toast.LENGTH_SHORT).show();
}捕获(例外e){
e、 printStackTrace();
}
}
私有静态类SafeRunnable实现Runnable{
私人最终WeakReference mReference;
安全运行(主活动参考){
mrreference=新的WeakReference(参考);
}
@凌驾
公开募捐{
final main活动引用=mrreference.get();
如果(引用!=null){
runWithParent(参考);
}
}
public void runWithParent(主活动引用){
}
}
private final Runnable captureInterval=新安全可运行(此){
@凌驾
public void runWithParent(主活动引用){
android.os.Process.setThreadPriority(android.os.Process.THREAD\u PRIORITY\u后台);
销毁ImageReader();
销毁虚拟显示();
如果(!mKeyguardManager.isKeyguardLocked()){
if(mmediprojection==null){
startActivityForResult(mProjectionManager.createScreenCaptureIntent(),请求代码);
}否则{
createVirtualDisplay();
}
}
reference.mHandler.removeCallbacksAndMessages(captureInterval);
参考号:mHandler.postDelayed(本,5000);
}
};

正在运行的服务将每30分钟终止一次。如果服务希望保持活动时间超过此时间,则必须调用Service.startForeground,它会在通知栏上放置一个通知,以便用户知道您的服务正在永久运行并可能耗尽电池寿命

请向用户显示通知


希望这会有所帮助。

“我正在开发一个在后台运行的移动应用程序”--您可能希望更详细地解释一下您是如何做到这一点的。您正在使用前台服务吗<代码>工作管理器
<代码>作业调度器?还有什么吗?嗨@commonware,我已经用运行处理程序的代码更新了问题。我在
onCreate()
中实例化
处理程序。我不使用任何前台服务。在安卓系统中,后台进程总是被终止。这在很多地方都有涉及,比如,书籍和课程。最接近你目标的是前台服务。另外,请记住,根据屏幕分辨率的不同,每5秒拍摄一次屏幕截图每天将消耗约1GB。在将我的代码重构为前台服务后,它的效果非常好。但是,现在存在内存泄漏问题。但这将是另一个问题。谢谢你的帮助!