2010-01-25 67 views
62

我注意到,當設置此報警的應用程序已升級時,報警被禁用。 這是真的嗎?如何知道我的Android應用程序已升級以重置鬧鐘?

到現在爲止,我用SharedPreferencesFIRST_RUN鍵來知道它是否是我的應用程序的第一次運行。如果我沒有找到這個鍵,我啓用鬧鐘並將FIRST_RUN設置爲false,否則我什麼也不做。

但我也注意到這些偏好在應用升級之間保持不變!

所以升級後,FIRST_RUN鍵已經是假的,所以我什麼都不做,而我的鬧鐘需要啓用。

如何處理這種情況?

在此先感謝

回答

55

我從來沒有嘗試過這個自己,但有關創建BroadcastReceiver偵聽到ACTION_PACKAGE_REPLACED意圖是什麼?

我以前想過嘗試過這個,但我不確定它是否存在雞與雞的問題(例如,在新升級的應用程序可以接收它之前發送意向?) 。值得一試,但。

+1

是它的工作原理進行註冊廣播接收器!謝謝丹尼爾,實際上這個意圖是在升級後發送的,所以我的接收器能夠抓住它。我只是想知道,如果我的接收器將在每次升級任何應用程序時觸發? – tbruyelle 2010-01-25 17:55:34

+1

它會在每次升級時觸發,但是在文檔中說它可以查看Intent的數據,它會告訴您包的名稱。因此,您可以使用意向過濾器來過濾掉所有不屬於您自己的軟件包替換。 – 2010-01-25 17:58:10

+1

該應用是否需要特殊權限才能收聽PACKAGE_REPLACED? – 2012-11-28 12:33:45

86

解決方案由丹尼爾·盧:

需要在清單如下的接收機:

<receiver android:name=".OnUpgradeReceiver"> 
    <intent-filter> 
    <action android:name="android.intent.action.PACKAGE_REPLACED" /> 
    <data android:scheme="package" android:path="your.app.package" /> 
    </intent-filter> 
</receiver> 

android:path爲了防止OnUpgradeReceiver用於通過任何任何升級觸發應用。

+7

路徑部分僅在該方案引用分層URI時使用。對於不包含層次結構URI的「包」,不能傳遞路徑字符串。但是,會將您的應用程序包附加到URI(「package:your.app.package」),因此您無需傳遞路徑。 – toc777 2012-04-09 17:37:07

+1

該應用程序是否需要特殊權限才能收聽PACKAGE_REPLACED? – 2012-11-28 12:34:04

+1

沒有應用程序不需要特別許可 – tbruyelle 2012-11-28 13:35:00

19

簡單地說,聽android.intent.action.MY_PACKAGE_REPLACED ...這INTENT會通知你,如果你的應用程序的新版本已經安裝在現有的一個

注意:此意圖可以是可從API開始12

+1

這應該是唯一推薦的解決方案。沒有辦法在API 19之前正確過濾本地應用程序的android.intent.action.PACKAGE_REPLACED,並且讓這個Intent觸發您的應用程序啓動對於每個應用程序安裝都是非常低效的。 – BladeCoder 2017-02-08 17:58:14

16

爲Android OS V12及以上,你需要用行動ACTION_MY_PACKAGE_REPLACED

<receiver android:name=".MyBroadcastReceiver"> 
    <intent-filter> 
    <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> 
    </intent-filter> 
</receiver> 
+0

如果您支持現代Android操作系統,這是正確的答案。對於大多數應用程序(薑餅在這個市場份額的1%),使用MY_PACKAGE_REPLACED簡化了廣播接收器代碼。 – 2017-01-20 22:12:24

相關問題