How to correctly filter Package replaced broadcast
I am trying to catch the package replaced broadcast for my app and only my app, but for some reason in my reciever I am the broadcast for every app that is updated. I thought you only needed to set the intent filter in the manifest file to your app, but maybe I am wrong?
Here's my code(manifest):
<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>
Reciever:
public class AppUpdateReciever extends BroadcastReceiver {
@Override
public void onRece开发者_如何学Goive(Context con, Intent intent) {
//code..
}
}
Add this to your onReceive method:
if (intent.getDataString().contains("com.my.app")){
...
}
EDIT:
Note that registering for ACTION_PACKAGE_REPLACED
causes your app to be started up every time any app is updated, if it wasn't already open. I don't know how to avoid this before API 12, but in API 12 you can register for ACTION_MY_PACKAGE_REPLACED
so you don't have to filter the intent and your app won't be started unnecessarily by other apps being updated.
Alternately, if your code is in a library that's included in multiple apps, or if you just want something that can be copy/pasted between apps without edits:
int intentUid = intent.getExtras().getInt("android.intent.extra.UID");
int myUid = android.os.Process.myUid();
if (intentUid == myUid)
{
...
}
精彩评论