【发布时间】:2020-07-08 05:52:52
【问题描述】:
我正在开发一个在后台运行的移动应用程序。它每隔一段时间在后台截取屏幕截图,但是一段时间后,ActivityManager 会使用日志终止进程,I/ActivityManager: killing com.example: excessive cpu xxxx during yyyyy dur=zzzzz limit=2
如何防止ActivityManager 杀死应用程序?
我使用 LeakCanary 检查内存泄漏,但发现 0 个泄漏
我试过了:
- 缩小启用真
- 收缩资源真实
- proguardFiles
我正在使用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);
}
};
【问题讨论】:
-
“我正在开发一个在后台运行的移动应用程序”——您可能想更详细地解释一下您是如何做到这一点的。你在使用前台服务吗?
WorkManager?JobScheduler?还有什么? -
嗨@CommonsWare,我已经用运行处理程序的代码更新了问题。我在
onCreate()中实例化Handler。我不使用任何前台服务。 -
在 Android 中,后台进程一直被终止。这在很多地方都有介绍,比如the documentation、书籍和课程。最接近您的目标的是前台服务。此外,请记住,每 5 秒截取一次屏幕截图每天会消耗约 1GB,具体取决于屏幕分辨率。
标签: android performance android-mediaprojection android-activitymanager