Как правильно отфильтровать пакет замененной трансляции - PullRequest
20 голосов
/ 23 декабря 2010

Я пытаюсь перехватить широковещательную рассылку для моего приложения и только для моего приложения, но по какой-то причине в моем приемнике я передаю рассылку для каждого обновляемого приложения. Я думал, что вам нужно только установить фильтр намерений в файле манифеста для вашего приложения, но, возможно, я ошибаюсь?

Вот мой код (манифест):

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

Ресивер:

public class AppUpdateReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context con, Intent intent) {

        //code..    
    }

}

Ответы [ 2 ]

35 голосов
/ 28 февраля 2011

Добавьте это в свой метод onReceive:

if (intent.getDataString().contains("com.my.app")){
    ...
}

EDIT: Обратите внимание, что регистрация на ACTION_PACKAGE_REPLACED приводит к тому, что ваше приложение запускается при каждом обновлении любого приложения, если оно еще не было открыто. Я не знаю, как этого избежать до API 12, но в API 12 вы можете зарегистрироваться на ACTION_MY_PACKAGE_REPLACED, чтобы вам не нужно было фильтровать намерения, и ваше приложение не будет без необходимости запускаться при обновлении других приложений.

1 голос
/ 29 июня 2013

В качестве альтернативы, если ваш код находится в библиотеке, включенной в несколько приложений, или если вы просто хотите что-то, что можно копировать / вставлять между приложениями без изменений:

int intentUid = intent.getExtras().getInt("android.intent.extra.UID");
int myUid = android.os.Process.myUid();
if (intentUid == myUid)
{
    ...
}
...