在apk-a按返回鍵退出到桌面好實(shí)現(xiàn),重寫按鍵事件就行;但你要求任何程序按返回鍵都打開apk-a,這是不可行的,首先要做到這一點(diǎn)只有修改系統(tǒng)默認(rèn)的返回鍵功能,本身就會(huì)影響機(jī)器使用,它就不是返回鍵了
元氏網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,元氏網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為元氏上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的元氏做網(wǎng)站的公司定做!
1.
將主頁面activity設(shè)置為singleTask啟動(dòng)方法。
2.
直接在返回的時(shí)候跳轉(zhuǎn)到主頁面即可。
代碼如下:
//MainActivity為你的主頁面activity,activity為現(xiàn)在的頁面
Intent i = new Intent(activity.this,MainActivity.class)
startActivity(i);
原理:當(dāng)activity為singleTask的時(shí)候跳轉(zhuǎn)會(huì)清空當(dāng)前activity任務(wù)棧上面所有的activity。
1、androidhal層是硬件抽象層,安卓把硬件的接口放在了kernel層,把相應(yīng)的邏輯放在了HAL層,安卓的kernel層驅(qū)動(dòng),和HAL層的驅(qū)動(dòng)簡稱系統(tǒng)驅(qū)動(dòng)。
2、返回string的方法:通過函數(shù)的參數(shù)指定一個(gè)指針,然后在函數(shù)體內(nèi)對(duì)指針賦值。如:chartemp[10],voidfunc(char*t){strcpy(t,"test")}func(temp)即可。
在flutter開發(fā)過程中,發(fā)現(xiàn)Android手機(jī)在App首頁點(diǎn)擊物理返回按鈕時(shí),App會(huì)退出并且再次點(diǎn)開App時(shí)會(huì)重新啟動(dòng),這代表了上次的退出直接殺死了App,和我們平常的退到手機(jī)桌面不同,所以開發(fā)了一個(gè)單獨(dú)插件來處理這種情況。
使用步驟如下:
1、pubspec.yaml文件中引入依賴
2、引用插件
3、使用插件來退出App到桌面,并且保持App后臺(tái)運(yùn)行
可根據(jù)實(shí)際情況在_onWillPop方法中處理相關(guān)邏輯,比如連續(xù)兩次點(diǎn)擊物理返回按鈕才退出到桌面等。
用戶通過系統(tǒng)返回按鈕導(dǎo)航回去的一組頁面,在開發(fā)中被稱為返回棧 (back stack)。多返回棧即一堆 "返回棧",對(duì)多返回棧的支持是在 Navigation 2.4.0-alpha01 和 Fragment 1.4.0-alpha01 中開始的。本文將為您展開多返回棧的技術(shù)詳解。
無論您在使用 Android 全新的 手勢(shì)導(dǎo)航 還是傳統(tǒng)的導(dǎo)航欄,用戶的 "返回" 操作是 Android 用戶體驗(yàn)中關(guān)鍵的一環(huán),把握好返回功能的設(shè)計(jì)可以使應(yīng)用更加貼近整個(gè)生態(tài)系統(tǒng)。
在最簡單的應(yīng)用場景中,系統(tǒng)返回按鈕僅僅 finish 您的 Activity。在過去您可能需要覆寫 Activity 的 onBackPressed() 方法來自定義返回操作,而在 2021 年您無需再這樣操作。我們已經(jīng)在 OnBackPressedDispatcher 中提供了 針對(duì)自定義返回導(dǎo)航的 API。實(shí)際上這與 FragmentManager 和 NavController 中 已經(jīng) 添加的 API 相同。
這意味著當(dāng)您使用 Fragments 或 Navigation 時(shí),它們會(huì)通過 OnBackPressedDispatcher 來確保您調(diào)用了它們返回棧的 API,系統(tǒng)的返回按鈕會(huì)將您推入返回棧的頁面逐層返回。
多返回棧不會(huì)改變這個(gè)基本邏輯。系統(tǒng)的返回按鈕仍然是一個(gè)單向指令 —— "返回"。這對(duì)多返回棧 API 的實(shí)現(xiàn)機(jī)制有深遠(yuǎn)影響。
在 surface 層級(jí),對(duì)于 多返回棧的支持 貌似很直接,但其實(shí)需要額外解釋一下 "Fragment 返回棧" 到底是什么。FragmentManager 的返回棧其實(shí)包含的不是 Fragment,而是由 Fragment 事務(wù)組成的。更準(zhǔn)確地說,是由那些調(diào)用了 addToBackStack(String name) API 的事務(wù)組成的。
這就意味著當(dāng)您調(diào)用 commit() 提交了一個(gè)調(diào)用過 addToBackStack() 方法的 Fragment 事務(wù)時(shí), FragmentManager 會(huì)執(zhí)行所有您在事務(wù)中所指定的操作 (比如 替換操作 ),從而將每個(gè) Fragment 轉(zhuǎn)換為預(yù)期的狀態(tài)。然后 FragmentManager 會(huì)將該事務(wù)作為它返回棧的一部分。
當(dāng)您調(diào)用 popBackStack() 方法時(shí) (無論是直接調(diào)用,還是通過系統(tǒng)返回鍵以 FragmentManager 內(nèi)部機(jī)制調(diào)用),F(xiàn)ragment 返回棧的最上層事務(wù)會(huì)從棧中彈出 -- 比如新添加的 Fragment 會(huì)被移除,隱藏的 Fragment 會(huì)顯示。這會(huì)使得 FragmentManager 恢復(fù)到最初提交 Fragment 事務(wù)之前的狀態(tài)。
也就是說 popBackStack() 變成了銷毀操作: 任何已添加的 Fragment 在事務(wù)被彈出的時(shí)候都會(huì)丟失它的狀態(tài)。換言之,您會(huì)失去視圖的狀態(tài),任何所保存的實(shí)例狀態(tài) (Saved Instance State),并且任何綁定到該 Fragment 的 ViewModel 實(shí)例都會(huì)被清除。這也是該 API 和新的 saveBackStack() 方法之間的主要區(qū)別。 saveBackStack() 可以實(shí)現(xiàn)彈出事務(wù)所實(shí)現(xiàn)的返回效果,此外它還可以確保視圖狀態(tài)、已保存的實(shí)例狀態(tài),以及 ViewModel 實(shí)例能夠在銷毀時(shí)被保存。這使得 restoreBackStack() API 后續(xù)可以通過已保存的狀態(tài)重建這些事務(wù)和它們的 Fragment,并且高效 "重現(xiàn)" 已保存的全部細(xì)節(jié)。太神奇了!
而實(shí)現(xiàn)這個(gè)目的必須要解決大量技術(shù)上的問題。
雖然 Fragment 總是會(huì)保存 Fragment 的視圖狀態(tài),但是 Fragment 的 onSaveInstanceState() 方法只有在 Activity 的 onSaveInstanceState() 被調(diào)用時(shí)才會(huì)被調(diào)用。為了能夠保證調(diào)用 saveBackStack() 時(shí) SavedInstanceState 會(huì)被保存,我們 還 需要在 Fragment 生命周期切換 的正確時(shí)機(jī)注入對(duì) onSaveInstanceState() 的調(diào)用。我們不能調(diào)用得太早 (您的 Fragment 不應(yīng)該在 STARTED 狀態(tài)下保存狀態(tài)),也不能調(diào)用得太晚 (您需要在 Fragment 被銷毀之前保存狀態(tài))。
這樣的前提條件就開啟了需要 解決 FragmentManager 轉(zhuǎn)換到對(duì)應(yīng)狀態(tài)的問題,以此來保障有一個(gè)地方能夠?qū)?Fragment 轉(zhuǎn)換為所需狀態(tài),并且處理可重入行為和 Fragment 內(nèi)部的狀態(tài)轉(zhuǎn)換。
在 Fragment 的重構(gòu)工作進(jìn)行了 6 個(gè)月,進(jìn)行了 35 次修改時(shí),發(fā)現(xiàn) Postponed Fragment 功能已經(jīng)嚴(yán)重?fù)p壞,這一問題使得被推遲的事務(wù)處于一個(gè)中間狀態(tài) —— 既沒有被提交也并不是未被提交。之后的 65 個(gè)修改和 5 個(gè)月的時(shí)間里,我們幾乎重寫了 FragmentManager 管理狀態(tài)、延遲狀態(tài)切換和動(dòng)畫的內(nèi)部代碼,具體請(qǐng)參見我們之前的文章《全新的 Fragment: 使用新的狀態(tài)管理器》。
隨著技術(shù)問題的逐步解決,包括更加可靠和更易理解的 FragmentManager ,我們新增加了兩個(gè) API: saveBackStack() 和 restoreBackStack() 。
如果您不使用這些新增 API,則一切照舊: 單個(gè) FragmentManager 返回棧和之前的功能相同。現(xiàn)有的 addToBackStack() 保持不變 —— 您可以將 name 賦值為 null 或者任意 name 。然而,當(dāng)您使用多返回棧時(shí), name 的作用就非常重要了: 在您調(diào)用 saveBackStack() 和之后的 restoreBackStack() 方法時(shí),它將作為 Fragment 事務(wù)的唯一的 key。
舉個(gè)例子,會(huì)更容易理解。比如您已經(jīng)添加了一個(gè)初始的 Fragment 到 Activity,然后提交了兩個(gè)事務(wù),每個(gè)事務(wù)中包含一個(gè)單獨(dú)的 replace 操作:
也就是說我們的 FragmentManager 會(huì)變成這樣:
比如說我們希望將 profile 頁換出返回棧,然后切換到通知 Fragment。這就需要調(diào)用 saveBackStack() 并且緊跟一個(gè)新的事務(wù):
現(xiàn)在我們添加 ProfileFragment 的事務(wù)和添加 EditProfileFragment 的事務(wù)都保存在 "profile" 關(guān)鍵字下。這些 Fragment 已經(jīng)完全將狀態(tài)保存,并且 FragmentManager 會(huì)隨同事務(wù)狀態(tài)一起保持它們的狀態(tài)。很重要的一點(diǎn): 這些 Fragment 的實(shí)例并不在內(nèi)存中或者在 FragmentManager 中 —— 存在的僅僅只有狀態(tài) (以及任何以 ViewModel 實(shí)例形式存在的非配置狀態(tài))。
替換回來非常簡單: 我們可以在 "notifications" 事務(wù)中同樣調(diào)用 saveBackStack() 操作,然后調(diào)用 restoreBackStack() :
這兩個(gè)堆棧項(xiàng)高效地交換了位置:
維持一個(gè)單獨(dú)且活躍的返回棧并且將事務(wù)在其中交換,這保證了當(dāng)返回按鈕被點(diǎn)擊時(shí), FragmentManager 和系統(tǒng)的其他部分可以保持一致的響應(yīng)。實(shí)際上,整個(gè)邏輯并未改變,同之前一樣,仍然彈出 Fragment 返回棧的最后一個(gè)事務(wù)。
這些 API 都特意按照最小化設(shè)計(jì),盡管它們會(huì)產(chǎn)生潛在的影響。這使得開發(fā)者可以基于這些接口設(shè)計(jì)自己的結(jié)構(gòu),而無需通過任何非常規(guī)的方式保存 Fragment 的視圖狀態(tài)、已保存的實(shí)例狀態(tài)、非配置的狀態(tài)。
當(dāng)然了,如果您不希望在這些 API 之上構(gòu)建您的框架,那么可以使用我們所提供的框架進(jìn)行開發(fā)。
Navigation Component 最初 是作為通用運(yùn)行時(shí)組件進(jìn)行開發(fā)的,其中不涉及 View、Fragment、Composable 或者其他屏幕顯示相關(guān)類型及您可能會(huì)在 Activity 中實(shí)現(xiàn)的 "目的地界面"。然而,NavHost 接口 的實(shí)現(xiàn)中需要考慮這些內(nèi)容,通過它添加一個(gè)或者多個(gè) Navigator 實(shí)例時(shí),這些實(shí)例 確實(shí) 清楚如何與特定類型的目的地進(jìn)行交互。
這也就意味著與 Fragment 的交互邏輯全部封裝在了 navigation-fragment 開發(fā)庫和它其中的 FragmentNavigator 與 DialogFragmentNavigator 中。類似的,與 Composable 的交互邏輯被封裝在完全獨(dú)立的 navigation-compose 開發(fā)庫和它的 ComposeNavigator 中。這里的抽象設(shè)計(jì)意味著如果您希望僅僅通過 Composable 構(gòu)建您的應(yīng)用,那么當(dāng)您使用 Navigation Compose 時(shí)無需任何涉及到 Fragment 的依賴。
該級(jí)別的分離意味著 Navigation 中有兩個(gè)層次來實(shí)現(xiàn)多返回棧:
仍需特別注意那些 尚未 更新的 Navigator ,它們無法支持保存自身狀態(tài)。底層的 Navigator API 已經(jīng)整體重寫來支持狀態(tài)保存 (您需要覆寫新增的 navigate() 和 popBackStack() API 的重載方法,而不是覆寫之前的版本),即使 Navigator 并未更新, NavController 仍會(huì)保存 NavBackStackEntry 的狀態(tài) (在 Jetpack 世界中向后兼容是非常重要的)。
如果您僅僅在應(yīng)用中使用 Navigation,那么 Navigator 這個(gè)層面更多的是實(shí)現(xiàn)細(xì)節(jié),而不是您需要直接與之交互的內(nèi)容??梢赃@么說,我們已經(jīng)完成了將 FragmentNavigator 和 ComposeNavigator 遷移到新的 Navigator API 的工作,使其能夠正確地保存和恢復(fù)它們的狀態(tài),在這個(gè)層面上您無需再做任何額外工作。
如果您正在使用 NavigationUI,它是用于連接您的 NavController 到 Material 視圖組件的一系列專用助手,您會(huì)發(fā)現(xiàn)對(duì)于菜單項(xiàng)、 BottomNavigationView (現(xiàn)在叫 NavigationRailView ) 和 NavigationView ,多返回棧是 默認(rèn)啟用 的。這就意味著結(jié)合 navigation-fragment 和 navigation-ui 使用就可以。
NavigationUI API 是基于 Navigation 的其他公共 API 構(gòu)建的,確保您可以準(zhǔn)確地為自定義組件構(gòu)建您自己的版本。保證您可以構(gòu)建所需的自定義組件。啟用保存和恢復(fù)返回棧的 API 也不例外,在 Navigation XML 中通過 NavOptions 上的新 API,也就是 navOptions Kotlin DSL,以及 popBackStack() 的重載方法可以幫助您指定 pop 操作保存狀態(tài)或者指定 navigate 操作來恢復(fù)之前已保存的狀態(tài)。
比如,在 Compose 中,任何全局的導(dǎo)航模式 (無論是底部導(dǎo)航欄、導(dǎo)航邊欄、抽屜式導(dǎo)航欄或者任何您能想到的形式) 都可以使用我們?cè)谂c 底部導(dǎo)航欄集成 所介紹的相同的技術(shù),并且結(jié)合 saveState 和 restoreState 屬性一起調(diào)用 navigate() :
對(duì)用戶來說,最令人沮喪的事情之一便是丟失之前的狀態(tài)。這也是為什么 Fragment 用一整頁來講解 保存與 Fragment 相關(guān)的狀態(tài),而且也是我非常樂于更新每個(gè)層級(jí)來支持多返回棧的原因之一:
如果您希望了解 更多使用該 API 的示例,請(qǐng)參考 NavigationAdvancedSample (它是最新更新的,且不包含任何用于支持多返回棧的 NavigationExtensions 代碼)。
對(duì)于 Navigation Compose 的示例,請(qǐng)參考 Tivi。
如果您遇到任何問題,請(qǐng)使用官方的問題追蹤頁面提交關(guān)于 Fragment 或者 Navigation 的 bug,我們會(huì)盡快處理。