[Android] Android 應用程式內更新:強制更新與靈活更新

更新於 發佈於 閱讀時間約 9 分鐘

Android 提供應用程式內更新功能,有兩種更新模式:強制更新靈活更新,滿足不同應用場景的需求。

1. 強制更新(AppUpdateType.IMMEDIATE)

    • 特點:用戶按下更新後,必須等待更新完成才能繼續使用應用程式。
    • 功能細節
      • 更新介面右上角設有「×」按鈕,允許用戶關閉更新並暫不升級。
      • 若用戶選擇關閉更新(按下「×」),系統會發送相關通知,提醒用戶稍後可執行相應操作進行更新。

2. 靈活更新(AppUpdateType.FLEXIBLE)

    • 特點:用戶按下更新後,更新操作會在背景進行,用戶可同時繼續使用應用程式。
    • 功能細節
      • 當更新檔案下載完成時,系統會通知用戶,提示重啟應用程式以完成更新。
      • 提供更流暢的使用體驗,特別適合對即時更新需求不高的情況。

這兩種模式各具特色,開發者可以根據應用需求選擇適合的更新方式,提升用戶體驗與更新效率。

build.gradle

// In your app's build.gradle file:
...
dependencies {
implementation 'com.google.android.play:app-update:2.1.0'
}

強制更新

AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(this);

// 檢查是否有更新
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
appUpdateInfoTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {

}
});
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {

if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
try {

// 啟動立即更新流程
appUpdateManager.startUpdateFlowForResult(appUpdateInfo, this,
AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build(), UPDATE_REQUEST_CODE
);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == UPDATE_REQUEST_CODE) {
if (resultCode != RESULT_OK) {
// 更新被取消或失敗
Toast.makeText(this, "更新失敗或被取消", Toast.LENGTH_SHORT).show();
}
}

}

靈活更新

Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&
appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {

// 發起彈性更新
try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
this,
AppUpdateOptions.newBuilder(AppUpdateType.FLEXIBLE).build(),
FLEXIBLE_UPDATE_REQUEST_CODE
);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == FLEXIBLE_UPDATE_REQUEST_CODE) {
if (resultCode != RESULT_OK) {
// 處理更新被取消的情況
Log.d("Update", "彈性更新取消");
} else {
Log.d("Update", "彈性更新成功啟動");
}
}
}

@Override
protected void onResume() {
super.onResume();

// 檢查更新是否下載完成
appUpdateManager.getAppUpdateInfo().addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
// 提示用戶重啟應用以完成更新
Snackbar.make(findViewById(android.R.id.content), "更新下載完成,請重啟應用以完成更新。",Snackbar.LENGTH_INDEFINITE)
.setAction("重新啟動", v -> {appUpdateManager.completeUpdate();}).show();
}
});
}


avatar-img
0會員
9內容數
主題多元,有親子、料理、日文、程式,我們一家會遇到的東西都會分享~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
魯家生活 的其他內容
新北中港親子館,空間寬敞,設有室內外多元遊樂設施,適合各年齡層兒童,是親子同遊的好去處。
這篇文章分享一個簡單實用的塑膠袋收納方法,能有效節省空間並保持居家整潔。透過摺疊和分類,讓塑膠袋體積縮小,並利用衣架或繩子掛起,方便取用。
最近一打二的機會變多,媽媽為了輕鬆一點,所以就帶他們去親子館,讓他們放電,才能好好睡午覺,媽媽就會有自己的時間追劇,那因為是一打二,所以照片就不會太多,畢竟要看著小孩,就找空檔隨手拍。 信誼親子館分成五大區:森林體能區、動腦派對區、扮家家酒區、小寶寶區、小車趴趴走區,包子待最久的區域是小寶寶區跟森
たがる V(ます形)ます たがる 表示第三者的願望 從外觀就可以看出對方的意願 息子むすこはテレビばかりを見みたがる。 我兒子老是想看電視。 注射ちゅうしゃが怖こわいから、息子むすこが病院びょういんへ行いきたがらない。 因為怕打針,所以兒子不想去醫院。 同僚どうりょうは残業ざんぎょうしたが
最近比較常帶包子跟豆花搭捷運,怕他們在捷運上不受控,所以就帶著貼紙本出門,平常在家不是很愛玩貼紙本,但不知道為什麼在捷運上就很願意玩,而且現在搭捷運都會問我有沒有帶貼紙本。 這次分享3款貼紙本,第一款是最下面的大創買的貼紙本,一開始都是給他們大創的貼紙本,一本49元可以隨便給他們撕給他們貼,大
買玩具的時候都會想說有什麼玩具包子他們有興趣,又可以學習到東西,很怕買到他們沒興趣的玩具,這樣就覺得有點浪費錢。 在滑手機的時候看到色彩啟蒙學習機的廣告,看到覺得好像很適合包子的年紀,快3歲的包子已經認識顏色了,而豆花1歲半,也可以開始慢慢教他認識顏色,所以就下單買來給他們玩看看。 色彩啟蒙學習
新北中港親子館,空間寬敞,設有室內外多元遊樂設施,適合各年齡層兒童,是親子同遊的好去處。
這篇文章分享一個簡單實用的塑膠袋收納方法,能有效節省空間並保持居家整潔。透過摺疊和分類,讓塑膠袋體積縮小,並利用衣架或繩子掛起,方便取用。
最近一打二的機會變多,媽媽為了輕鬆一點,所以就帶他們去親子館,讓他們放電,才能好好睡午覺,媽媽就會有自己的時間追劇,那因為是一打二,所以照片就不會太多,畢竟要看著小孩,就找空檔隨手拍。 信誼親子館分成五大區:森林體能區、動腦派對區、扮家家酒區、小寶寶區、小車趴趴走區,包子待最久的區域是小寶寶區跟森
たがる V(ます形)ます たがる 表示第三者的願望 從外觀就可以看出對方的意願 息子むすこはテレビばかりを見みたがる。 我兒子老是想看電視。 注射ちゅうしゃが怖こわいから、息子むすこが病院びょういんへ行いきたがらない。 因為怕打針,所以兒子不想去醫院。 同僚どうりょうは残業ざんぎょうしたが
最近比較常帶包子跟豆花搭捷運,怕他們在捷運上不受控,所以就帶著貼紙本出門,平常在家不是很愛玩貼紙本,但不知道為什麼在捷運上就很願意玩,而且現在搭捷運都會問我有沒有帶貼紙本。 這次分享3款貼紙本,第一款是最下面的大創買的貼紙本,一開始都是給他們大創的貼紙本,一本49元可以隨便給他們撕給他們貼,大
買玩具的時候都會想說有什麼玩具包子他們有興趣,又可以學習到東西,很怕買到他們沒興趣的玩具,這樣就覺得有點浪費錢。 在滑手機的時候看到色彩啟蒙學習機的廣告,看到覺得好像很適合包子的年紀,快3歲的包子已經認識顏色了,而豆花1歲半,也可以開始慢慢教他認識顏色,所以就下單買來給他們玩看看。 色彩啟蒙學習
本篇參與的主題活動
手肘髁發炎(Epicondylitis),俗稱網球肘 (Tennis Elbow) 評估、身體檢查、處理邏輯保母級指南,看完別還跟我說你不會。
又到了準備過年的熱門出國時段,必不可少的一定需要網路呀~ 來分享一下我曾經使用過的各家網卡及心得還有注意事項
農曆新年將至,本文介紹寶可夢世界中的蛇形寶可夢,包含阿柏家族、沙包蛇家族、藤蛇家族和飯匙蛇,並以其特性和技能,結合 2025 蛇年,提出新年祝福和相關討論。
手肘髁發炎(Epicondylitis),俗稱網球肘 (Tennis Elbow) 評估、身體檢查、處理邏輯保母級指南,看完別還跟我說你不會。
又到了準備過年的熱門出國時段,必不可少的一定需要網路呀~ 來分享一下我曾經使用過的各家網卡及心得還有注意事項
農曆新年將至,本文介紹寶可夢世界中的蛇形寶可夢,包含阿柏家族、沙包蛇家族、藤蛇家族和飯匙蛇,並以其特性和技能,結合 2025 蛇年,提出新年祝福和相關討論。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
本課程瞭解為什麼要使用 ConstraintLayout 約束佈局。
本課程學習如何使用 Intent 傳遞整包資料。
本課程學習如何使用 Intent 從A頁跳到B頁,並傳遞資料。
Thumbnail
本課程學習如何使用 Intent 簡單跳頁,切換兩個 Activity。
Thumbnail
本課程學習如何在 Kotlin 程式碼檔案中,設定 ImageView 圖片元件,顯示本地端圖片。
Thumbnail
本課程介紹 Android API 版本,主要介紹關於 Android 版本名稱和 API 等級的對照表。
本課程學習如何使用 Android Studio 快速格式化程式碼技巧。良好的程式碼排版很重要,可以使程式碼易於閱讀和理解。
Thumbnail
本課程介紹開發 Android 手機應用程式所需的開發軟體。建議使用 Google 官方的開發軟體 Android Studio,因其提供完整的支援且免費。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
本課程瞭解為什麼要使用 ConstraintLayout 約束佈局。
本課程學習如何使用 Intent 傳遞整包資料。
本課程學習如何使用 Intent 從A頁跳到B頁,並傳遞資料。
Thumbnail
本課程學習如何使用 Intent 簡單跳頁,切換兩個 Activity。
Thumbnail
本課程學習如何在 Kotlin 程式碼檔案中,設定 ImageView 圖片元件,顯示本地端圖片。
Thumbnail
本課程介紹 Android API 版本,主要介紹關於 Android 版本名稱和 API 等級的對照表。
本課程學習如何使用 Android Studio 快速格式化程式碼技巧。良好的程式碼排版很重要,可以使程式碼易於閱讀和理解。
Thumbnail
本課程介紹開發 Android 手機應用程式所需的開發軟體。建議使用 Google 官方的開發軟體 Android Studio,因其提供完整的支援且免費。