学习 About iOS App Programming 第二天
------App States and Multitasking
对于app开发者,一定要很明确的知道app是运行状态,如在前台还是在后台。因为苹果系统不想安卓系统那用大方,苹果系统的系统资源是有很多约束的,app在前台和在后台享受的待遇是很大不同。当app在后台时,app会遭到系统一些限制,这样为了改善电池的寿命和提高其他在前台app的用户体验。同时苹果会及时进行通知当在进行前后台的转化时。
当我们的app在前台运行时,系统会实时的为app捕抓触碰事件。UIKit的基础框架作了很多工作为传递事件。同时可以定制自己想要的响应事件方法。如文本框输入文字的捕抓。
为了开发一个比较优秀的app,在技术上要对下面进行一定的了解
Managing App State Changes ------ 根据app的状态做出准确的响应,这样有利提高用户体验和防止数据丢失。
Being a Responsible Background App ------ 当app退到后台以后,一定了解app能干神马和将会发生啥。
Processing Queued Notifications at Wakeup Time
Background Execution and Multitasking ------- 了解怎样在后台很能工作。
Managing App State Changes
开发出来的app,无论在神马时候,肯定是3-1表中的一种。app从一种到另一种状态一定有相应的事件对应。
State | Description |
---|---|
Not running | app 还没有运行或者起来,处于结束状态。 |
Inactive | app处于前台但是当时不能接受事件,这个状态一般发生在状态之间的转换。 |
Active | app处于前台同时能接受事件 |
Background | app在后台和执行代码,大部分的app在这中状态就是简单暂停,但是还是有一些app在这个状态还是能执行一些任务的。 |
Suspended | app退到后台同时不能执行任务了。当app转到这种状态是app就是自动和不能前台了。大部分时候是保存在内存中。但是当内存吃紧时,app也时候后不犹豫的被枪毙。 |
温馨提示:在早期的ios版本是不能进入后台和暂停状态的。同时一些设备不支持多任务和后台执行任务。这些是从ios4开始的。
The App Launch Cycle
当app起来的时候,app从没有运行的状态变化到激化状态和后台状态,之间都用短暂通过inactive state。作为启动周期的一部分,系统创建了一个流程和主线程对于app调用app的主要方法。这些主要方法都来至于xcode项目的control。如app基本配置。
Responding to Interruptions
1 当一个报警级别的中断发生了,比如一个电话打进来了。app临时转变成inactive state,这样促使用去去选择接下来这样处理进程。这个app一直停留在未激活的状态,直到放弃这个报警级别的事情。在这个时候既可以转到激活状态或者后台。
2 在ios5中,通知是展示一个"条幅",同时app不会进入到未激活状态,这样只是提醒用户来了新的信息。同时用户可以通过这个消息进入其他app,让当前的app处于后台或者未激活状态。
3 当按了Sleep/Wake button,app将退到非激活状态,当用户按了这个按钮以后,系统将不能接受触摸事件了,同时app会进入后台。
Moving to the Background
当用户触发了进入后台的事件,如启动其他app,home按钮等等,app将会先调applicationWillResignActive:这个代理方法,然后调用applicationDidEnterBackground:代理方法。所以当app在进入后台之前需要做一些事情的时候,在这个两个代理方法实现就行了。
What to Do When Moving to the Background
app用applicationDidEnterBackground:这个代理方法能实现做进入后台的准备工作。如
保存用户数据和app状态信息
释放内存
Memory Usage for Background Apps
开发者在设计app时一定要知道当app进入后台以后释放内存。虽然系统会尽量会保存一些app在内存中。但是当内存警告的时候还是会强行要app释放。
在开发的过程中,我们一定要记住之时的移除强引用对象,这样方便内存空间的再次利用。同时当我们为了提高用户体验,把一些对象放到内存中去执行,当我们的app进入后台时一定要记得把这样的对象从内存中移除。
比如:照片,语音数据。
系统为了帮助app减少app所用内存,系统会自动的清理一些数据,在进入后台前。
Returning to the Foreground
pplicationDidBecomeActive,这个两个代理方法结束以后,app就是到前台了
Processing Queued Notifications at Wakeup Time
app进入暂停的状态是必须去准备一个操作任何消息的队列当它重返前台或者后台执行状态。虽然app在暂停状态不能执行任何代码,但是为了确保不丢失方向的改变信息。系统的队列把这些改变信息进行记录。当app再次可以执行代码时,把这些信息传给app。
消息队列将用主线程给app发送消息,同时它将在任何触摸事件和用户输入之前。大多数app应该能响应这些事件。
The Main Run Loop
app主run loop是用来连续响应所有用户相关的事件,UIApplication对象在起来的时间就是生成了一个run loop,它在app的主线程中。这样保证了的用户相关的事件能得到连续的响应。
Background Execution and Multitasking
ios4以后,多任务可以在后台运行app,但是为了保护电池,很多app在进入后台以后就会暂停服务。
尽可能不要让app在后台运行,如果app必须要在后台运行时。如:
需要完成至少一个认为对特定的用户。
需要执行一个简单定长的任务。
需要通知用户一些警告级别的信息。
系统会尽可能的多保留app在内存中,但是内存吃紧的时候,系统会杀掉他们。留出足够的内存给前台的app,这样必须前台app能得到较好的用户体验。
Implementing Long-Running Background Tasks
对一些特殊的app需要很长的时间在后台执行,因为开发者需要获得一些特定的权限,让app可以在后台长时间,一下一些情况可以申请:
播放音频内容的app,想音乐播放器。
语音记录app。
VoIP app
需要后台下载的任务
Concurrency and Secondary Threads
系统一个app主线程,同时app自己可以创立其他线程去做其他任务。苹果比较推荐用gcd和operation queue,创立自己的线程的好处是让主线程去处理事件相应。
开发者应该使用队列无论什么时候需要从主线程中脱离出来执行任务。让主线程处理事件和画图事件。开发者不必一定执行在主线程上。比如app在等待网络回调时,这样就可以放在queue执行。
多线程的另一个好处是可以将任务移植到非主线程中,这样app在起来的时候,主线程去进行初始化和开始相应事件,不会影响用户体验。
转载于:https://blog.51cto.com/5332275/1427461