Как не допустить, чтобы ActivityManager убил фоновый процесс моего приложения - PullRequest
0 голосов
/ 27 марта 2020

Я занимаюсь разработкой мобильного приложения, которое работает в фоновом режиме. Он делает снимки экрана в фоновом режиме с интервалом, однако через некоторое время ActivityManager завершит процесс с журналом, I/ActivityManager: killing com.example: excessive cpu xxxx during yyyyy dur=zzzzz limit=2

Что я могу сделать, чтобы ActivityManager не убил приложение?

Я проверяю утечку памяти с помощью LeakCanary, но обнаружена утечка 0

Я пытался:
- minifyEnabled true
- shrinkResources true
- proguardFiles

Я использую Handler для автоматического запуска моей программы (в основном MediaProjection и ImageReader) с интервалом. После изучения уроков из других вопросов и Google я сделал Handler stati c, но та же проблема все еще сохраняется.

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

1 Ответ

1 голос
/ 27 марта 2020

Запуск услуг будет прекращен каждые 30 минут. Службы, которые sh должны оставаться живыми дольше, чем это, должны вызывать Service.startForeground, который помещает уведомление в панель уведомлений, чтобы пользователи знали, что ваша служба работает постоянно и потенциально может расходовать заряд батареи.

Пожалуйста, покажите уведомление пользователю.

Надеюсь, это будет полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...