1

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

我能做些什么来防止ActivityManager杀死应用程序?

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

我试过:
- minifyEnabled true
- shrinkResources true
- proguardFiles

我正在使用 a每隔一段时间Handler自动(主要是MediaProjection和)运行我的程序。ImageReader在遵循其他问题和谷歌的教程后,我制作了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);
        }
    };
4

1 回答 1

1

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

请向用户显示通知。

希望这会有所帮助。

于 2020-03-27T13:31:56.060 回答