2010-12-22 69 views
20

我想抓取包换成我的应用程序广播和只有我的应用程序,但由于某种原因在我的接收器我是每个应用程序更新的广播。我以为你只需要将清单文件中的意图过滤器设置到你的应用程序,但也许我错了?如何正确过滤包装替换广播

这里是我的代码(清单):

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

} 
+0

从我的测试中,'机器人:路径“部分是不必要的。 – ThomasW 2016-09-27 02:15:49

+0

如果您在过滤器中提供路径,则不需要再次在接收器中检查数据。检查[意图和过滤](https://developer.android.com/guide/components/intents-filters.html)和[你可能需要的意图](https://developer.android.com/reference/android/content /Intent.html#ACTION_PACKAGE_REPLACED) – 2017-06-06 23:05:31

回答

35

添加到您的onReceive方法:

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

编辑: 注意,报名参加y原因是ACTION_PACKAGE_REPLACED我们的应用程序会在每次更新应用程序时启动,如果它尚未打开。我不知道如何在API 12之前避免这种情况,但在API 12中,您可以注册ACTION_MY_PACKAGE_REPLACED,这样您就不必过滤意图,并且不会由于更新其他应用程序而不必要地启动您的应用。

1

或者,如果你的代码是在一个库,该库包含在多个应用程序,或者如果你只是想要的东西,可以复制/应用程序之间粘贴无编辑:

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