Я занимаюсь разработкой мобильного приложения, которое работает в фоновом режиме. Он делает снимки экрана в фоновом режиме с интервалом, однако через некоторое время 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);
}
};