如何正确过滤包替换广播

时间:2010-12-22 21:17:13

标签: android broadcastreceiver broadcast intentfilter

我正在尝试抓住我的应用程序和我的应用程序替换广播的包,但由于某些原因,在我的接收器中,我是每个更新的应用程序的广播。我以为你只需要将清单文件中的intent过滤器设置到你的应用程序,但也许我错了?

这是我的代码(清单):

        <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 onReceive(Context con, Intent intent) {

        //code..    
    }

}

2 个答案:

答案 0 :(得分:35)

将此添加到onReceive方法:

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

修改 请注意,注册ACTION_PACKAGE_REPLACED会导致您的应用每次更新任何应用时都会启动,如果它尚未打开。我不知道如何在API 12之前避免这种情况,但在API 12中,您可以注册ACTION_MY_PACKAGE_REPLACED,这样您就不必过滤意图,并且不会被其他正在更新的应用程序不必要地启动您的应用程序

答案 1 :(得分:1)

或者,如果您的代码位于多个应用中包含的库中,或者您只是想要一些可以在应用之间复制/粘贴而无需编辑的内容:

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