我已经通过反编译检查过,在某些应用程序的 list 中,服务不是通过单独的进程启动的。顺便说一句,在任务管理器中,它显示为“正在运行”。
例如 Facebook,在 Android 4.4.2 上,有 0 个进程和 2 个服务在运行。 从文档中(如果我错了请纠正我)我了解到服务在其应用程序的同一进程中运行。如果进程终止,服务将停止(并且可以通过 AlarmManager 或 START_STICKY 自动重新启动)。
因此,如果它不是在单独的进程中启动,则至少应该有一个可以运行该服务的进程。那么,有没有可能一个服务即使没有进程也能运行呢?我再说一遍,服务(来自 list )没有得到指令 android: background
编辑 1: 看来是Android 4.4.2的bug。参见 this和 this .就我而言,当我从列表中滑动应用程序时遇到问题(如第二个链接中所述)
编辑 2: 如果我错了请纠正我,这是我的理解。
当调用startService() 时,第一次创建Service 对象。 onCreate() 将在该服务对象上被调用,onStartCommand() 将随之而来。从现在开始:
stopSelf()
未被调用)但它没有运行。 START_STICKY(和其他重启常量)或手动调用 startService()。当服务从系统中被杀死时,onCreate 将被再次调用。现在,这是 Android < 4.4.2="" 上的正常行为。在="" kitkat="" 上,如果您从="" lru="" 列表中滑动应用程序,进程就会终止,即使使用="" start_sticky="" 也不会自动重新启动。解决方法是="">
最佳答案
您的服务是您应用程序的一部分。根据定义,您的应用程序在服务运行时正在运行。例如,当 AlarmManager 在预定时间调用您的服务时,Android 首先为该应用程序启动一个进程(如果它尚未运行),然后在正在运行的应用程序中调用您的服务。
一般来说,您是正确的:如果应用程序(进程)终止,服务也会随之终止。
Android 支持 list 属性 android:process,它允许您指定应用程序的特定组件应在单独的进程中运行。这实质上是在多个进程中运行应用程序的多个相同副本。 Android 只是使用其中一个进程运行一个组件,使用另一个进程运行另一个组件。您的应用程序同时运行。
混淆的根源在于“设置”>“应用程序”页面使用“流程”和“服务”这两个词的方式。它似乎使用前者来计算具有 UI 组件的进程,而后者来计算所有其他进程。如果您使用 adb 连接到您的设备并使用“ps”命令,您将获得更好地反射(reflect)对这些词的普遍理解的内容。
关于android - 为什么服务在其进程被杀死后仍在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22270865/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput