亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Android版本適配:9.0 Pie

 更新時(shí)間:2019年04月23日 11:46:53   作者:Anlia  
這篇文章主要介紹了Android版本適配9.0 Pie,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、前言

本文主要是從官方文檔中篩選出一些常見的適配項(xiàng),若有任何紕漏或需要補(bǔ)充的,歡迎大家在評(píng)論區(qū)指出。

二、版本適配

1. 限制 HTTP 網(wǎng)絡(luò)請(qǐng)求

Android 9.0 中限制了 HTTP(明文傳輸)網(wǎng)絡(luò)請(qǐng)求,若仍繼續(xù)使用HTTP請(qǐng)求,則會(huì)在日志中提示以下異常(只是無法正常發(fā)出請(qǐng)求,不會(huì)導(dǎo)致應(yīng)用崩潰):

java.net.UnknownServiceException: CLEARTEXT communication to xxx not permitted by network security policy

適配的方法如下:

第一種

在資源目錄中新建一個(gè) xml 文件作為網(wǎng)絡(luò)安全配置文件,例如 xml/network_security_config.xml,然后在文件中填寫以下內(nèi)容:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
 <base-config cleartextTrafficPermitted="true" />
</network-security-config>

 在AndroidManifest.xml進(jìn)行配置:

<application
 ...
 android:networkSecurityConfig="@xml/network_security_config">
 ...
</application>

第二種(感謝 AllenChiang 同學(xué)的提醒)

Android 6.0 中引入了是否允許網(wǎng)絡(luò)使用明文傳輸?shù)呐渲茫?/p>

<application android:usesCleartextTraffic=["true" | "false"]>

原來默認(rèn)為 true,但在 Android 9.0 中默認(rèn)值改為了 false,因此將配置手動(dòng)設(shè)為 true 即可解決明文傳輸被限制的問題

2. 棄用 Apache HTTP Client

由于官方在 Android 9.0 中移除了所有 Apache HTTP Client 相關(guān)的類,因此我們的應(yīng)用或是一些第三方庫如果使用了這些類,就會(huì)拋出找不到類的異常:

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/conn/scheme/SchemeRegistry;

若需要繼續(xù)使用 Apache HTTP Client ,可通過以下方法進(jìn)行適配:

在 AndroidManifest.xml 中添加以下內(nèi)容:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

或者在應(yīng)用中直接將 Apache HTTP Client 相關(guān)的類打包并進(jìn)行引用

3. 限制非 SDK 接口的調(diào)用

3.1 簡述

一直以來,官方提供的接口分為了 SDK 接口和非 SDK 接口。SDK 接口即官方支持的接口,開發(fā)者可以直接調(diào)用不會(huì)有任何限制。一般而言,SDK 接口都記錄在官方的接口索引中,沒有記錄的就視為非 SDK 接口,例如一些使用了 @hide 標(biāo)注的方法。

以往開發(fā)者對(duì)于非 SDK 接口的調(diào)用通常是利用反射或者JNI間接調(diào)用的方式進(jìn)行,但這樣的調(diào)用方式如果處理不當(dāng)會(huì)比較容易出現(xiàn)一些未知的錯(cuò)誤。為了提升用戶體驗(yàn)和降低應(yīng)用發(fā)生崩潰的風(fēng)險(xiǎn),Android 9.0 對(duì)應(yīng)用能使用的非 SDK 接口實(shí)施了限制,具體的限制手段請(qǐng)見下表:

此外,為了開發(fā)者能夠順利過渡到 Android 9.0,官方對(duì)非 SDK 接口進(jìn)行了分類,共分為三類,light-greylist(淺灰名單)、dark-greylist(深灰名單)以及blacklist(黑名單):

  1. light-greylist(淺灰名單):對(duì)于此名單中的非 SDK 接口,官方暫未找到可替代的 SDK 接口,因此開發(fā)者仍可繼續(xù)訪問(如果 targetSdkVersion 大于等于28時(shí)會(huì)出現(xiàn)警告)。
  2. dark-greylist(深灰名單):targetSdkVersion 小于28時(shí)仍可繼續(xù)使用此名單中的接口,但會(huì)出現(xiàn)警告提示;大于等于28時(shí),這些接口將會(huì)限制訪問。
  3. blacklist(黑名單):無論 targetSdkVersion 為多少,只要應(yīng)用運(yùn)行在 Android 9.0 平臺(tái)上,訪問此名單中的接口都會(huì)受限

3.2 如何測試應(yīng)用是否使用非 SDK 接口

可以通過以下方式進(jìn)行測試(詳情請(qǐng)至官方文檔):

  1. 使用 Android 9.0 或更高版本的設(shè)備調(diào)試應(yīng)用
  2. 使用 StrictMode API 進(jìn)行測試
  3. 使用 veridex 工具對(duì)應(yīng)用進(jìn)行掃描

建議使用第三種方式,該工具的掃描結(jié)果會(huì)列出應(yīng)用對(duì)于三個(gè)限制名單中的接口的調(diào)用細(xì)節(jié)。

 4. 前臺(tái)服務(wù)權(quán)限

在 Android 9.0 中,應(yīng)用在使用前臺(tái)服務(wù)之前必須先申請(qǐng) FOREGROUND_SERVICE 權(quán)限,否則就會(huì)拋出 SecurityException 異常。

此外,由于 FOREGROUND_SERVICE 權(quán)限只是普通權(quán)限,因此開發(fā)者只需在 AndroidManifest.xml 中注冊此權(quán)限即可,系統(tǒng)會(huì)自動(dòng)對(duì)此權(quán)限進(jìn)行授權(quán):

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

5. 強(qiáng)制執(zhí)行 FLAG_ACTIVITY_NEW_TASK 要求

在 Android 7.0(API 級(jí)別 24)之前,若開發(fā)者需要通過非 Activity context 啟動(dòng) Activity,就必須設(shè)置 Intent 標(biāo)志 FLAG_ACTIVITY_NEW_TASK,否則會(huì)啟動(dòng)失敗并拋出以下異常

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

但這個(gè)要求在更新 Android 7.0 以后由于系統(tǒng)問題被臨時(shí)取消了,開發(fā)者即使不設(shè)置標(biāo)志也可以正常啟動(dòng) Activity。而在 Android 9.0 中官方修復(fù)了這個(gè)問題,這個(gè)要求重新開始強(qiáng)制執(zhí)行,因此開發(fā)者在適配 Android 9.0 時(shí)需要注意這個(gè)問題。

 6. 不允許共享 WebView 數(shù)據(jù)目錄

Android 9.0 中為了改善應(yīng)用穩(wěn)定性和數(shù)據(jù)完整性,應(yīng)用無法再讓多個(gè)進(jìn)程共用同一 WebView 數(shù)據(jù)目錄。此類數(shù)據(jù)目錄一般存儲(chǔ) Cookie、HTTP 緩存以及其他與網(wǎng)絡(luò)瀏覽有關(guān)的持久性和臨時(shí)性存儲(chǔ)。

如果開發(fā)者需要在多進(jìn)程中使用 WebView,則必須先調(diào)用 WebView.setDataDirectorySuffix() 方法為每個(gè)進(jìn)程設(shè)置用于存儲(chǔ) WebView 數(shù)據(jù)的目錄。若多進(jìn)程 WebView 之間需要共享數(shù)據(jù),開發(fā)者需自己通過 IPC 的方式實(shí)現(xiàn)。

此外,若開發(fā)者只想在一個(gè)進(jìn)程中使用 WebView,并且希望嚴(yán)格執(zhí)行這個(gè)規(guī)則,可以通過在其他進(jìn)程中調(diào)用 WebView.disableWebView() 方法,這樣其他進(jìn)程創(chuàng)建 WebView 實(shí)例就會(huì)拋出異常。

7. 其他 API 方面的修改

7.1 Region.Op 相關(guān)

Android 9.0 中如果在使用繪圖裁剪功能時(shí)設(shè)置了除 Region.Op.INTERSECT 或 Region.Op.DIFFERENCE 以外的類型,就會(huì)拋出以下異常:

 java.lang.IllegalArgumentException: Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed

具體原因是官方廢棄了那幾個(gè)具有 Region.Op 參數(shù)的裁剪方法,如 clipRect(@NonNull RectF rect, @NonNull Region.Op op) :

 

/**
 * Modify the current clip with the specified rectangle.
 *
 * @param rect The rect to intersect with the current clip
 * @param op How the clip is modified
 * @return true if the resulting clip is non-empty
 *
 * @deprecated Region.Op values other than {@link Region.Op#INTERSECT} and
 * {@link Region.Op#DIFFERENCE} have the ability to expand the clip. The canvas clipping APIs
 * are intended to only expand the clip as a result of a restore operation. This enables a view
 * parent to clip a canvas to clearly define the maximal drawing area of its children. The
 * recommended alternative calls are {@link #clipRect(RectF)} and {@link #clipOutRect(RectF)};
 *
 * As of API Level API level {@value Build.VERSION_CODES#P} only {@link Region.Op#INTERSECT} and
 * {@link Region.Op#DIFFERENCE} are valid Region.Op parameters.
 */
@Deprecated
public boolean clipRect(@NonNull RectF rect, @NonNull Region.Op op) {
 checkValidClipOp(op);
 return nClipRect(mNativeCanvasWrapper, rect.left, rect.top, rect.right, rect.bottom,
   op.nativeInt);
}

private static void checkValidClipOp(@NonNull Region.Op op) {
 if (sCompatiblityVersion >= Build.VERSION_CODES.P
   && op != Region.Op.INTERSECT && op != Region.Op.DIFFERENCE) {
  throw new IllegalArgumentException(
    "Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed");
 }
}

對(duì)于這個(gè)問題,可以通過以下方法進(jìn)行適配:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
 canvas.clipPath(path);
} else {
 canvas.clipPath(path, Region.Op.XOR);// REPLACE、UNION 等類型
}

7.2 Build.SERIAL 被棄用

Android 9.0 之前,開發(fā)者可以使用 Build.SERIAL 獲取設(shè)備的序列號(hào)?,F(xiàn)在這個(gè)方法被棄用了,Build.SERIAL 將始終設(shè)置為 "UNKNOWN" 以保護(hù)用戶的隱私。
適配的方法為先請(qǐng)求 READ_PHONE_STATE 權(quán)限,然后調(diào)用 Build.getSerial() 方法。

以上所述是小編給大家介紹的Android版本適配9.0 Pie詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評(píng)論