行為變更
參照:http://developer.Android.com/intl/zh-cn/preview/behavior-changes.html
AndroidN 除了提供諸多新特性和功能外嘁捷,還對(duì)系統(tǒng)和 API 行為做出了各種變更浙垫。本文重點(diǎn)介紹您應(yīng)該了解并在開發(fā)應(yīng)用時(shí)加以考慮的一些重要變更。
如果您之前發(fā)布過 Android 應(yīng)用,請(qǐng)注意您的應(yīng)用可能受到這些平臺(tái)變更的影響母谎。
為延長設(shè)備的電池壽命慨蓝、降低內(nèi)存使用率以及提升應(yīng)用性能,Android N 對(duì)系統(tǒng)行為做出了一些變更竹伸。這些變更可能會(huì)影響系統(tǒng)資源和系統(tǒng)通知對(duì)應(yīng)用的可用性泥栖。您應(yīng)仔細(xì)檢查這些變更并評(píng)估應(yīng)用可能需要做何調(diào)整以適應(yīng)這些變更。
Android 6.0(API 級(jí)別 23)引入了打盹模式勋篓,當(dāng)用戶設(shè)備未插接電源吧享、處于靜止?fàn)顟B(tài)且屏幕關(guān)閉時(shí),該模式會(huì)推遲 CPU 和網(wǎng)絡(luò)活動(dòng)譬嚣,從而延長電池壽命钢颂。而 Android N 則通過在設(shè)備未插接電源且屏幕關(guān)閉狀態(tài)下、但不一定要處于靜止?fàn)顟B(tài)(例如用戶外出時(shí)把手持式設(shè)備裝在口袋里)時(shí)應(yīng)用部分 CPU 和網(wǎng)絡(luò)限制拜银,進(jìn)一步增強(qiáng)了打盹模式殊鞭。
當(dāng)設(shè)備處于充電狀態(tài)且屏幕已關(guān)閉一定時(shí)間后遭垛,設(shè)備會(huì)進(jìn)入打盹模式并應(yīng)用第一部分限制:關(guān)閉應(yīng)用網(wǎng)絡(luò)訪問、推遲作業(yè)和同步操灿。如果進(jìn)入打盹模式后設(shè)備處于靜止?fàn)顟B(tài)達(dá)到一定時(shí)間锯仪,系統(tǒng)則會(huì)對(duì)PowerManager.WakeLock、AlarmManager鬧鈴趾盐、GPS 和 Wi-Fi 掃描應(yīng)用余下的打盹限制庶喜。無論是應(yīng)用部分還是全部打盹限制,系統(tǒng)都會(huì)喚醒設(shè)備以提供簡短的維護(hù)時(shí)間窗口谤碳,在此窗口期間溃卡,應(yīng)用程序可以訪問網(wǎng)絡(luò)并執(zhí)行任何被推遲的作業(yè)/同步。
圖 2.打盹模式如何在設(shè)備處于靜止?fàn)顟B(tài)達(dá)到一定時(shí)間后應(yīng)用第二級(jí)系統(tǒng)活動(dòng)限制的圖示蜒简。
請(qǐng)注意瘸羡,激活屏幕或插接設(shè)備電源時(shí),系統(tǒng)將退出打盹模式并取消這些處理限制搓茬。此項(xiàng)新增的行為不會(huì)影響有關(guān)使您的應(yīng)用適應(yīng) Android 6.0(API 級(jí)別 23)中所推出的舊版本打盹模式的建議和最佳實(shí)踐犹赖,如打盹和應(yīng)用待機(jī)優(yōu)化中所討論。您仍應(yīng)遵循這些建議(例如使用 Google Cloud Messaging (GCM) 發(fā)送和接收消息)并開始安排更新計(jì)劃以適應(yīng)新增的打盹行為卷仑。
Android N 刪除了三項(xiàng)隱式廣播峻村,以幫助優(yōu)化內(nèi)存使用和電量消耗。此項(xiàng)變更很有必要锡凝,因?yàn)殡[式廣播會(huì)在后臺(tái)頻繁啟動(dòng)已注冊(cè)偵聽這些廣播的應(yīng)用粘昨。刪除這些廣播可以顯著提升設(shè)備性能和用戶體驗(yàn)。
移動(dòng)設(shè)備會(huì)經(jīng)歷頻繁的連接變更窜锯,例如在 Wi-Fi 和移動(dòng)數(shù)據(jù)之間切換時(shí)张肾。目前,可以通過在應(yīng)用清單文件中注冊(cè)一個(gè)接收器來偵聽隱式CONNECTIVITY_ACTION廣播锚扎,讓應(yīng)用能夠監(jiān)控這些變更吞瞪。由于很多應(yīng)用會(huì)注冊(cè)接收此廣播,因此單次網(wǎng)絡(luò)切換即會(huì)導(dǎo)致所有應(yīng)用被喚醒并同時(shí)處理此廣播驾孔。
同理芍秆,應(yīng)用可以注冊(cè)接收來自其他應(yīng)用(例如相機(jī))的隱式ACTION_NEW_PICTURE和ACTION_NEW_VIDEO廣播。當(dāng)用戶使用相機(jī)應(yīng)用拍攝照片時(shí)翠勉,這些應(yīng)用即會(huì)被喚醒以處理廣播妖啥。
為減緩這些問題,Android N 應(yīng)用了以下優(yōu)化措施:
面向 Android N 開發(fā)的應(yīng)用不會(huì)收到CONNECTIVITY_ACTION廣播眉菱,即使它們已有清單條目來請(qǐng)求接受這些事件的通知迹栓。在前臺(tái)運(yùn)行的應(yīng)用如果使用BroadcastReceiver請(qǐng)求接收通知,則仍可以在主線程中偵聽CONNECTIVITY_CHANGE俭缓。
應(yīng)用無法發(fā)送或接收ACTION_NEW_PICTURE或ACTION_NEW_VIDEO廣播克伊。此項(xiàng)優(yōu)化會(huì)影響所有應(yīng)用,而不僅僅是面向 Android N 的應(yīng)用华坦。
未來的 Android 版本還可能會(huì)棄用其他隱式廣播以及未綁定的后臺(tái)服務(wù)愿吹。有鑒于此,您應(yīng)避免依賴在清單文件中聲明的接收器來偵聽隱式廣播或刪除此依賴關(guān)系惜姐,以及避免或刪除對(duì)后臺(tái)服務(wù)的依賴關(guān)系犁跪。
Android 框架提供多種解決方案來降低這些隱式廣播或后臺(tái)服務(wù)的必要性。例如歹袁,JobSchedulerAPI 提供了一個(gè)穩(wěn)健可靠的機(jī)制來安排滿足指定條件(例如連入不按流量計(jì)費(fèi)的網(wǎng)絡(luò))時(shí)所執(zhí)行的網(wǎng)絡(luò)操作坷衍。您甚至可以使用JobScheduler來響應(yīng)內(nèi)容提供程序所發(fā)生的變更。
如需了解有關(guān)此行為變更及如何改寫應(yīng)用的詳細(xì)信息条舔,請(qǐng)參閱后臺(tái)優(yōu)化枫耳。
Android N 做了一些權(quán)限更改,包括用戶帳戶權(quán)限和向外部存儲(chǔ)設(shè)備寫入信息的新權(quán)限孟抗,這些更改可能會(huì)影響您的應(yīng)用迁杨。下面概要列出了預(yù)覽版中已發(fā)生更改的權(quán)限。
GET_ACCOUNTS(已棄用)
GET_ACCOUNTS 權(quán)限現(xiàn)已棄用凄硼。對(duì)于面向 Android N 的應(yīng)用铅协,系統(tǒng)將忽略此權(quán)限。
為提高平臺(tái)對(duì)于視力不佳或視力受損用戶的可用性摊沉,Android N 做出了一些更改狐史。這些更改一般并不要求更改您的應(yīng)用代碼,不過您應(yīng)仔細(xì)檢查并使用您的應(yīng)用測試這些功能说墨,以評(píng)估它們對(duì)用戶體驗(yàn)的潛在影響骏全。
Android N 支持用戶設(shè)置顯示尺寸,以放大或縮小屏幕上的所有元素婉刀,從而提升設(shè)備對(duì)視力不佳用戶的可訪問性吟温。用戶無法將屏幕縮放至低于最小屏幕寬度sw320dp,該寬度是 Nexus 4 的寬度突颊,也是常規(guī)中等大小手機(jī)的寬度鲁豪。
?
當(dāng)設(shè)備密度發(fā)生更改時(shí),系統(tǒng)會(huì)以如下方式通知正在運(yùn)行的應(yīng)用:
如果是面向 API 級(jí)別 23 或更低版本系統(tǒng)的應(yīng)用律秃,則系統(tǒng)會(huì)自動(dòng)終止其所有后臺(tái)進(jìn)程爬橡。這意味著如果用戶切換離開此類應(yīng)用,轉(zhuǎn)而打開Settings屏幕并更改Display size設(shè)置棒动,則系統(tǒng)會(huì)像處理內(nèi)存不足的情況一樣終止該應(yīng)用糙申。如果應(yīng)用具有任何前臺(tái)進(jìn)程,則系統(tǒng)會(huì)如處理運(yùn)行時(shí)變更中所述將配置變更通知給這些進(jìn)程船惨,就像對(duì)待設(shè)備屏幕方向變更一樣柜裸。
如果是面向 Android N 的應(yīng)用缕陕,則其所有進(jìn)程(前臺(tái)和后臺(tái))都會(huì)收到有關(guān)配置變更的通知,如處理運(yùn)行時(shí)變更中所述疙挺。
大多數(shù)應(yīng)用并不需要進(jìn)行任何更改即可支持此功能扛邑,不過前提是這些應(yīng)用遵循 Android 最佳實(shí)踐。具體要檢查的事項(xiàng):
在屏幕寬度為sw320dp的設(shè)備上測試您的應(yīng)用铐然,并確保其充分運(yùn)行蔬崩。
當(dāng)設(shè)備配置發(fā)生變更時(shí),更新任何與密度相關(guān)的緩存信息搀暑,例如緩存位圖或從網(wǎng)絡(luò)加載的資源沥阳。當(dāng)應(yīng)用從暫停狀態(tài)恢復(fù)運(yùn)行時(shí),檢查配置變更自点。
注:如果您要緩存與配置相關(guān)的數(shù)據(jù)桐罕,則最好也包括相關(guān)元數(shù)據(jù),例如該數(shù)據(jù)對(duì)應(yīng)的屏幕尺寸或像素密度樟氢。保存這些元數(shù)據(jù)便于您在配置變更后決定是否需要刷新緩存數(shù)據(jù)冈绊。
避免用像素單位指定尺寸,因?yàn)橄袼夭粫?huì)隨屏幕密度縮放埠啃。應(yīng)改為使用與密度無關(guān)像素(dp) 單位指定尺寸死宣。
Android N 在“Welcome”屏幕中加入了“Vision Settings”,用戶可以在新設(shè)備上設(shè)置以下輔助工具設(shè)置:Magnification gesture碴开、Font size毅该、Display size和TalkBack。此項(xiàng)變更增強(qiáng)了與不同屏幕設(shè)置相關(guān)的錯(cuò)誤的可見性潦牛。要評(píng)估此功能的影響眶掌,您應(yīng)在啟用這些設(shè)置的狀態(tài)下測試應(yīng)用。您可以在Settings > Accessibility中找到這些設(shè)置巴碗。
Android N 做了一些命名空間更改朴爬,以阻止加載非公開 API。如果您使用 NDK橡淆,則只能使用 Android 平臺(tái)提供的公開 API召噩。在下一個(gè)官方發(fā)布的 Android 版本上使用非公開 API 會(huì)導(dǎo)致應(yīng)用崩潰。
為提醒您使用了非公開 API逸爵,在 Android N 設(shè)備上運(yùn)行的應(yīng)用會(huì)在有應(yīng)用調(diào)用非公開 API 時(shí)在日志消息輸出中生成一個(gè)錯(cuò)誤具滴。此錯(cuò)誤還會(huì)作為消息顯示在設(shè)備屏幕上,以幫助增強(qiáng)您對(duì)此情況的認(rèn)識(shí)师倔。您應(yīng)檢查應(yīng)用代碼以刪除使用非公開平臺(tái) API构韵,并使用預(yù)覽版設(shè)備或模擬器全面測試應(yīng)用。
如果您的應(yīng)用依賴平臺(tái)庫,則請(qǐng)參見 NDK 文檔疲恢,了解使用公開 API 等效項(xiàng)替換普通私有 API 的典型修復(fù)凶朗。您還可以鏈接至平臺(tái)庫,而無需實(shí)現(xiàn)此應(yīng)用冈闭,如果應(yīng)用使用的庫是平臺(tái)的一部分(例如libpng)俱尼,但不屬于 NDK抖单,則更可如此萎攒。此情況下,請(qǐng)確保您的 APK 包含您打算鏈接到的所有 .so 文件矛绘。
注意:有些第三方庫可能會(huì)鏈接至非公開 API耍休。如果您的應(yīng)用使用這些庫,那么當(dāng)您的應(yīng)用在下一個(gè)官方發(fā)布的 Android 版本上運(yùn)行時(shí)可能會(huì)出現(xiàn)崩潰現(xiàn)象货矮。
應(yīng)用不應(yīng)依賴或使用不屬于 NDK 的原生庫羊精,因?yàn)檫@些庫可能會(huì)發(fā)生更改或從一個(gè) Android 版本遷移至另一版本。例如囚玫,從 OpenSSL 切換至 BoringSSL 即屬于此類更改喧锦。此外,不同的設(shè)備可能提供不同級(jí)別的兼容性抓督,因?yàn)椴粚儆?NDK 中的平臺(tái)庫沒有兼容性要求燃少。如果您必須在較舊設(shè)備上訪問非 NDK 庫,則請(qǐng)依據(jù) Android API 級(jí)別進(jìn)行加載铃在。
為幫助您診斷此類問題阵具,下面列舉了一些在您試圖使用 Android N 開發(fā)應(yīng)用時(shí)可能遇到的Java和 NDK 錯(cuò)誤:
Java 錯(cuò)誤示例:
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so" is not accessible for the namespace "classloader-namespace"
NDK 錯(cuò)誤示例:
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
以下是遇到這類錯(cuò)誤的應(yīng)用的一些典型修復(fù):
可以使用標(biāo)準(zhǔn) JNI 函數(shù)來替代使用 libandroid_runtime.so 中的 getJavaVM 和 getJNIEnv:
AndroidRuntime::getJavaVM -> GetJavaVM from AndroidRuntime::getJNIEnv -> JavaVM::GetEnv orJavaVM::AttachCurrentThread from .
可以使用公開備選項(xiàng)__system_property_get來替代使用libcutils.so中的property_get符號(hào)。如需這樣做定铜,請(qǐng)使用__system_property_get及以下 include 函數(shù):
#include
應(yīng)使用應(yīng)用本地版本來替代使用libcrypto.so中的SSL_ctrl符號(hào)阳液。例如,您應(yīng)在.so文件中靜態(tài)鏈接libcyrpto.a揣炕,或者在應(yīng)用中包含您自己的來自 BoringSSL 或 OpenSSL 的動(dòng)態(tài)libcrypto.so帘皿。
Android N 包含一些針對(duì)面向 Android for Work 的應(yīng)用的變更,包括對(duì)證書安裝畸陡、密碼重置鹰溜、二級(jí)用戶管理谣光、設(shè)備標(biāo)識(shí)符訪問權(quán)限的變更冤议。如果您是要針對(duì) Android for Work 環(huán)境開發(fā)應(yīng)用,則應(yīng)仔細(xì)檢查這些變更并相應(yīng)地修改您的應(yīng)用备畦。
您必須先安裝授權(quán)證書安裝程序涩惑,然后 DPC 才能對(duì)其進(jìn)行設(shè)置仁期。對(duì)于面向 N SDK 的配置文件和設(shè)備所有者應(yīng)用,您應(yīng)在設(shè)備策略控制器 (DPC) 調(diào)用DevicePolicyManager.setCertInstallerPackage()之前安裝授權(quán)證書安裝程序。如果尚未安裝此安裝程序跛蛋,則系統(tǒng)會(huì)引發(fā)IllegalArgumentException熬的。
針對(duì)設(shè)備管理員的重置密碼限制現(xiàn)在也適用于配置文件所有者。設(shè)備管理員無法再使用DevicePolicyManager.resetPassword()來清除或更改已經(jīng)設(shè)置的密碼赊级。不過押框,設(shè)備管理員仍可以設(shè)置密碼,但只能在設(shè)備沒有密碼理逊、PIN 或圖案時(shí)這樣做橡伞。
即使設(shè)置了限制,設(shè)備所有者和配置文件所有者仍可以管理帳戶晋被。而且兑徘,即使具有DISALLOW_MODIFY_ACCOUNTS用戶限制,設(shè)備所有者和配置文件所有者仍可調(diào)用 Account Management API羡洛。
設(shè)備所有者可以更輕松地管理二級(jí)用戶挂脑。當(dāng)設(shè)備在設(shè)備所有者模式下運(yùn)行時(shí),系統(tǒng)將自動(dòng)設(shè)置DISALLOW_ADD_USER限制欲侮。這樣可以防止用戶創(chuàng)建非托管二級(jí)用戶崭闲。此外,CreateUser()和createAndInitial()方法已棄用威蕉,取而代之的是DevicePolicyManager.createAndManageUser()方法刁俭。
設(shè)備所有者可以訪問設(shè)備標(biāo)識(shí)符。設(shè)備所有者可以使用DevicePolicyManagewr.getWifiMacAddress()訪問設(shè)備的 Wi-Fi MAC 地址忘伞。如果設(shè)備上從未啟用 Wi-Fi薄翅,則此方法將返回一個(gè)null值。
如需了解有關(guān) Android N 中針對(duì) Android for Work 所做變更的詳細(xì)信息氓奈,請(qǐng)參閱Android for Work 更新翘魄。
如果一個(gè)應(yīng)用在 Android N 上運(yùn)行,但卻是針對(duì)更低 API 級(jí)別開發(fā)的舀奶,那么在用戶更改顯示尺寸時(shí)暑竟,系統(tǒng)將終止此應(yīng)用進(jìn)程。因此育勺,應(yīng)用必須能夠正常處理此情景但荤。否則,當(dāng)用戶從最近使用記錄中恢復(fù)運(yùn)行應(yīng)用時(shí)涧至,應(yīng)用將會(huì)出現(xiàn)崩潰現(xiàn)象腹躁。
您應(yīng)測試應(yīng)用以確保不會(huì)發(fā)生此行為。要進(jìn)行此測試南蓬,您可以通過 DDMS 手動(dòng)終止應(yīng)用纺非,以造成相同的崩潰現(xiàn)象哑了。
在密度發(fā)生更改時(shí),系統(tǒng)不會(huì)自動(dòng)終止面向 N 及更高版本的應(yīng)用烧颖;不過弱左,這些應(yīng)用仍可能對(duì)配置變更做出不良響應(yīng)。
Android N 上的應(yīng)用應(yīng)能夠正常處理配置變更炕淮,并且在后續(xù)啟動(dòng)時(shí)不會(huì)出現(xiàn)崩潰現(xiàn)象拆火。您可以通過更改字體大小 (Setting>Display>Font size) 并隨后從最近使用記錄中恢復(fù)運(yùn)行應(yīng)用,來驗(yàn)證應(yīng)用行為涂圆。
對(duì) CONNECTIVITY_ACTION 的限制
安排連入無限流量連接時(shí)的網(wǎng)絡(luò)作業(yè)
在應(yīng)用運(yùn)行時(shí)監(jiān)控網(wǎng)絡(luò)連接
對(duì) NEW_PICTURE 和 NEW_VIDEO 的限制
后臺(tái)進(jìn)程非常耗費(fèi)內(nèi)存和電池们镜。例如,隱式廣播可以啟動(dòng)許多已注冊(cè)偵聽它的后臺(tái)進(jìn)程乘综,即使這些進(jìn)程可能沒有執(zhí)行許多工作憎账。 這會(huì)嚴(yán)重影響設(shè)備性能和用戶體驗(yàn)。
為減緩這個(gè)問題卡辰,N Developer Preview 應(yīng)用了以下限制:
面向 Preview 的應(yīng)用不會(huì)收到CONNECTIVITY_ACTION廣播,即使它們?cè)谇鍐挝募凶?cè)接收這些廣播邪意。 在前臺(tái)運(yùn)行的應(yīng)用如果使用Context.registerReceiver()注冊(cè)BroadcastReceiver九妈,則仍可在主線程上偵聽CONNECTIVITY_CHANGE。
應(yīng)用無法發(fā)送或接收ACTION_NEW_PICTURE或ACTION_NEW_VIDEO廣播雾鬼。此項(xiàng)優(yōu)化會(huì)影響所有應(yīng)用萌朱,而不僅僅是面向 Preview 的應(yīng)用。
Android 框架提供多個(gè)解決方案來緩解對(duì)這些隱式廣播的需求策菜。 例如晶疼,JobScheduler和GcmNetworkManager提供了一個(gè)穩(wěn)健可靠的機(jī)制來安排滿足指定條件(例如連入無限流量網(wǎng)絡(luò))時(shí)所執(zhí)行的網(wǎng)絡(luò)操作。 現(xiàn)在又憨,您還可以使用JobScheduler來響應(yīng)內(nèi)容提供程序所發(fā)生的變更翠霍。JobInfo對(duì)象封裝了JobScheduler用來安排您的作業(yè)的參數(shù)。如果符合作業(yè)條件蠢莺,系統(tǒng)將在應(yīng)用的JobService上執(zhí)行此作業(yè)寒匙。
在本文檔中,我們將學(xué)習(xí)如何使用備用方法(如JobScheduler)調(diào)整您的應(yīng)用以符合這些新限制躏将。
對(duì) CONNECTIVITY_ACTION 的限制
面向 N Developer Preview 的應(yīng)用不會(huì)收到CONNECTIVITY_ACTION廣播锄弱,即使它們?cè)谇鍐挝募凶?cè)接收這些廣播亦是如此,依賴此廣播的流程也不會(huì)啟動(dòng)祸憋。 這可能會(huì)給需要偵聽網(wǎng)絡(luò)變化或者需要在設(shè)備接入無限流量網(wǎng)絡(luò)時(shí)執(zhí)行批量網(wǎng)絡(luò)活動(dòng)的應(yīng)用造成問題会宪。 Android 框架中已存在多個(gè)可繞過此限制的解決方案,但需要根據(jù)您想要應(yīng)用實(shí)現(xiàn)的目標(biāo)來選擇正確的解決方案蚯窥。
注:當(dāng)應(yīng)用位于前臺(tái)時(shí)掸鹅,通過Context.registerReceiver()中注冊(cè)的BroadcastReceiver將繼續(xù)接收這些廣播喜命。
安排連入無限流量連接時(shí)的網(wǎng)絡(luò)作業(yè)
使用JobInfo.Builder類構(gòu)建JobInfo對(duì)象時(shí),應(yīng)用setRequiredNetworkType()方法河劝,并將JobInfo.NETWORK_TYPE_UNMETERED作為作業(yè)參數(shù)傳遞壁榕。
當(dāng)符合作業(yè)條件時(shí),應(yīng)用會(huì)收到回調(diào)以運(yùn)行指定JobService.class中的onStartJob()方法赎瞎。 如需查看JobScheduler實(shí)現(xiàn)的更多示例牌里,請(qǐng)參閱JobScheduler 示例應(yīng)用。
使用 GMSCore 服務(wù)且面向 Android 5.0(API 級(jí)別 21)或更低版本系統(tǒng)的應(yīng)用可以使用GcmNetworkManager并指定Task.NETWORK_STATE_UNMETERED务甥。
在應(yīng)用運(yùn)行時(shí)監(jiān)控網(wǎng)絡(luò)連接
在前臺(tái)運(yùn)行的應(yīng)用仍可以通過注冊(cè)的BroadcastReceiver偵聽CONNECTIVITY_CHANGE牡辽。不過,ConnectivityManagerAPI 提供了一個(gè)更穩(wěn)健可靠的方法敞临,可以僅在符合指定的網(wǎng)絡(luò)條件時(shí)才請(qǐng)求回調(diào)态辛。
NetworkRequest對(duì)象根據(jù)NetworkCapabilities定義網(wǎng)絡(luò)回調(diào)的參數(shù)。 使用NetworkRequest.Builder類創(chuàng)建NetworkRequest對(duì)象挺尿。然后奏黑,registerNetworkCallback()將NetworkRequest對(duì)象傳遞給系統(tǒng)。 當(dāng)符合網(wǎng)絡(luò)條件時(shí)编矾,應(yīng)用會(huì)收到回調(diào)以執(zhí)行在其ConnectivityManager.NetworkCallback類中定義的onAvailable()方法熟史。
應(yīng)用繼續(xù)接收回調(diào),直至應(yīng)用退出或調(diào)用unregisterNetworkCallback()窄俏。
對(duì) NEW_PICTURE 和 NEW_VIDEO 的限制
在 N Developer Preview 中蹂匹,應(yīng)用無法發(fā)送或接收ACTION_NEW_PICTURE或ACTION_NEW_VIDEO廣播。此限制有助于緩解必須喚醒多個(gè)應(yīng)用以處理新圖像或視頻時(shí)對(duì)性能和用戶體驗(yàn)造成的影響凹蜈。 N Developer Preview 擴(kuò)展了JobInfo和JobParameters以提供備用解決方案限寞。
為了針對(duì)內(nèi)容 URI 變化觸發(fā)作業(yè),N Developer Preview 使用以下方法擴(kuò)展了JobInfoAPI仰坦。
JobInfo.TriggerContentUri()
封裝針對(duì)內(nèi)容 URI 變化觸發(fā)作業(yè)所需的參數(shù)履植。
JobInfo.Builder.addTriggerContentUri()
將TriggerContentUri對(duì)象傳遞給JobInfo。ContentObserver監(jiān)控已封裝的內(nèi)容 URI缎岗。如果存在多個(gè)與某個(gè)作業(yè)關(guān)聯(lián)的TriggerContentUri對(duì)象静尼,則系統(tǒng)會(huì)提供一個(gè)回調(diào),即使其報(bào)告僅一個(gè)內(nèi)容 URI 發(fā)生變化传泊。
如果給定 URI 的任何子級(jí)發(fā)生變化鼠渺,則添加TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS標(biāo)志以觸發(fā)作業(yè)。 此標(biāo)志對(duì)應(yīng)于傳遞給registerContentObserver()的notifyForDescendants參數(shù)眷细。
注:TriggerContentUri()無法與setPeriodic()或setPersisted()結(jié)合使用拦盹。 若要持續(xù)監(jiān)控內(nèi)容變化,則可在應(yīng)用的JobService完成處理最新的回調(diào)前安排新的JobInfo溪椎。
當(dāng)系統(tǒng)報(bào)告指定內(nèi)容 URI 所發(fā)生變化時(shí)普舆,應(yīng)用將收到一個(gè)回調(diào)恬口,并向MediaContentJob.class中的onStartJob()方法傳遞一個(gè)JobParameters對(duì)象。
N Developer Preview 也擴(kuò)展了JobParameters沼侣,以允許應(yīng)用接收有關(guān)哪些內(nèi)容權(quán)限和 URI 已觸發(fā)作業(yè)的有用信息:
Uri[] getTriggeredContentUris()
返回已觸發(fā)作業(yè)的 URI 數(shù)組祖能。如果沒有任何 URI 觸發(fā)作業(yè)(例如,作業(yè)是因截止期限或其他一些原因觸發(fā)的)蛾洛,或者已更改的 URI 數(shù)量超過 50养铸,該數(shù)組將為null。
String[] getTriggeredContentAuthorities()
返回已觸發(fā)作業(yè)的內(nèi)容權(quán)限的字符串?dāng)?shù)組轧膘。 如果返回的數(shù)組不是null钞螟,請(qǐng)使用getTriggeredContentUris()檢索有關(guān)哪些 URI 已更改的詳細(xì)信息。
優(yōu)化您的應(yīng)用以在低內(nèi)存設(shè)備上或在低內(nèi)存條件下運(yùn)行谎碍,這樣可以提升性能和用戶體驗(yàn)鳞滨。 刪除后臺(tái)服務(wù)依賴關(guān)系和靜態(tài)注冊(cè)的隱式廣播接收器可幫助您的應(yīng)用在此類設(shè)備上運(yùn)行得更好。 盡管 N Developer Preview 采取了措施以減少部分問題蟆淀,但建議您優(yōu)化自己的應(yīng)用拯啦,使其能夠在完全不使用這些后臺(tái)進(jìn)程的情況下運(yùn)行。
N Developer Preview 推出了一些附加Android Debug Bridge (ADB)命令扳碍,您可以使用這些命令測試在禁用這些后臺(tái)進(jìn)程情況下的應(yīng)用行為:
要模擬隱式廣播和后臺(tái)服務(wù)不可用的條件提岔,請(qǐng)輸入以下命令:
$ adb shell cmd appops set RUN_IN_BACKGROUND ignore
要重新啟用隱式廣播和后臺(tái)服務(wù),請(qǐng)輸入以下命令:
$ adb shell cmd appops set RUN_IN_BACKGROUND allow