一款 Android App 升級(jí)庫

AppUpdate

????前往1.x文檔

你可以通過它來升級(jí)你的App。

簡(jiǎn)介

  • 小巧便捷 , 使用方便
  • 自帶強(qiáng)制/非強(qiáng)制性升級(jí)提示框 , 可替換彈框的顏色
  • HttpURLConnection下載 , 不引用額外的庫
  • 解決三方庫之間FileProvider沖突問題
  • 支持Android 8

??2.x版本??

  • [x] 重構(gòu)API,調(diào)用方式更加簡(jiǎn)單

  • [x] 支持使用自定義彈框

  • [x] 升級(jí)庫的support依賴

  • [x] 支持進(jìn)度回調(diào),對(duì)話框進(jìn)度條,通知欄進(jìn)度條展示

  • [x] 支持后臺(tái)下載

  • [x] 支持強(qiáng)制更新

  • [x] 支持彈出框顏色替換

Gradle引入

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
dependencies {
    implementation 'com.github.Loren1994:AndroidUpdate:2.0.0'
}

API

//首先請(qǐng)求你的檢測(cè)更新接口 - 判斷是否更新
new AppUpdateManager.Builder()
                .bind(this) //必須調(diào)用
                .setDownloadUrl(url) //必須設(shè)置
                .setDownloadListener(new UpdateDownloadListener() { //必須設(shè)置
                    @Override
                    public void onDownloading(int process) {
                        Log.d("update", "onProcess: " + process);
                    }

                    @Override
                    public void onDownloadSuccess() {
                        Log.d("update", "下載完成");
                    }

                    @Override
                    public void onDownloadFail(String reason) {
                        Log.d("update", reason);
                    }
                })
                .setUpdateMessage("檢測(cè)到有新的版本,請(qǐng)下載升級(jí).") //自帶彈框顯示的內(nèi)容
                .setShowDialog(true) //是否顯示自帶的彈框
                .setForceUpdate(true) //是否顯示自帶的強(qiáng)制彈框
                .build();

說明

庫中帶有兩種提示框,分為強(qiáng)制性更新框和非強(qiáng)制性更新框,可通過setForceUpdate設(shè)置。

若不使用自帶的提示框,可設(shè)置setShowDialog(false)不顯示彈框,則AppUpdateManager可看做只是下載的方法。在這之前加入自己的彈框和頁面邏輯即可。

替換提示框顏色

<color name="download_indicator_color">XXXX</color>

關(guān)于FileProvider沖突的問題

以下用TakePhoto 4.0.3測(cè)試沖突問題

TakePhoto庫的Provider
<provider
   android:name="android.support.v4.content.FileProvider"
   android:authorities="${applicationId}.fileprovider"
   android:grantUriPermissions="true"
   android:exported="false">
   <meta-data
     android:name="android.support.FILE_PROVIDER_PATHS"
     android:resource="@xml/file_paths" />
</provider>
測(cè)試過程
條件 結(jié)果
app模塊: tools:replace="android:authorities" android:name="android.support.v4.content.FileProvider" update模塊: android:name="android.support.v4.content.FileProvider" ?編譯不通過
app模塊: tools:replace="android:authorities" android:name="android.support.v4.content.FileProvider" update模塊: android:name=".LorenProvider" ?編譯通過?TakePhoto調(diào)用崩潰
app模塊: android:name="android.support.v4.content.FileProvider" update模塊: android:name=".LorenProvider" ?編譯不通過
app模塊: android:name="pers.loren.appupdate.providers.ResolveConflictProvider" update模塊: android:name=".LorenProvider" ?編譯通過?TakePhoto調(diào)用正常?update庫正常
app模塊: tools:replace="android:authorities" android:name="android.support.v4.content.FileProvider" update模塊: tools:replace="android:authorities" android:name="android.support.v4.content.FileProvider" ?編譯通過?TakePhoto調(diào)用崩潰
app模塊: android:name="pers.loren.appupdate.providers.ResolveConflictProvider" update模塊: android:name=".ResolveConflictProvider" ?編譯不通過
沖突報(bào)錯(cuò)
Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed : Attribute provider#android.support.v4.content.FileProvider@authorities value=(pers.loren.test.app.fileprovider) from AndroidManifest.xml:26:13-68
    is also present at [com.jph.takephoto:takephoto_library:4.0.3] AndroidManifest.xml:19:13-64 value=(pers.loren.test.fileprovider).
    Suggestion: add 'tools:replace="android:authorities"' to <provider> element at AndroidManifest.xml:24:9-32:20 to override.
最終Manifest
<!--app模塊-->
<provider
    android:name="pers.loren.appupdate.providers.ResolveConflictProvider"
    android:authorities="${applicationId}.app.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
       <meta-data
           android:name="android.support.FILE_PROVIDER_PATHS"
           android:resource="@xml/file_paths" />
</provider>

<!--update模塊-->
<provider
    android:name=".LorenProvider"
    android:authorities="${applicationId}.appupdate.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
      <meta-data
           android:name="android.support.FILE_PROVIDER_PATHS"
           android:resource="@xml/file_paths" />
</provider>
最終解決方案

update庫里采用自定義的fileprovider , app模塊里也需要寫provider標(biāo)簽, update模塊提供ResolveConflictProvider以便app模塊使用 , app模塊里也可以自行建立fileprovider類

一點(diǎn)總結(jié)

  • 同一App的多個(gè)庫的provider的name都是android.support.v4.content.FileProvider時(shí)會(huì)引起沖突
  • 上述情況可以通過寫自定義FileProvider解決
  • 同一App不同庫的provider的name用同一個(gè)自定義FileProvider也會(huì)引起沖突
  • 不同App之間provider的name可以相同 , 但authorities不可以重復(fù),否則后者App不能安裝
  • 三方庫的Manifest里引入tools , app里也引入了tools , 可能導(dǎo)致merge manifest fail

Tips

  • 如果只引用這一個(gè)帶有provider的庫 , 則app里不需要寫provider
  • 如果庫之間有沖突 , 則參考 最終Manifest
  • build()方法里已判斷ServiceConnection不為null時(shí)首先解綁
  • 可以調(diào)用AppUpdateManager.unbindDownloadService(this)解綁Service

項(xiàng)目地址

GitHub:https://github.com/Loren1994/AndroidUpdate 歡迎star~ issue~

<(?????)>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,039評(píng)論 25 709
  • 哎呀呀 ,馬上就要面臨找工作了,媛媛心里緊張呀. 作為一個(gè)即將畢業(yè)的Android程序媛,開始面臨找工作了,...
    左神話閱讀 5,156評(píng)論 7 59
  • 1.什么是Activity?問的不太多,說點(diǎn)有深度的 四大組件之一,一般的,一個(gè)用戶交互界面對(duì)應(yīng)一個(gè)activit...
    JoonyLee閱讀 5,858評(píng)論 2 51
  • 轉(zhuǎn)自 1. 什么是Activity? 四大組件之一,一般的,一個(gè)用戶交互界面對(duì)應(yīng)一個(gè)activity setCon...
    joe1632閱讀 1,465評(píng)論 0 7
  • 看ted。這是我2017年目標(biāo)之一。 開始是用小老鼠做實(shí)驗(yàn),發(fā)現(xiàn)那些被媽媽舔的更多撫摸的更多的小老鼠,在它成長(zhǎng)之后...
    韓溪流閱讀 469評(píng)論 0 2

友情鏈接更多精彩內(nèi)容