【问题标题】:How to correctly filter Package replaced broadcast如何正确过滤包替换广播
【发布时间】:2011-05-29 16:01:55
【问题描述】:

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

这是我的代码(清单):

        <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..    
    }

}

【问题讨论】:

  • 根据我的测试,android:path 部分是不必要的。
  • 如果您在过滤器中提供路径,则无需在接收器中再次检查数据。检查Intent and Filtersintents you may need

标签: android broadcastreceiver broadcast intentfilter


【解决方案1】:

将此添加到您的 onReceive 方法中:

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

编辑: 请注意,注册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)
{
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    相关资源
    最近更新 更多