我尝试在" Stack"上找到一些解决方案。但我发现没有任何帮助我。这就是问题: 我有华硕Memopad 8平板电脑与1 GB的RAM。它运行" KitKat"。基本上它总是有大约200 MB的空闲RAM。 对于那款平板电脑,我试图创建一项服务来监控当前运行的前台应用程序,如果它是我选择的特定应用程序,请执行某些操作。 本质上,service(扩展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;
}
我也试过&#34; START_STICKY&#34;没有运气。
我应该怎么做以防止Android关闭我的服务?我不想把它作为&#34; foregroundService&#34;因为它是一个应该一直运行的公用事业服务,我不希望我的状态栏填充永久通知。当服务检测到正确的前台应用运行时,我已经收到通知。
答案 0 :(得分:1)
您可以创建一个 BroadcastReceiver ,它会在被电话杀死后立即启动该服务。
在服务类的 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 类将在被杀后启动您的服务,
@Override
public void onReceive(Context context, Intent intent) {
// start the service again here
}
答案 1 :(得分:0)
因此,Prokash Sarker的解决方案很好,改进了一些东西,但并不是一个明确的解决方案。
确定我的服务即使在RAM短缺的情况下也能保持活动的确定解决方案(请记住,我的设备总共只有1 GB!)可以找到here。
基本上我实施了描述&#34;报警&#34;这将确保我的服务在关闭后最多2秒重新启动。我还添加了一些&#34;额外的&#34;意图是为了能够识别从警报服务&#34;发送的意图。 因为Android中的服务是单身,所以如果一个已经在运行&#34;警报&#34;不会再开始了。