码迷,mamicode.com
首页 > 移动开发 > 详细

如何退出App之前唤醒另一个App?

时间:2015-06-23 21:37:10      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:app   safari   openurl   ios8编程   appstore   

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。

如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 

我要捐赠: 点击捐赠

Cocos2d-X源码下载:点我传送


SDK并没有提供终止应用程序的方法。

要想终止应用程序,苹果推荐的唯一的方式是按下Home按钮。


但是Foundation框架中集成了Darwin框架,从而我们可以使用C函数exit(0)来终止Application。

 

UIApplication的openUrl方法则是退出应用程序的另一种方法。

当你在代码中调用OpenURL方法时,你的App进程会被终止(挂起),另一个App则被唤醒。

 

当然两种退出App的机制和最终效果并不相同。

当你使用exit(0)退出程序时,你的App并不仅仅是退出前台,程序所占用的内存也被清除了——这是不可恢复的。

如果再次Launch这个App,iOS将重新从磁盘中读取二进制——这是一份全新的App映像。

 

openURL则不同,它仅仅是把你的程序挂起,这是可恢复的。

你的App仅仅是从前台退出,但后台中仍然存在着。

用户可以在某个时候“唤醒”它,于是你的App又回来了,此时应用程序的状态仍然唤醒之前的状态。

当然,万一你运气不好,iOS也会将你的App彻底从内存中回收,

一如exit(0)所做的一样,这一般是系统内存紧张的时候。

 

这两种方法在某些时候可能需要并存。

例如,我们想在App退出之前,唤醒另一个App,比如Safari。

同时我们希望自己的App是真正的“退出”,回收App的所有内存。


这是一个“悖论”。因为无论exit(0)还是openURL,一旦执行之后,操作系统就会终止进程的执行。

只要执行二者中的任何一句语句,另外一个语句就无法执行——因为进程已经终止了。

 

但在某种情况下,通过对iOS多任务机制的巧妙利用,这个悖论却是真实成立的。

例如,我们可以利用如下O-C代码来实现这个目的:

 

[self performSelector:@selector(exitApp)withObject:nil afterDelay:0.5];

[[UIApplication sharedApplication]openURL:

[NSURLURLWithString:@"appScheme://"]];

 

exitApp方法实际上就是一句代码exit(0)。

这样二者就实现并存了。


首先,我们让exit(0)延迟0.5秒再执行,而在此之前openURL当然早就执行完了。

performSelector:afterDelay方法将会调度一个任务在某个时间后执行。

当然,这个时间不能太长,】。

因为iOS允许app在进入后台之后仍然有一段“存活”时间,但是这个时间不能太长,

这样即算后面的openURL方法执行后,App仍然处于存活状态,也就有机会去执行所调度任务(即exit(0))。


郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。

如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 

我要捐赠: 点击捐赠

Cocos2d-X源码下载:点我传送

如何退出App之前唤醒另一个App?

标签:app   safari   openurl   ios8编程   appstore   

原文地址:http://blog.csdn.net/haomengzhu/article/details/46610209

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!