2010-12-22 3 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> 

리시버 :

public class AppUpdateReciever extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context con, Intent intent) { 

     //code..  
    } 

} 
+0

: 경로 '부분은 불필요합니다. – ThomasW

+0

필터에 경로를 제공하면 수신기에서 데이터를 다시 확인할 필요가 없습니다. [Intent and Filters] (https://developer.android.com/guide/components/intents-filters.html) 및 [필요한 인 텐트] (https://developer.android.com/reference/android/content)를 확인하십시오. /Intent.html#ACTION_PACKAGE_REPLACED) –

답변

35

이 onReceive 방법이 추가 :

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

편집 :에 등록하는 것이 참고 여기

는 (매니페스트) 내 코드입니다 ACTION_PACKAGE_REPLACED은 y를 발생시킵니다. 우리 앱이 아직 열리지 않았다면 앱이 업데이트 될 때마다 시작될 것입니다. API 12 이전에는 이것을 피하는 방법을 모르지만 API 12에서는 ACTION_MY_PACKAGE_REPLACED에 등록 할 수 있으므로 의도를 필터링 할 필요가 없으며 업데이트되는 다른 앱에 의해 불필요하게 시작되지 않습니다.

+0

현재 앱의 인 텐트에만 등록 할 방법이 없습니까? 구글 개발자 ("Dianne Hackborn")는 그것이 가능하다고 생각합니다 : http://osdir.com/ml/Android-Developers/2009-11/msg04736.html –

+0

그것은 길을 의미합니다. 그러나 결코 그것을 알아 내었다. Honeycomb에서'ACTION_MY_PACKAGE_REPLACED'를 사용하면 'ACTION_PACKAGE_REPLACED' 문제를 피할 수 있습니다 : http://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED – Tenfour04

+0

예,하지만 이전 버전을 찾을 수 없습니다. way, 그래서 내가 한 것은 두 가지 방법을 사용하는 fallback입니다. 여기에 나와 있습니다 : http://stackoverflow.com/a/21510561/878126. –

1

또는, 코드가 여러 응용 프로그램에 포함하거나 사용자들은 라이브러리에있는 경우 당신은 그냥 복사 할 수있는 무언가를 원하는 경우/편집없이 응용 프로그램 사이에 붙여 : 내 테스트는`안드로이드에서

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