Android版本適配(二)

不同版本的變化

Android6.0發(fā)布時(shí)間: 2015年5月28日

主要變化:

  1. 運(yùn)行時(shí)權(quán)限
  2. 增加低電耗模式和應(yīng)用待機(jī)模式
  3. 取消支持 Apache HTTP 客戶端
  4. 移除硬件標(biāo)識(shí)符訪問權(quán)
  5. WLAN 和網(wǎng)絡(luò)連接變更
  6. 相機(jī)服務(wù)變更
Android7.0發(fā)布時(shí)間: 2016年8月22日

主要變化:

  1. 私有文件訪問權(quán)限更改
  2. 多窗口支持(分屏顯示)
  3. 通知增強(qiáng)功能
  4. 隨時(shí)隨地低電耗模式
  5. 多語言區(qū)域支持峭判,更多語言
  6. 新增的表情符號(hào)
  7. Chrome 和 WebView 配合使用
  8. APK signature scheme v2
Android8.0發(fā)布時(shí)間:2017年8月22日

主要變化:

  1. 通知渠道
  2. 啟動(dòng)圖標(biāo)
  3. 統(tǒng)一的布局外邊距和內(nèi)邊距
  4. 自動(dòng)填充框架
  5. 畫中畫模式
  6. 多顯示器支持媒體增強(qiáng)功能
Android9.0發(fā)布時(shí)間:2018年8月7日

主要變化:

  1. 劉海屏適配
  2. 通知功能的變更
  3. 隱私權(quán)變更
  4. 對(duì)使用非 SDK 接口的限制 和 適配策略
  5. 非Activity-Context啟動(dòng)Activity
  6. Apache HTTP 客戶端棄用捆愁,影響采用非標(biāo)準(zhǔn) ClassLoader 的應(yīng)用
  7. 前臺(tái)服務(wù)

注意:每個(gè)版本都有比較多的變化秀睛,但并不是所有內(nèi)容都需要適配鸠匀。適配某個(gè)版本咨察,需要將targetSdkVersion改為對(duì)應(yīng)的版本號(hào),點(diǎn)擊sync Now然后進(jìn)行適配担忧。

Android8.0適配

(1)通知渠道(Channeld)適配

Android O版本對(duì)通知做了規(guī)范性的控制馁启,強(qiáng)制用戶在發(fā)送通知的時(shí)候,對(duì)通知進(jìn)行系統(tǒng)性的管理秋度,新增了ChanneID炸庞,用來允許要為顯示的每種通知類型創(chuàng)建用戶可自定義的渠道,用戶界面將通知渠道稱之為通知類別荚斯。

注意:在8.0中所有通知的實(shí)現(xiàn)都需要提供通知渠道埠居,否則,所有通知在8.0系統(tǒng)上面都不能正常顯示

適配流程

1.創(chuàng)建 NotificationChannel 對(duì)象事期,并設(shè)置應(yīng)用內(nèi)唯一的通知 ID滥壕。在 NotificationManager 中注冊(cè)通知渠道對(duì)象。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel newsChannel = new NotificationChannel(CHANNEL_NEWS, "新聞",NotificationManager.IMPORTANCE_HIGH);
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.createNotificationChannel(newsChannel);
}

2.配置通知渠道的屬性兽泣,比如提示聲音等绎橘。

public void sendNews(View view) {
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Notification notification = new NotificationCompat.Builder(this, CHANNEL_NEWS)
         .setContentTitle("新聞標(biāo)題")
         .setContentText("新聞內(nèi)容")
         .setAutoCancel(true)
         .build();
    manager.notify(1, notification);
}
public void sendNoChannel(View view) {
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Notification notification = new NotificationCompat.Builder(this)
         .setContentTitle("沒有渠道的通知")
         .setContentText("通內(nèi)容")
         .setAutoCancel(true)
         .setSmallIcon(R.mipmap.ic_launcher)
         .build();
    manager.notify(1, notification);
}

4.通知完成后需要及時(shí)關(guān)閉通道

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    //關(guān)閉通知通道
    notificationManager.deleteNotificationChannel("新聞");
}

(2)懸浮窗適配

8.0 API 新增了一種懸浮窗的窗口類型,TYPE_APPLICATION_OVERLAY唠倦;
如果應(yīng)用使用 SYSTEM_ALERT_WINDOW 權(quán)限并且嘗試使用以下窗口類型之一來在其他應(yīng)用和系統(tǒng)窗口上方顯示提醒窗口:

TYPE_PHONE 
TYPE_PRIORITY_PHONE 
TYPE_SYSTEM_ALERT 
TYPE_SYSTEM_OVERLAY 
TYPE_SYSTEM_ERROR 
TYPE_TOAST

這些窗口將始終顯示在使用 TYPE_APPLICATION_OVERLAY 窗口類型的窗口下方称鳞。
如果該應(yīng)用適配了8.0,則應(yīng)用只能使用TYPE_APPLICATION_OVERLAY窗口類型來創(chuàng)建懸浮窗稠鼻。(其它窗口類型在8.0已經(jīng)被廢棄掉)

適配流程

1.申請(qǐng)權(quán)限

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

2.給懸浮窗設(shè)置type

public static void showLogoutDialog(final Context context) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    View view = View.inflate(context, R.layout.dialog_logout, null);
    builder.setView(view);
    final AlertDialog dialog = builder.create();
    if (Build.VERSION.SDK_INT>=26) {//8.0新特性
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
    }else{
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    }
    dialog.show();
}

(3)安裝Apk適配

Android 8.0去除了“允許未知來源”選項(xiàng)冈止,所以如果我們的App有安裝App的功能(檢查更新之類的),那么會(huì)無法正常安裝枷餐。

適配流程

1.首先在AndroidManifest文件中添加安裝未知來源應(yīng)用的權(quán)限靶瘸,這樣系統(tǒng)會(huì)自動(dòng)詢問用戶完成授權(quán)。

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

2.當(dāng)然也可以先使用 canRequestPackageInstalls()查詢是否有此權(quán)限毛肋,如果沒有的話使用Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES這個(gè)action將用戶引導(dǎo)至安裝未知應(yīng)用權(quán)限界面去授權(quán)怨咪。

private static final int REQUEST_CODE_UNKNOWN_APP = 100;

private void installAPK(){

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls();
        if (hasInstallPermission) {
            //安裝應(yīng)用
        } else {
            //跳轉(zhuǎn)至“安裝未知應(yīng)用”權(quán)限界面,引導(dǎo)用戶開啟權(quán)限
            Uri selfPackageUri = Uri.parse("package:" + this.getPackageName());
            Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, selfPackageUri);
            startActivityForResult(intent, REQUEST_CODE_UNKNOWN_APP);
        }
    }else {
        //安裝應(yīng)用
    }

}

//接收“安裝未知應(yīng)用”權(quán)限的開啟結(jié)果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_UNKNOWN_APP) {
        installAPK();
    }
}    

(4)權(quán)限適配

Android 8.0中PHONE權(quán)限組新增兩個(gè)權(quán)限

ANSWER_PHONE_CALLS:允許您的應(yīng)用通過編程方式接聽呼入電話润匙。要在您的應(yīng)用中處理呼入電話诗眨,您可以使用 acceptRingingCall() 函數(shù)。
READ_PHONE_NUMBERS:權(quán)限允許您的應(yīng)用讀取設(shè)備中存儲(chǔ)的電話號(hào)碼孕讳。

(5)廣播適配

Android 8.0 引入了新的廣播接收器限制匠楚,靜態(tài)廣播無法正常接收,因此應(yīng)該移除所有為隱式廣播 Intent 注冊(cè)的廣播接收器厂财。
解決方案:使用動(dòng)態(tài)廣播代替靜態(tài)廣播芋簿。

(6)透明主題的Activity適配

Android 8.0 非全屏透明頁(yè)面不允許設(shè)置方向,否則報(bào)錯(cuò)(后面8.1系統(tǒng)谷歌就去掉了這個(gè)限制)

適配流程

1.要么去掉對(duì)應(yīng)activity中的 screenOrientation 屬性璃饱,或者對(duì)應(yīng)設(shè)置方向的代碼与斤。
2.要么舍棄透明效果,在它的Theme中添加:

<item name="android:windowIsTranslucent">false</item>    

3.使用透明的dialog或者PopupWindow來代替,也可以用DialogFragment

(7)其他

項(xiàng)目使用了ActiveAndroid撩穿,在 8.0 或 8.1 系統(tǒng)上使用 26 或以上的版本的 SDK 時(shí)磷支,調(diào)用 ContentResolver 的 notifyChange 方法通知數(shù)據(jù)更新,或者調(diào)用 ContentResolver 的 registerContentObserver 方法監(jiān)聽數(shù)據(jù)變化時(shí)食寡,會(huì)出現(xiàn)上述異常雾狈。
解決方案:

1.在清單文件配置:

<provider
   android:name="com.activeandroid.content.ContentProvider"
   android:authorities="com.jz.androidclient"
   android:enabled="true"
   android:exported="false"/>

2.去掉這個(gè)監(jiān)聽刷新的方法,改為廣播刷新

Android9.0適配

Android P 限制了明文流量的網(wǎng)絡(luò)請(qǐng)求抵皱,非加密的流量請(qǐng)求都會(huì)被系統(tǒng)禁止掉
解決方案:

1.在資源文件新建xml目錄善榛,新建文件network_security_config.xml

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

2.清單文件配置:

<application
    android:networkSecurityConfig="@xml/network_security_config">
    <!--Android 9.0加的-->
    <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />
</application>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叨叙,隨后出現(xiàn)的幾起案子锭弊,更是在濱河造成了極大的恐慌,老刑警劉巖擂错,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件味滞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡钮呀,警方通過查閱死者的電腦和手機(jī)剑鞍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爽醋,“玉大人蚁署,你說我怎么就攤上這事÷焖模” “怎么了光戈?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)遂赠。 經(jīng)常有香客問我久妆,道長(zhǎng),這世上最難降的妖魔是什么跷睦? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任筷弦,我火速辦了婚禮,結(jié)果婚禮上抑诸,老公的妹妹穿的比我還像新娘烂琴。我一直安慰自己,他們只是感情好蜕乡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布奸绷。 她就那樣靜靜地躺著,像睡著了一般层玲。 火紅的嫁衣襯著肌膚如雪号醉。 梳的紋絲不亂的頭發(fā)上绒瘦,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音扣癣,去河邊找鬼。 笑死憨降,一個(gè)胖子當(dāng)著我的面吹牛父虑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播授药,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼士嚎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了悔叽?” 一聲冷哼從身側(cè)響起莱衩,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娇澎,沒想到半個(gè)月后笨蚁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趟庄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年括细,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戚啥。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奋单,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猫十,到底是詐尸還是另有隱情览濒,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布拖云,位于F島的核電站贷笛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏江兢。R本人自食惡果不足惜昨忆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杉允。 院中可真熱鬧邑贴,春花似錦、人聲如沸叔磷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽改基。三九已至繁疤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稠腊。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工躁染, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人架忌。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓吞彤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親叹放。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饰恕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Google Play 要求新應(yīng)用(自 2019 年 8 月 1 日起)和應(yīng)用更新(自 2019 年 11 月 1...
    JohnnyShieh閱讀 17,949評(píng)論 1 17
  • android開發(fā)中,除了屏幕適配[http://www.reibang.com/p/1302ad5a4b04]...
    waiwaaa閱讀 5,578評(píng)論 1 38
  • 前言 本文主要針對(duì)Android O的適配井仰,文中大部分內(nèi)容將來自官網(wǎng)埋嵌,本文只是總結(jié)提取出適配需要的注意點(diǎn),關(guān)于An...
    GrayMonkey閱讀 4,065評(píng)論 0 5
  • Android版本差異適配方案(5.0-9.0) 一個(gè)好的APP最好支持90%設(shè)備俱恶,由于不同版本系統(tǒng)提供的API可...
    yinhaide閱讀 3,266評(píng)論 4 32
  • 又是一個(gè)"艷陽天"雹嗦,原本大家祈禱的雨神沒有顯靈,燒的香拜的佛也沒有用合是,這陽光猛烈的勢(shì)頭似乎愈演愈烈俐银,下午的訓(xùn)練,是...
    龐新閱讀 415評(píng)論 0 0