Service详解及应用(一)-- 进程详解篇

使用手机的时候,你明明已经把这个APP关掉了,怎么过一会儿它自己又启动了,什么歌情况。特别是某些全家桶,经常是这种情况,你压根杀不掉。还有之前网上有报道某些APP会监听用户打电话,偷偷录音并上传,这些是怎么做到的。使用某些下载软件的时候,软件已经关闭,但是下载却没停止。
对于以上行为,我表示非常不赞同,所以这篇文章会告诉你上面的是怎么做到的,O(∩_∩)O哈哈~

进程优先级

不是说讲解Service么?怎么讲这个了?别急,慢慢来。开篇说了某些应用会自启动,无法杀死,而有的应用退到后台,某一段时间再次打开时,它重启了。说明这是被系统杀死的。要知道,在Android中,一般情况下一个APP的所有组件(四大组件)都是是运行在一个进程中的,所以系统杀死的就是这个进程,进程被干掉了,APP也就没了。系统杀死进程的原因是因为系统的内存资源比较紧张,系统需要为一些急需内存资源的组件去提供足够的内存资源,所以系统就把一些进程杀死了。

这里说的一般情况下一个APP的所有组件都是是运行在一个进程中的言外之意指的是,你可以指定某些组件运行在指定的进程中的。可以在清单文件中进行android:process 设置指定的进程名称。
当然也可以给整个组件设置统一的进程,这个也是在清单文件中配置。在<application>这个节点设置android:process属性就可以了。

那么,什么情况下要去杀死进程呢?依靠什么来杀死某些进程,这就涉及到进程的优先级。Android系统在内存不够充足的情况下杀死进程优先级较低的进程。Android中将进程的优先级分为5个层级(相当于5中类型的进程),主要依据对于用户的需求程度来判断的。

优先级分类(从上到下进程优先级越来越低)

英文文档在“sdk/docs/guide/components/processes-and-threads.html”

  • 前台进程
  • 可见进程
  • 服务进程
  • 后台进程
  • 空进程
    下面一个一个来讲:

    前台进程

前台进程有很多种情况,如果一个进程属于下面的任意一种情景,都属于前台进程。

  • 情景一:该进程中有Activity的onResume被调用,此时用户正与这个Activity交互。
  • 情景二:该进程中有一个Service,该Service绑定到当前正在与用户交互的Activity。
  • 情景三:该进程中的通过startForegrount()启动的Service。
  • 情景四:该进程中的Service正在执行onCreate()、onStart()、onDestory()。
  • 情景五:该进程中有正在执行onReceiver()的BroadcastReceiver。

分析前台进程

  • 情景一:对于这种情况没什么好说的,用户正在与当前的Activity进行交互呢,不到万不得已,不能杀死。
  • 情景二:现在先不讲,下面讲解过service后再来补充
  • 情景三:对于startForegrount()启动的服务是十分重要的,这种启动的服务,就下面这种的:
startForegrount()启动的服务

后面我会告诉大家这种需求是如何实现的,慢慢来,不急。
很明显,对于这种前台进程,我们几乎不会见到被消失(被杀死),他是一只常驻内存的,一直都是运行在前台的服务。

  • 情景四:一样,现在先不讲,下面讲解过service后再来补充
  • 情景五:假设你已经学过了BroadcastReceiver,就知道他的方法onReceiver(),当收到广播时,系统就要进行相应的onReceiver中的操作。我好不容易收到一条广播,现在就要处理广播中的事情,你却要把我干掉,我不服。所以对于这种情景的进程是十分重要的,是会影响用户的直观体验的,这个必须提升为前台进程。

总结:以上几种情景的前台进程只有在内存严重不足的情况下不到万不得已才会被系统杀死,杀死的目的是为了及时响应系统级别的需求,使得用户界面不会出问题。

可见进程

可见进程指**没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。 **

百度百科说:

可见(来自百度百科)

意思指:君子以成熟的德行为表率,时间久了就能看到他的这种行为。
无论是古文还是现代文,“可见”,有点朦胧的感觉,就像你跟她之间隔了一个玻璃一样。虽然就在你眼前,可我却触碰不到你,(o)/~。
这里的可见进程有两种,但都是透露了一种朦胧感觉情况下的进程

  • 情景一:该进程的service绑定到了可见或者在前台的Activity。
  • 情景二:当前进程中有Activity,但是不在不在前台,却可以看见。

分析

  • 情景一:(后面讲解service时再讲)
  • 情景二:靠,情景二什么情况?下面我就演示下:

两个APP两个进程,分别对应A、B。打开A后再打开BAPP,特殊之处在与B APP的Activity是透明的。

APP B的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.asia.app_b">    
<application        
android:allowBackup="true"       
 android:icon="@mipmap/ic_launcher"     
  android:label="@string/app_name"     
   android:supportsRtl="true"  
      android:theme="@android:style/Theme.Translucent">   //设置APP B的Activity为透明的
     <activity android:name=".MainActivity" > 
           <intent-filter>              
  <action android:name="android.intent.action.MAIN" />             
   <category android:name="android.intent.category.LAUNCHER" />         
   </intent-filter>       
 </activity>  
  </application>
</manifest>

APP A中添加打开APP B的方法

APP A的MainActivity文件如下,主要添加了显示变化的时间的功能。

MainActivity.class
onResume下的可见进程

打开APP B 后,此时APP B是前台进程,前台组件是APP B的所有组件。APP A 进入了Pause状态,可见但是没有获取焦点。此时APP A是可见进程,APP A没有任何前台组件、但仍会影响用户在屏幕上所见内容的。对于用户来说,依然想看到APP A上的时间变化,对用户来说APP A的进程重要性仅次于APP B,也就是仅次于前台进程。
可见进程也是十分重要的进程,除非维持所有前台进程运行时有危险时,系统才会干掉可见进程。

总结可见进程:没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。

服务进程

这个就是这篇文章的高潮,讲解Service的内容。该进程中有通过startService启动的服务,同时该服务的情况不属于前台进程以及可见进程。 服务进程的重要性仅次于前台进程和可见进程。这句话看起来是废话,其实不然,因为他后面还有两个进程。对于服务进程而言,虽然他不会直接对用户所关心的界面造成影响,但是有的时候做文件下载或者后台播放音乐,是需要在这个进程中进行的。
可能有人问,下载文件我直接在Activity中开启子线程不就可以了么?为什么需要在服务中进行下载呢?
我们先在Activity中开启一个主线程进行模拟下载。

模拟下载代码
开始下载->销毁Activity->清空进程

开始下载的时候一切正常,然后按下返回键,activity被销毁,此时APP A在空进程(进程的一种)中,下载继续。模拟内存不够充足,我清空了后台运行的APP A,此时下载停止了。很明显的,下载文件不能因为我清空了后台运行的APP就将下载停止了。谷歌提供的解决方案就是在服务进程中进行下载操作。这种进程不会被轻易杀死。

注意:
开启一个服务,并不会直接开启一个新的进程(除非你指定了新的进程),也不会开启一个新的子线程。服务也是运行在主线程中的,所以如果需要在服务中进行耗时操作,需要在服务中开启一个子线程去下载文件。

杀死服务进程的可能性也较低,除非内存不足以支撑前台进程、可见进程的运行。

总结服务进程: 该进程中有通过startService启动的服务,同时该服务的情况不属于前台进程以及可见进程。

后台进程

该进程包含对用户不可见的Activity进程(该Activity的onStop方法被调用)

分析后台进程

这种进程不知道什么时候就会被系统干掉了,因为这下进程不会直接影响用户的直观体验,回收的目的为了供前台进程、可见进程、服务进程使用。
在手机中会有很多这种进程,他们都被缓存在一个列表中。这个列表就是LRU列表。然后根据LRU(Least Recently Used 近期最少使用算法),将很久以前使用的进程第一个杀掉,最后杀掉刚刚进入后台的进程,保证刚刚最近被使用的进程快速还原。
当你把APP退到后台,过一段时间再打开式,只要从引导页进入,说明这个进程处于后台进程的时候被干了。。。

空进程

没有处于活动状态的任何组件所在的进程

分析空进程

刚才在服务进程中讲的在Activity中开启子线程下载文件,退出APP后,该进程就变成了空进程。之所以保留这种进程,是为了下载快速启动该进程。这种进程经常被干掉。

此篇最后

Android中的五种进程,前台进程、可见进程、服务进程、后台进程、空进程。基本讲完了,其中涉及到Service的在下篇文章中会引入。

有什么问题,不吝赐教O(∩_∩)O哈哈~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,144评论 25 707
  • 上篇我们讲解了Android中的5中等级的进程,分别是:前台进程、可见进程、服务进程、后台进程、空进程。系统会按照...
    徐爱卿阅读 3,857评论 6 33
  • 什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单...
    晨起清风阅读 1,784评论 0 5
  • 引言 根据《算法》第4版。编写红黑树。 理论 参见: 浅谈算法和数据结构: 八 平衡查找树之2-3树 浅谈算法和数...
    林湾村龙猫阅读 1,729评论 0 1
  • 一直以来,我们都会寻找自己内心的需求。可是自己心里想的总是与自己的行动会相差很远。喝过很多的鸡汤,却不一定会做鸡汤...
    鹿鹿无畏阅读 756评论 2 51