网站建设资讯

NEWS

网站建设资讯

android后台服务的简单介绍

android后台服务保持,不被杀死

作者:闭关写代码

创新互联专注于呼图壁网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供呼图壁营销型网站建设,呼图壁网站制作、呼图壁网页设计、呼图壁网站官网定制、重庆小程序开发服务,打造呼图壁网络公司原创品牌,更为您提供呼图壁网站排名全网营销落地服务。

链接:

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

强烈建议不要这么做,不仅仅从用户角度考虑,作为Android开发者也有责任去维护Android的生态环境。现在很多Android开发工程师,主力机居然是iPhone而不是Android设备,感到相当悲哀。

从技术角度概括一下现在普遍的防杀方法

Service设置成START_STICKY,kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样

通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别,除非在系统内存非常缺,否则此进程不会被 kill

双进程Service:让2个进程互相保护,其中一个Service被清理后,另外没被清理的进程可以立即重启进程

QQ黑科技:在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死

在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用(Android4.0系列的一个漏洞,已经确认可行)

Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android-Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以下可行)

用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。

在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。

主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。

联系厂商,加入白名单

------------------------------------------------------

TIP: 面对各种流氓软件后台常驻问题,建议使用“绿色守护”来解决,可是杀掉那些第三方清理工具难以清除的后台程序

安卓手机的软件是怎样在后台运行的?

安卓android后台的软件自动启动程序 - 使用android手机必读(精华中的精华)2011-08-25 16:06不用在意剩余内存的大小,其实很多人都是把使用其他系统的习惯带过来来了。android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系。如果你知道java,就能更清楚这机制了。其实和java的垃圾回收机制类似,系统有一个规则来回收内存。进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊。但事实上他并不影响速度。相反加快了下次启动应用的速度。这本来就是android标榜的优势之一,如果人为去关闭进程,没有太大必要。特别是使用自动关进程的软件。(这里解决了大家非要关进程的误区!)

到这里有人会说了,那为什么内存少的时候运行大型程序会慢呢?其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。所以,论坛上有个更改内存阀值的程序可以有一定改善。但改动也可能带来一些问题,取决于值的设定。

那么,进程管理软件有无必要呢?有的。就是在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显著的提高运行速度。但一些小程序,完全可交由系统自己管理。

谈到这里,可能有的朋友会问,如果不关程序是不是会更耗电。我就说说android后台的原理,你就明白了。android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。所以为什么有的程序切出去重进会到主界面。但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务。服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了。这个在进程管理软件里能看到,标签是service。至于广播什么的我就不涉及了。所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个android的优点呢?(告诉我们如何合理使用进程管理软件)

还有一个,为什么android一个应用看起来那么耗内存。大家知道,android上的应用是java,当然需要虚拟机,而android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机。这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存。(跟塞班也不一样,案桌不容易死机重启)

以上这些设计确保了android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现。大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,很没必要。大家不妨按我说的习惯来用用这个系统。

Android O 后台服务限制

谷歌刚刚发布了Android O技术预览版,为了提升续航和减少耗电,Android进一步限制了后台服务的运行。本文将为大家介绍Android O新增的后台服务限制,翻译自Android O开发者博客,原文在 这里 。

当应用在后台运行时,仍然会占用系统的内存。如果在后台运行的应用比较多,并且用户正在玩游戏或者看视频的时候,那么很容易会导致系统卡顿。为了提升用户体验,Android O增加了对后台应用的限制。这篇文章将介绍系统对后台应用运行的限制,以及开发者应该如果修改应用以适应这个限制。

在Android系统中,很多应用和服务是可以同时运行的。比如说,用户可以在一个窗口中玩游戏,在另一个窗口中浏览网页,同时使用第三个应用来听音乐。同时运行的应用越多,系统的负载就越大。如果又有其他的应用或者服务在后台运行的话,那么又会增加系统的负载,最后导致系统卡顿,影响到用户体验,比如正在播放的音乐会突然停止。

为了减少系统卡顿,Android O限制那些用户不再直接交互应用的运行。针对targetSdkVersion是Android O的应用,Android增加了以下两种方式的限制:

大多数情况下,应用可以使用 JobScheduler 的Jobs来绕开上述的限制。即使应用没有处于运行状态,应用可以安排 JobScheduler 的Jobs来执行什么工作,系统会在不影响用户体验的情况下,调度这些Jobs的运行。

后台服务会占用系统资源,这个会导致糟糕的用户体验。为了解决这个问题,Android O对应用的后台服务增加了一堆的限制。注意这些限制仅仅是针对targetSdkVersion为Android O的应用,targetSdkVersion为25或者以下的应用不受影响。

系统会区分前台和后台应用。当满足以下任意一个条件时,系统判定应用是前台的:

以上条件都不满足,那么应用就被系统认为是后台应用。

前台应用可以自由地运行前台和后台服务。当应用进入后台之后,它仍然有几分钟的时间窗口来启动和运行服务。当这个时间窗口到期时,应用就进入空闲状态,系统将停止应用的后台服务运行,这个操作和服务的 Service.stopSelf() 方法被调用类似。

某些情况下,后台应用会被临时加入到白名单中运行几分钟。应用在白名单中时,它可以启动服务而不受限制,并且后台服务也被运行。当需要处理对用户可见的任务时,应用将被添加到白名单中,比如:

大多数时候,你的应用都可以用 JobScheduler 替换掉后台服务。比如,CoolPhotoApp需要检查用户是否接收到好友分享的图片,即使应用不在前台运行。按照之前的做法,应用需要使用后台服务去执行这个任务。升级到Android O后,开发者需要用按一定周期运行的Job替换掉后台服务来执行,查询服务器,完成后退出。

在Android O之前,创建一个前台服务的通常做法是先创建一个后台服务,然后将其提升到前台 。但这个做法到了Android O已经失效了。Android O提供了另外一个方法[ NotificationManager.startServiceInForeground() ]( (android.content.Intent , int, android.app.Notification)),来创建前台服务。用这个方法创建的新服务永远不会进入后台,所以不会受到后台服务的运行限制。

如果应用注册了广播,那么只要有广播发送,应用的广播接收器就会自动运行,占用系统资源。当很多应用都注册了某个系统事件广播时,那么就会出现性能问题,因为当系统事件触发广播时所有的应用的接收器在很短的时间内都会被顺序运行,这样就会影响用户体验。为了解决这个问题,Android 7.0增加了对广播的限制。Android O进一步加强了这个限制。

大多数情况下,应用之前注册的隐式广播可以用功能类似的 JobScheduler 的job替代。比如,一个社交图片类- -应用经常会在设备充电时,清除使用过程中产生的数据。该应用会在Manifest注册ACTION_POWER_CONNECTED广播,当接收到这个广播是,执行清理的工作。升级到Android O时,应用需要删除注册的这个广播,然后使用一个清理的job,这个job会在设备空闲并且充电时自动触发执行。

有一部分隐式广播是不受这个限制的,应用可以继续在Manifest中注册使用,不管应用的targetSdkVersion是多少。这部分不受限制的广播,可以查看 Implicit Broadcast Exceptions 。

上面介绍的这些变化不会影响到targetSdkVersion是25或者以下的应用 。但是如果应用是targetSdkVersion是Android O对应的API级别,需要修改应用以遵守这些新的限制。

如果应用在空闲状态仍然在运行后台服务,那么你需要替换掉这些后台服务。可以采用如下的方案:

检查在Manifest注册的广播,替换掉隐式广播:

Android 服务的限制

Google官网将Android服务分为了三种,前台服务,后台服务和绑定服务:

前台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示 通知 。即使用户停止与应用的交互,前台服务仍会继续运行。

后台服务执行用户不会直接注意到的操作。例如,如果应用使用某个服务来压缩其存储空间,则此服务通常是后台服务。

当应用组件通过调用 bindService() 绑定到服务时,服务即处于 绑定 状态。绑定服务会提供客户端-服务器接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

我个人理解服务可以分为两种, 前台 和 后台 ,而 绑定 应该是被当作一种状态,因为 前台服务 和 后台服务 都可以进行绑定。

基于这个理解,我们将限制分成了前台和后台两个部分:

从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 bindService() ,则系统会抛出异常。为确保应用的安全性,在启动 Service 时,请始终使用显式 Intent,且不要为服务声明 Intent 过滤器。

在后台中运行的 Service 会消耗设备资源,这可能会降低用户体验。 为了缓解这一问题,系统对这些 Service 施加了一些限制。

处于前台时,应用可以自由创建和运行前台与后台 Service。

Android 8.0 开始:系统不允许后台应用创建后台 Service。否则该函数将引发一个 IllegalStateException。

Android 8.0 开始:进入后台时,在一个持续数分钟的时间窗内,应用仍可以创建和使用 Service。 在该时间窗结束后,应用将被视为处于 空闲 状态。 此时,系统将停止应用的后台 Service,就像应用已经调用 Service 的 Service.stopSelf() 方法一样。

为了解除这种限制,可以使用 JobScheduler 作业替换后台 Service。

在 Android 8.0 之前,创建前台 Service 的方式通常是先创建一个后台 Service,然后将该 Service 推到前台。

而在Android 8.0 之后,系统不允许后台应用创建后台 Service。

解决方案:调用 startForegroundService() ,以在前台启动新 Service。

在系统创建 Service 后,应用有五秒的时间来调用该 Service 的 startForeground() 方法以显示新 Service 的用户可见通知。 如果应用在此时间限制内 未 调用 startForeground() ,则系统将停止此 Service 并声明此应用为 ANR 。

前台服务必须显示优先级为 PRIORITY_LOW 或更高的 状态栏通知 ,这有助于确保用户知道应用正在执行的任务。如果某操作不是特别重要,因而您希望使用最低优先级通知,则可能不适合使用服务;相反,您可以考虑使用 计划作业 。

在 Android 9 (API 28)之后,使用前台服务必须申请 FOREGROUND_SERVICE 权限,否则会报 SecurityException 。 这是普通权限,因此,系统会自动为请求权限的应用授予此权限。

每个运行服务的应用都会给系统带来额外负担,从而消耗系统资源。如果应用尝试使用低优先级通知隐藏其服务,则可能会降低用户正在主动交互的应用的性能。因此,如果某个应用尝试运行拥有最低优先级通知的服务,则系统会在抽屉式通知栏的底部调用出该应用的行为。

以 Android 12 为目标平台的应用在后台运行时无法再启动 前台服务 。

在 Android 11 及以后,系统对前台服务何时可以访问设备的位置、摄像头或麦克风进行了限制。

如果您的应用以 Android 11 或更高版本为目标平台,且在前台服务中访问摄像头或麦克风,则必须添加 前台服务类型 camera 和 microphone 。

如果你的应用 在后台运行时启动了某项前台服务 :

如果某服务的功能(位置、麦克风 和 相机)受到了限制,则Logcat中会打印如下语句:

android 怎样启动后台服务

后台服务就是后台运行的意思,只要单击任务栏上代表这程序的按钮,原来后台运行的程序就会到前台来,前台运行的程序就会到后台去了。如下图所示。

Windows 7可以打开几个窗口,每个任务分配一个窗口,各个窗口可以重叠、排开、放大、缩小、移动等,可以方便地在各打开的窗口间切换,各个打开的应用程序共享电脑资源,多任务环境对用户是透明的,每个任务都可以按前台、后台和独占三种方式进行。

多任务并存时,打开一个窗口后,在任务栏的空白处单击鼠标右键,然后在弹出的快捷菜单中可以选择层叠、横向平铺或纵向平铺等。

当Windows 7打开了几个窗口时,实际上只有一个是你可以对它进行操作的窗口,叫做当前活动窗口。在所有打开窗口的最前面,标题栏底色为深色的窗口为当前活动窗口。单击任务栏上的按钮,或按下换档键加制表键,即可以把这个窗口切换为当前活动窗口。

任何已经打开,不在前台运行的窗口,在后台仍然是活动的,占用内存和中央处理器等系统资源,所以,从这个意义上来说,长时间不用的窗口要及时关闭,方法是单击应用程序窗口标题栏右上角的关闭按钮。

;一个应用程序,无论是否最小化,在任务栏上都会以按钮的形式显示出来,当前活动窗口的应用程序的按钮呈凹陷形状,其余呈隆起形状。因此,判断一个窗口是否关闭,只要看其是否还在任务栏中即可。


分享文章:android后台服务的简单介绍
当前地址:http://cdweb.net/article/dsdcpjg.html