Android 如何防止ActivityManager杀死我的应用程序';s背景过程
我正在开发一个在后台运行的移动应用程序。它每隔一段时间在后台拍摄屏幕截图,但是一段时间后,ActivityManager将使用日志终止进程,Android 如何防止ActivityManager杀死我的应用程序';s背景过程,android,performance,android-mediaprojection,android-activitymanager,Android,Performance,Android Mediaprojection,Android Activitymanager,我正在开发一个在后台运行的移动应用程序。它每隔一段时间在后台拍摄屏幕截图,但是一段时间后,ActivityManager将使用日志终止进程,I/ActivityManager:killing com.example:yyyy期间cpu xxxx过多dur=zzzzz limit=2 如何防止ActivityManager终止应用程序 我使用LeakCanary检查内存泄漏,但发现0泄漏 我试过: -minifyEnabled true -收缩资源为真 -程序文件 我正在使用处理程序每隔一段时间自
I/ActivityManager:killing com.example:yyyy期间cpu xxxx过多dur=zzzzz limit=2
如何防止ActivityManager
终止应用程序
我使用LeakCanary检查内存泄漏,但发现0泄漏
我试过:-minifyEnabled true
-收缩资源为真
-程序文件 我正在使用
处理程序
每隔一段时间自动运行我的程序(主要是MediaProjection
和ImageReader
)。在遵循了其他问题和google的教程之后,我将我的处理程序设置为静态,但同样的问题仍然存在
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);
}
};
public void startCapturing(){
试一试{
mHandler.post(捕获间隔);
Toast.makeText(这个“开始”,Toast.LENGTH_SHORT).show();
}捕获(例外e){
e、 printStackTrace();
}
}
私有静态类SafeRunnable实现Runnable{
私人最终WeakReference mReference;
安全运行(主活动参考){
mrreference=新的WeakReference(参考);
}
@凌驾
公开募捐{
final main活动引用=mrreference.get();
如果(引用!=null){
runWithParent(参考);
}
}
public void runWithParent(主活动引用){
}
}
private final Runnable captureInterval=新安全可运行(此){
@凌驾
public void runWithParent(主活动引用){
android.os.Process.setThreadPriority(android.os.Process.THREAD\u PRIORITY\u后台);
销毁ImageReader();
销毁虚拟显示();
如果(!mKeyguardManager.isKeyguardLocked()){
if(mmediprojection==null){
startActivityForResult(mProjectionManager.createScreenCaptureIntent(),请求代码);
}否则{
createVirtualDisplay();
}
}
reference.mHandler.removeCallbacksAndMessages(captureInterval);
参考号:mHandler.postDelayed(本,5000);
}
};
正在运行的服务将每30分钟终止一次。如果服务希望保持活动时间超过此时间,则必须调用Service.startForeground,它会在通知栏上放置一个通知,以便用户知道您的服务正在永久运行并可能耗尽电池寿命
请向用户显示通知
希望这会有所帮助。“我正在开发一个在后台运行的移动应用程序”--您可能希望更详细地解释一下您是如何做到这一点的。您正在使用前台服务吗<代码>工作管理器
<代码>作业调度器?还有什么吗?嗨@commonware,我已经用运行处理程序的代码更新了问题。我在onCreate()
中实例化处理程序。我不使用任何前台服务。在安卓系统中,后台进程总是被终止。这在很多地方都有涉及,比如,书籍和课程。最接近你目标的是前台服务。另外,请记住,根据屏幕分辨率的不同,每5秒拍摄一次屏幕截图每天将消耗约1GB。在将我的代码重构为前台服务后,它的效果非常好。但是,现在存在内存泄漏问题。但这将是另一个问题。谢谢你的帮助!