2010-12-22 21 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) 
{ 
    ... 
}