2010-12-22 5 views
20

Estoy tratando de detectar el paquete reemplazado para mi aplicación y solo mi aplicación, pero por alguna razón en mi receptor, soy la transmisión de cada aplicación que se actualiza. Pensé que solo necesitabas configurar el filtro de intención en el archivo de manifiesto en tu aplicación, pero ¿quizás estoy equivocado?Cómo filtrar correctamente Transmisión reemplazada de paquete

Aquí está mi código (manifiesto):

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

Receptor:

public class AppUpdateReciever extends BroadcastReceiver { 

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

     //code..  
    } 

} 
+0

De mis pruebas, el 'androide: la porción de ruta no es necesaria. – ThomasW

+0

Si proporciona la ruta en el filtro, entonces no es necesario volver a verificar los datos en el receptor. Compruebe [Intención y filtros] (https://developer.android.com/guide/components/intents-filters.html) y [intenciones que puede necesitar] (https://developer.android.com/reference/android/content /Intent.html#ACTION_PACKAGE_REPLACED) –

Respuesta

35

Agregar a su método OnReceive:

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

EDIT: Nota que el registro de ACTION_PACKAGE_REPLACED causa y nuestra aplicación se iniciará cada vez que se actualice una aplicación, si no estuviera abierta. No sé cómo evitar esto antes de API 12, pero en API 12 puede registrarse para ACTION_MY_PACKAGE_REPLACED, por lo que no tiene que filtrar el intento y otras aplicaciones que se actualizan no iniciarán innecesariamente.

+0

por lo que no hay forma de registrarse solo para los intentos de la aplicación actual? parece que un desarrollador de Google (llamado "Dianne Hackborn") piensa que es posible: http://osdir.com/ml/Android-Developers/2009-11/msg04736.html –

+0

Eso implica que había una manera, pero nunca Lo averigué. En Honeycomb, puede usar 'ACTION_MY_PACKAGE_REPLACED' para evitar el problema con' ACTION_PACKAGE_REPLACED': http://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED – Tenfour04

+0

sí, pero no puedo encontrar el anterior Así que lo que hice fue una alternativa que usa ambos métodos, como lo he mostrado aquí: http://stackoverflow.com/a/21510561/878126. –

1

Alternativamente, si el código está en una biblioteca que se incluye en múltiples aplicaciones, o si lo que desea es algo que puede ser copiar/pegar entre aplicaciones sin ediciones:

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