如何防止 ActivityManager 终止我的应用程序的后台进程

How to prevent ActivityManager from killing my application's background process

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

如何防止 ActivityManager 终止应用程序?

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

我试过了:
- minifyEnabled 真
- 收缩资源真
-proguardFiles

我正在使用一个 Handler 到 运行 我的程序自动(主要是 MediaProjectionImageReader)。在遵循其他问题和 google 的教程后,我将 Handler 设为静态,但同样的问题仍然存在。

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);
        }
    };

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

请向用户显示通知。

希望这会有所帮助。