猿问
下载APP

前景服务被Android杀死

更新:我还没有找到问题的真正解决方案。我所做的是一种在连接丢失时自动重新连接到以前的蓝牙设备的方法。它并不理想,但似乎运作得相当好。我很想听到有关这个的更多建议。


我遇到的问题与此问题大致相同:服务在被唤醒时被杀死并且在调用startForeground之后包括设备(Asus Transformer),服务停止前的时间长度(30-45分钟),使用唤醒锁定,startForeground()的使用,以及当屏幕熄灭时应用程序打开时不会发生问题的事实。


我的应用程序维护与另一台设备的蓝牙连接,并在两者之间发送数据,因此它必须始终处于活动状态以侦听数据。用户可以随意启动和停止服务,实际上这是我实现启动或停止服务的唯一方法。服务重新启动后,与其他设备的蓝牙连接将丢失。


根据链接问题中的答案,startForeground()“降低了服务被杀的可能性,但并未阻止它”。我理解是这样的,但是我已经看到很多其他应用程序没有这个问题的例子(例如,Tasker)。


如果服务能够在用户停止之前运行,我的应用程序的实用性将大大降低。有什么方法可以避免这个???


每当服务停止时,我都会在logcat中看到这个:


ActivityManager: No longer want com.howettl.textab (pid 32321): hidden #16

WindowManager: WIN DEATH: Window{40e2d968 com.howettl.textab/com.howettl.textab.TexTab paused=false

ActivityManager: Scheduling restart of crashed service com.howettl.textab/.TexTabService in 5000ms

编辑:我还应该注意,这似乎没有出现在我连接的其他设备上:HTC Legend运行Cyanogen


编辑:这是输出adb shell dumpsys activity services:


* ServiceRecord{40f632e8 com.howettl.textab/.TexTabService}


intent={cmp=com.howettl.textab/.TexTabService}


packageName=com.howettl.textab


processName=com.howettl.textab


baseDir=/data/app/com.howettl.textab-1.apk


resDir=/data/app/com.howettl.textab-1.apk


dataDir=/data/data/com.howettl.textab


app=ProcessRecord{40bb0098 2995:com.howettl.textab/10104}


isForeground=true foregroundId=2 foregroundNoti=Notification(contentView=com.howettl.textab/0x1090087 vibrate=null,sound=null,defaults=0x0,flags=0x6a)


createTime=-25m42s123ms lastActivity=-25m42s27ms


 executingStart=-25m42s27ms restartTime=-25m42s124ms


startRequested=true stopIfKilled=false callStart=true lastStartId=1


Bindings:


* IntentBindRecord{40a02618}:


  intent={cmp=com.howettl.textab/.TexTabService}


  binder=android.os.BinderProxy@40a9ff70


  requested=true received=true hasBound=true doRebind=false


  * Client AppBindRecord{40a3b780 ProcessRecord{40bb0098 2995:com.howettl.textab/10104}}


    Per-process Connections:


      ConnectionRecord{40a76920 com.howettl.textab/.TexTabService:@40b998b8}


一只名叫tom的猫
浏览 237回答 3
3回答

海绵宝宝撒

如果它说“不再需要......”那么该进程在其中没有活动的服务当前处于startForeground()状态。检查以确保您的呼叫实际上是成功的 - 您看到发布的通知,此时日志中没有消息抱怨任何事情等。还使用“adb shell dumpsys活动服务”来查看您的服务状态,并确保它实际上标记为前景。此外,如果它是正确的前景,那么在“adb shell dumpsys activity”的输出中,您将在显示由于该服务而您的进程当前处于前台级别的进程的OOM adj的部分中看到。

慕容森

Upvoted。我想在这篇评论中添加一篇,我认为这是相关的。如果你想要一个不断运行的服务,正如Robin所说,你需要以某种方式启动它。可以直接在activity中调用startService(Intent服务)而不是bindService(),然后在服务启动后调用startForeground()方法。我在服务类的onStartCommand()中调用它。据我所知,这应该使您的服务不受限制,但保持运行等待资源问题。希望这有助于某人。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答