我已经阅读了有关该主题的所有Stackoverflow答案,但是没有一个起作用。
问题:每当我的设备进入睡眠模式一个小时或更长时间时,该服务就会被终止
START_STICKY
onStartCommand()
startForeground()
public int onStartCommand(Intent intent, int flags, int startId) { notification = makeStickyNotification(); //I've simplified the irrelevant code, obviously this would be a real notification I build startForeground(1234, notification); return START_STICKY; }
这可以正常工作,并且即使设备内存不足,它甚至也可以重新启动我的服务,但这不足以解决我的设备进入睡眠状态一段时间后出现的问题。
onCreate()
Intent ll24 = new Intent(this, AlarmReceiver.class); PendingIntent recurringLl24 = PendingIntent.getBroadcast(this, 0, ll24, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarms.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000*60, recurringLl24); // Every minute
这有助于使我的服务保持活动状态,但同样不能解决我的问题
if (scheduleTaskExecutor == null) { scheduleTaskExecutor = Executors.newScheduledThreadPool(1); scheduleTaskExecutor.scheduleAtFixedRate(new mainTask(), 0, 1, TimeUnit.SECONDS); } ... class mainTask implements Runnable { public void run() { // 1 Second Timer } }
这也只能使服务保持活动状态,但长时间睡眠后仍无法保持活动状态。
android:launchMode="singleTop"
这没做
我如何(1)不必使手机进入睡眠状态并每小时检查一次就可以测试此问题,以及(2)即使设备进入睡眠状态也可以保持服务运行?
谋杀之谜已经解决,我知道是什么使我丧命。 这是我所做的:
startsticky
startforeground
alarmmanager
scheduleTaskExecutor
wakelock
adb shell dumpsys activity processes > tmp.txt
这将为我提供所有正在运行的进程及其系统优先级的详细日志。从本质上讲,tmp.txt将是这个谋杀之谜中的侦探。
tmp.txt
Proc #31: adj=prcp /FS trm= 0 2205:servicename.service/uID (fg-service)
上面的行表示在Android设备上运行的进程的确切优先级。adj=prcp表示该服务是可见的前台服务。
adj=prcp
在这一点上,我意识到我的服务在运行几个小时后必须遇到一些错误,因此我让它运行并终止。 死后,我dumpsys再次进行检查该错误:
dumpsys
com.rvalerio.fgchecker.AppChecker $ 2.run(AppChecker.java:118)上com.curlybrace.ruchir.appName.MyService $ 2.onForeground(MyService.java:199)在android.os.Handler.handleCallback(Handler.java: 751),位于java.android.app.ActivityThread.main(ActivityThread.java:6123),位于android.os.Looper.loop(Looper.java:154),位于android.os.Handler.dispatchMessage(Handler.java:95)。 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:867)上的lang.reflect.Method.invoke(本机方法)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) )
导致我的服务被终止的堆栈跟踪记录就在那里显示!从本质上讲,用于检查正在使用的前台应用程序的变量在不活动数小时后将变为空,这将导致异常并终止服务!
关键要点: 如果您的服务被终止,并且您已尽一切努力确保它不被终止,请执行a dumpsys并检查设备活动过程的实质。我保证您会以这种方式找到问题。
我仍然希望奖励@Khemraj,因为对于那些未正确启动服务的人来说,他的回答可能是一个很好的解决方案。 但是,我接受此答案,因为实际上是解决该问题的解决方案。