如何防止 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
到 运行 我的程序自动(主要是 MediaProjection
和 ImageReader
)。在遵循其他问题和 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,它会在通知栏上放置一个通知,以便用户知道您的服务永久 运行 并且可能会耗尽电池寿命。
请向用户显示通知。
希望这会有所帮助。
我正在开发 运行 在后台运行的移动应用程序。它会每隔一段时间在后台截取屏幕截图,但是一段时间后,ActivityManager 会使用日志终止进程,I/ActivityManager: killing com.example: excessive cpu xxxx during yyyyy dur=zzzzz limit=2
如何防止 ActivityManager
终止应用程序?
我使用 LeakCanary 检查内存泄漏,但发现了 0 个泄漏
我试过了:
- minifyEnabled 真
- 收缩资源真
-proguardFiles
我正在使用一个 Handler
到 运行 我的程序自动(主要是 MediaProjection
和 ImageReader
)。在遵循其他问题和 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,它会在通知栏上放置一个通知,以便用户知道您的服务永久 运行 并且可能会耗尽电池寿命。
请向用户显示通知。
希望这会有所帮助。