Android 一直在终止我的服务
Android keeps killing my service
我尝试实施在 "Stack" 上找到的一些解决方案,但我发现没有任何帮助。这就是问题:
我有带 1 GB RAM 的 Asus Memopad 8 平板电脑。它 运行s "KitKat"。基本上它总是有大约 200 MB 的空闲 RAM。
对于该平板电脑,我正在尝试创建一项服务来监控当前 运行ning 前台应用程序,如果它是我选择的特定应用程序,则执行特定操作。
本质上服务(扩展 IntentService)每 2 秒执行一次:
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
return componentInfo.getPackageName();
问题是我的服务在我的平板电脑休眠时被Android杀死。所以,我开始我的服务,它工作正常。当我用完我的平板电脑后,我把它收起来了。几个小时后,我再次使用我的平板电脑 - 服务消失了。如果我在收起平板电脑几分钟后使用它,服务仍然有效。
我试过这个:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
return START_REDELIVER_INTENT;
}
我也尝试过 "START_STICKY",但运气不好。
我应该怎么做才能防止 Android 关闭我的服务?我不想 运行 将其作为 "foregroundService",因为它是一项实用服务,应该一直 运行,而且我不希望我的状态栏显示永久通知。当服务检测到正确的前台应用程序时,我已经收到通知 运行ning。
您可以创建一个 BroadcastReceiver,它将在被 phone 杀死后立即启动服务。
在服务 class 中的 onDestroy() 方法上,启动自定义 BroadcastReceiver、
@Override
public void onDestroy() {
Intent in = new Intent();
in.setAction("immortal_service");
sendBroadcast(in);
}
现在在清单文件中注册 BroadcastReceiver,
<receiver android:name=".ServiceDestroyReceiver" >
<intent-filter>
<action android:name="immortal_service" >
</action>
</intent-filter>
</receiver>
ServiceDestroyReceiver class 将在被杀死后启动您的服务,
@Override
public void onReceive(Context context, Intent intent) {
// start the service again here
}
因此,Prokash Sarker 的解决方案很好,改进了一些东西,但不是最终的解决方案。
即使内存不足(请记住,我的设备总共只有 1 GB!)也能确保我的服务正常运行的最终解决方案 here。
基本上我实现了 "Alarm" 描述的,这将确保我的服务在关闭后最多 2 秒重新启动。我还向意图添加了一些 "extra",以便能够识别从 "alarm service" 发送的意图。
由于 Android 中的服务是单例,如果一个已经是 运行 "Alarm" 将不会启动另一个。
我尝试实施在 "Stack" 上找到的一些解决方案,但我发现没有任何帮助。这就是问题: 我有带 1 GB RAM 的 Asus Memopad 8 平板电脑。它 运行s "KitKat"。基本上它总是有大约 200 MB 的空闲 RAM。 对于该平板电脑,我正在尝试创建一项服务来监控当前 运行ning 前台应用程序,如果它是我选择的特定应用程序,则执行特定操作。 本质上服务(扩展 IntentService)每 2 秒执行一次:
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
return componentInfo.getPackageName();
问题是我的服务在我的平板电脑休眠时被Android杀死。所以,我开始我的服务,它工作正常。当我用完我的平板电脑后,我把它收起来了。几个小时后,我再次使用我的平板电脑 - 服务消失了。如果我在收起平板电脑几分钟后使用它,服务仍然有效。
我试过这个:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
return START_REDELIVER_INTENT;
}
我也尝试过 "START_STICKY",但运气不好。
我应该怎么做才能防止 Android 关闭我的服务?我不想 运行 将其作为 "foregroundService",因为它是一项实用服务,应该一直 运行,而且我不希望我的状态栏显示永久通知。当服务检测到正确的前台应用程序时,我已经收到通知 运行ning。
您可以创建一个 BroadcastReceiver,它将在被 phone 杀死后立即启动服务。
在服务 class 中的 onDestroy() 方法上,启动自定义 BroadcastReceiver、
@Override
public void onDestroy() {
Intent in = new Intent();
in.setAction("immortal_service");
sendBroadcast(in);
}
现在在清单文件中注册 BroadcastReceiver,
<receiver android:name=".ServiceDestroyReceiver" >
<intent-filter>
<action android:name="immortal_service" >
</action>
</intent-filter>
</receiver>
ServiceDestroyReceiver class 将在被杀死后启动您的服务,
@Override
public void onReceive(Context context, Intent intent) {
// start the service again here
}
因此,Prokash Sarker 的解决方案很好,改进了一些东西,但不是最终的解决方案。
即使内存不足(请记住,我的设备总共只有 1 GB!)也能确保我的服务正常运行的最终解决方案 here。
基本上我实现了 "Alarm" 描述的,这将确保我的服务在关闭后最多 2 秒重新启动。我还向意图添加了一些 "extra",以便能够识别从 "alarm service" 发送的意图。 由于 Android 中的服务是单例,如果一个已经是 运行 "Alarm" 将不会启动另一个。