Android后台多任务运行机制揭秘----发个技术贴
android吧
全部回复
仅看楼主
level 11

先给他们解释几个可能会用到的几个术语的意思

函数
: java
语言里又称为方法
,
都是差不多的意思
,
简单来说就是由一段代码组成的一个语句块
,
因为程序里代码都是一行一行由上往下执行的
,
大家可以把每行代码看做是一个或多个命令
,
把函数看做是一堆的命令

调用
:
举个例子吧
,
我的衣服脏了
,
但是我没有自己去洗
,
而是把衣服直接扔给我妈妈
,
让她去帮我洗
,
那这个过程在程序里就可以描述为
,
我调用了我妈妈的洗衣服函数

调用又分显式调用和隐式调用
,
大家就暂且理解为主动调用和被动调用吧

回调
:
当程序处于某一种状态或因某种原因触发相应的事件后
,
程序会自动调用某个函数
,
这个过程称为回调

封装
:
将一系列写好的代码包装起来
,
方便下次直接调用
,
这也是
oop(
面向对象编程
)
非常重要的一个特性

2012年10月16日 09点10分 1
level 11


组件
:
官方或第三方封装好的一系列的工具
,
简单来说就是别人已经为我们写好了很多的函数
,
我们要用就直接调用就可以了
,
不用我们自己去写
,
这也是高级语言的特性
,
几乎你能想到的东西都能通过调用相应的组件去实现

面向对象和面向过程
:
面向对象是现在非常流行并且使用最为广泛的一种程序设计方式
,android
使用的是
java,iOS
使用的是
objective-c,windows phone
使用的是
c sharp(
又叫
C#),
这些操作系统都使用的是面向对象编程语言作为框架和应用程序的开发语言
,

C
语言是一种面向过程的语言
,cpp(
又叫
C++)
是一种半面向对象半面向过程的编程语言

还是用一个简单的例子解释他们两者的区别吧
,
比如我饿了
,
要吃饭

用面向对象可以描述为
:
我调用我妈的做饭函数
,
而我妈调用自己的买菜函数
,
卖菜的阿姨调用进货的函数
......
面向过程可以描述为
:
我往地上洒点种子
,
等到它成熟后我再去自己做一口锅
,
再自己去找点柴
,
自己去造一些调料
......

2012年10月16日 09点10分 2
level 11


方法重写
:
面向对象非常重要的一个概念
,
前面已经说过了面向对象的一些特性
,
我们可以直接使用别人已经写好的工具
,
但是别人写好的不一定就是我们自己想要的
,
怎么办呢
? java
语言可以对父类的某个函数进行重写
,
通过
super()
调用父类的函数
,
接着我们就可以写自己的代码了
!

===============
好了步入正题
,android
的多任务机制
=================

很多人都认为
android
的应用程序切换到后台后都是像电脑一样继续保持运行的
,

iOS
是暂停的
,
所以称
android
是真后台
,iOS
是伪后台

我一开始也以为是这样
,
因为我们学校没有
android
开发的课程
,
所以我只能自学
,
好在我们有
java
的课程
,
因为
android
开发使用的是
java

xml,
所以我只需要把
api
多看看就行了
,
最近加了一个
android
开发的群
,
无意间聊到了
android
的后台
,
才知道原来
android
的多任务运行机制实质上和
iOS
是差不多的
(
亏我还把
Activity
的源码和
api
看的差不多了
....)

2012年10月16日 09点10分 3
level 11


我们先来分析一下
iOS
的多任务吧
,
需要注意的是
,iOS

4.0
之前是没有多任务这个概念的
,
用过
iphone

3
代的应用都知道
,

4
开始
,iOS
多了个多任务
,
但是这个多任务形同虚设
,
除了系统自带的程序
,
其他第三方程序只能在里面显示最近使用记录
,
直到
5.0
之后
,
苹果才开放了第三方程序的部分后台运行权限
(
如下载
,
推送等
,
这就是
iOS
版的
pps
能后台下载的原因
),
并且程序进入后台后并没有退出
,
而是保留状态
,
当然我这里说的都是没越狱的
,
还有一点
,iOS
的后台正常情况下只会保留
10
分钟
,
如果内存不够
,
系统会自动释放内存
(
因为精力有限
,
我就不给大家看
iOS
开发的
api
和说明了
,
今天主要讲的是
android
多任务
)

2012年10月16日 09点10分 4
level 11


Method Description Killable? Next
onCreate() Called when the activity is first created. This is where you should do all of your normal static set up: create views, bind data to lists, etc. This method also provides you with a Bundle containing the activity's previously frozen state, if there was one.
Always followed by onStart().
No onStart()
onRestart() Called after your activity has been stopped, prior to it being started again.
Always followed by onStart()
No onStart()
onStart() Called when the activity is becoming visible to the user.
Followed by onResume() if the activity comes to the foreground, or onStop() if it becomes hidden.
No onResume() or onStop()
onResume() Called when the activity will start interacting with the user. At this point your activity is at the top of the activity stack, with user input going to it.
Always followed by onPause().
No onPause()
onPause() Called when the system is about to start resuming a previous activity. This is typically used to commit unsaved changes to persistent data, stop animations and other things that may be consuming CPU, etc. Implementations of this method must be very quick because the next activity will not be resumed until this method returns.
Followed by either onResume() if the activity returns back to the front, or onStop() if it becomes invisible to the user.
Yes onResume() or
onStop()

2012年10月16日 09点10分 6
没错,一个一个来全懂,加起来就不认识了[呼~]
2013年01月09日 06点01分
level 11

6.
onStop():Activity
不可视时调用
7.
onDescorty():Activity
被销毁的时候调用。
可能有人会不理解什么叫用户可见什么叫可以与用户交互
,
这么说吧
,
当程序突然弹出一个对话框时
,
当前的
Activity
是可见的
,
但是我们不能与它进行交互
,
这个时候
Activity
就处于可见但不可交互状态

当我们写程序时
,
我们只需要新建一个类去继承谷歌为我们提供的
Activity
类即可获得谷歌为我们写好的所有功能
,
我们要做的仅仅是调用函数
,
逻辑运算
,
以及一些函数的重写

通过
Activity
的声明周期我们看到
,
程序的
Activity
只要不可见了
,
它就会隐式的调用相应的回调函数使程序处于停止运行状态
,
此时程序在内存中只保存状态
,
而没有运行
,
所以是不耗
cpu
资源的
,
当我们重新进入该
Activity

,
此时的
Activity
重新变为可见可交互状态
,
会依次调用相应的回调函数
,二楼发
Activity
声明周期的示意图

2012年10月16日 09点10分 9
level 11


现在肯定会有人要问了
,

android
如何实现后台下载
,
听音乐呢
?
别急
,
咱们能想到的东西
,
人家谷歌
,
苹果的架构师早想到了
,android

iOS
一样
,
对于特殊的任务都有特殊的照顾

因为手机不同于电脑
,
真正需要在后台运行的东西也无非就是下载
,
听歌
,
接收
QQ
消息之类的了
,
当然还有不能暂停的网络游戏

对于以上的这些任务,应用程序需要有一种方式告诉系统我想要显式的运行
,
对这类应用有两种可以处理的方式,它们也代表着两种可以在应用的
manifest
中声明的组件:
Servicebroadcast

receiver

前面也说过了
,
谷歌为我们封装了很多的组件
,
我们只需要在需要的时候显式的进行调用即可

在面向对象中
,

class(

)
去描述一个实体
,
一个
class
具有多个属性和函数
,
属性用来描述实体的特征
,
函数用来描述该实体具体的行为

2012年10月16日 09点10分 10
level 11


Service
类为我们提供了非常多的属性和函数
,
我们不需要关心这些东西是怎么实现的
,
我们只需要看官方
API
对这些属性和函数的介绍即可知道怎么去用
,
该在什么时候去使用它们

它为我们提供了一种富客户机
-
服务器

模式
,
而它的使用方式是可选的
,
在启动了一个应用的服务后
,
紧接着
android
简单实例化了在应用进程中的组件为其提供
context,
在这之后服务被怎样使用是由应用程序来决定的:它可以把所需的所有代码放到服务自身中而不与应用程序中的其它部分进行交互
,
调用与应用程序的其它部分共享的单例对象
,
如果需要从其他部分直接得到服务的实例
,
或是根据需要把服务放到另一个进程中用作完全的
RPC
调用

BroadcastReceiver
可以让应用程序在一段限定的时间里,作为其它事件发生的结果而在后台运行。它可以被应用在构建高级特性的很多方面:例如
AlarmManager
让应用程序在未来的某个确定时间里发出一个广播
,
应用程序设定了固定的时间(现在是
10
秒)来完成对一个广播的处理。如果它在这段时间没有执行完成,那么这个应用程序就会被认为行为异常,它的进程会被马上被置为后台运行状态,在系统需要时回收内存而被终结。
BroadcastReceiver
非常适合于响应外部的行为来做少量的工作
,
如在收到一个新的
GPS
位置消息后给用户发布一个通告
,
由于应用的进程在主动接受广播时仅仅需要在场,它们具有非常轻量级的特征
,
又因为它们只能在确定性的时间里活动
,
所以在运行时就可以有很好的保证让它们的进程不被终止

那么是不是所有程序都可以使用
Servicebroadcast

receiver
实现真正的后台运行呢
,
答案是
:
需要权限

也就是说
,
谷歌为某些特定的函数开放了使用这些组件的权限
,
从而制止一些不必要的程序在后台运行消耗系统的资源

2012年10月16日 09点10分 11
level 1
lZ用心了~
2013年01月09日 06点01分 12
level 12
lZ用心了~
-----来自NASA,基于power架构处理器,运行在大哥大上的Unix虚拟机。
2013年01月09日 06点01分 13
level 15
下意识的看了看ID[开心]
2013年01月09日 06点01分 14
level 9
啊,那么复杂
2013年01月09日 06点01分 15
level 11
三个月前的帖子了,谁挖的
2013年01月09日 06点01分 16
level 9
那里复制粘贴来的[滑稽]
2013年01月09日 06点01分 17
你见我什么时候复制过别人的东西
2013年01月09日 06点01分
那段英文是复制的android api里的注释,文中已说明
2013年01月09日 06点01分
level 12
意思看了下二楼回复时间……
2013年01月09日 06点01分 18
level 11
12楼挖坟司马
2013年01月09日 06点01分 19
level 11
我想知道cpu是用什么来判定程序所需的频率压力的[疑问]
2013年01月09日 06点01分 20
线程和时间片
2013年01月09日 06点01分
level 11
都泡烂了又浮上来了
2013年01月09日 07点01分 21
level 12
我就想知道2.3和4.0以上的后台管理是不是有变化。。。感觉给力了又好像差了
2013年01月09日 07点01分 22
不管怎么升级,底层的东西及系统核心库是不可能动的,所以一般升级版本增加大于改动,当然我指的改动不是改个图片换个动画之类的美工干的活
2013年01月09日 07点01分
回复 老坛咸菜面 :哟西。。。原来如此,受教了![真棒][真棒][真棒]
2013年01月09日 07点01分
level 14
面向对象里都叫方法

lz
对OOP封装的解释看着蛋疼。。
2013年01月09日 07点01分 23
c语言叫惯了函数,至于oop的解释,你觉得在这里讲继承多态有几个看的懂
2013年01月09日 07点01分
1 2 3 尾页