Как правильно фильтровать пакет, замененный трансляцией
Я пытаюсь поймать пакет, замененный трансляцией для моего приложения, и только мое приложение, но по какой-то причине в моем приемнике я трансляция для каждого обновляемого приложения. Я думал, вам нужно только установить фильтр намерений в файле манифеста в ваше приложение, но, может быть, я ошибаюсь?
Здесь мой код (манифест):
<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..
}
}
Ответы
Ответ 1
Добавьте это к методу onReceive:
if (intent.getDataString().contains("com.my.app")){
...
}
EDIT:
Обратите внимание, что регистрация для ACTION_PACKAGE_REPLACED
заставляет ваше приложение запускаться каждый раз, когда какое-либо приложение обновляется, если оно еще не открыто. Я не знаю, как избежать этого до API 12, но в API 12 вы можете зарегистрироваться для ACTION_MY_PACKAGE_REPLACED
, поэтому вам не нужно фильтровать намерение, и ваше приложение не будет запущено без необходимости другими обновляемыми приложениями.
Ответ 2
В качестве альтернативы, если ваш код находится в библиотеке, включенной в несколько приложений, или если вы просто хотите что-то, что можно скопировать/вставить между приложениями без изменений:
int intentUid = intent.getExtras().getInt("android.intent.extra.UID");
int myUid = android.os.Process.myUid();
if (intentUid == myUid)
{
...
}