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

來源:互聯網
上載者:User

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

郝萌主傾心貢獻,尊重作者的勞動成果,請勿轉載。

如果文章對您有所協助,歡迎給作者捐贈,支援郝萌主,捐贈數額隨意,重在心意^_^ 

我要捐贈: 點擊捐贈

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源碼下載:點我傳送

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.