你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> 如何退出App之前喚醒另一個App?

如何退出App之前喚醒另一個App?

編輯:關於IOS

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))。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved