怎样退出App之前唤醒还有一个App?

怎样退出App之前唤醒还有一个App?

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

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

我要捐赠: 点击捐赠

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


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

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


可是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源代码下载:点我传送