ACTION_MY_PACKAGE_REPLACED not received

后端 未结 9 572
长发绾君心
长发绾君心 2020-12-08 00:59

I am using ACTION_MY_PACKAGE_REPLACED to receive when my app is updated or resinstalled. My problem is that the event is never triggered (I tried Eclipse and real device). T

相关标签:
9条回答
  • 2020-12-08 01:37

    Actually, your app will start twice when you install your apk. Once for each receiver that you have set.

    When you are Listening to android.intent.action.PACKAGE_REPLACED then you need to check for the package-name in the intent.getData()

    Note that intent.getData() will be Null when it is from android.intent.action.MY_PACKAGE_REPLACED

    I think using one of them is enough.

    0 讨论(0)
  • 2020-12-08 01:38

    for some reason, a google developer (named "Dianne Hackborn") thinks it is possible to register to the PACKAGE_REPLACED intent of the current app alone (read archived version here, original link here).

    however, i can't find any way of doing it correctly, so i've made a compromise: it will use the newest API when available.

    Sadly, I can't find out why it can't be debugged, but it does work (you can write to the log if you wish).

    here's the code:

    manifest:

        <receiver
            android:name=".OnUpgradeBroadcastReceiver"
            android:enabled="@bool/is_at_most_api_11" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REPLACED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>
        <receiver
            android:name=".OnUpgradeBroadcastReceiver"
            android:enabled="@bool/is_at_least_api_12" >
            <intent-filter>
                <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
            </intent-filter>
        </receiver>
    

    res/values/version_checks.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <item name="is_at_least_api_12" type="bool">false</item>
        <item name="is_at_most_api_11" type="bool">true</item>
    
    </resources>
    

    res/values-v12/version_checks.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <item name="is_at_least_api_12" type="bool">true</item>
        <item name="is_at_most_api_11" type="bool">false</item>
    
    </resources>
    

    OnUpgradeBroadcastReceiver.java

    public class OnUpgradeBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(final Context context, final Intent intent) {
            if (VERSION.SDK_INT <= VERSION_CODES.HONEYCOMB
                    && !context.getPackageName().equals(intent.getData().getSchemeSpecificPart())) {
                android.util.Log.d("AppLog", "other apps were upgraded");
                return;
            }
            android.util.Log.d("AppLog", "current app was upgraded");
    

    EDIT: In today's Android versions, when you should set minSdk to be at least 14, you don't need this, and indeed you should just use MY_PACKAGE_REPLACED and that's it. No need for the booleans etc...

    0 讨论(0)
  • 2020-12-08 01:38

    You need to add data scheme to the intent filter like below

    <receiver android:name=".MyEventReceiver" >
        <intent-filter android:priority="1000" >
            <action android:name="android.intent.action.ACTION_MY_PACKAGE_REPLACED" />
            <data android:scheme="package"/>
        </intent-filter>
    </receiver>
    
    0 讨论(0)
提交回复
热议问题