2013-06-21 7 views
6

Ho questo codice per ottenere un elenco di tutte le applicazioni sul sistema:Due app diverse possono avere lo stesso packageName?

PackageManager pm = getPackageManager(); 

    Intent mainIntent = new Intent(Intent.ACTION_MAIN); 

    List<ResolveInfo> installedApps = pm.queryIntentActivities(mainIntent, 0); 

    for(ResolveInfo elem : installedApps) { 
      String PackageName = elem.activityInfo.applicationInfo.packageName; 
      Log.i("TAG",PackageName); 
    } 

Ma il risultato in installedApps mostra molti PackageNames ripetuti. È possibile? È causa di un "fallimento" dell'intenzione o perché molte app packageNames hanno lo stesso nome?

risposta

11

È possibile?

Sicuro.

E 'perche' un 'fallimento' della intento

No, almeno non per la mia definizione di 'fallimento'.

o perché molte app nome pacchetto hanno lo stesso nome?

No.

è perché si sta interrogando per attività, non applicazioni. Un'applicazione può avere zero, uno, due o un milione di attività che rispondono a uno .

+0

Lezione appresa. Grazie! ;) – user2383054

5

No, ogni app dovrebbe avere un nome di pacchetto univoco. Se installi un'app con un nome di pacchetto che è già utilizzato in un'altra app installata, la sostituirà.

Quindi ci dovrebbero essere altri motivi. Un'ipotesi è queryIntentActivities Recupera tutte le attività che possono essere eseguite per il determinato intento. Quindi può restituire informazioni sulle attività con lo stesso nome del pacchetto.

Puoi provare a utilizzare il metodo getInstalledApplications. Restituirà un elenco di tutti i pacchetti applicativi installati sul dispositivo

+0

Grazie per le informazioni;) – user2383054

4

Ogni applicazione deve avere un nome di pacchetto uniqe. Per quotare da the API guide: "Il nome del pacchetto funge da identificatore univoco per l'applicazione" e "Una volta pubblicata l'applicazione, non è possibile modificare il nome del pacchetto. Il nome del pacchetto definisce l'identità della tua applicazione, quindi se la cambi, allora è considerata una diversa applicazione e gli utenti della versione precedente non possono aggiornarsi alla nuova versione. "

Si noti che avere più voci ACTION_MAIN in un singolo manifest è perfettamente valido in quanto rappresentano punti di ingresso alternativi nell'applicazione. Vedere this question per ulteriori informazioni.

+0

Grazie per la risposta! ;) – user2383054

0

Il nome del pacchetto si comporta come una struttura di cartelle. Lo si può vedere quando si entra nella cartella dati-> dati nel dispositivo o nell'emulatore, credo.

Abbiamo bisogno di cartelle diverse per applicazioni diverse?

Direi che è meglio essere così. Dal momento che non voglio che i file con lo stesso nome si sovrascrivano e creano comportamenti imprevisti o arresti anomali. Se sei sicuro che entrambe le applicazioni non abbiano uno scontro nei nomi delle classi, credo che sia stata la stessa cosa.

0

NO,

Attenzione: Una volta si pubblica l'applicazione, non è possibile modificare il nome del pacchetto. Il nome del pacchetto definisce l'identità della tua applicazione, quindi se la cambi, viene considerata un'applicazione diversa e gli utenti della versione precedente non possono aggiornarsi alla nuova versione.

Docs

Ma ci sono diversi punti di ingresso utilizzando intent-filtro in diverse attività differenti.

<intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 

PACKAGE NAME: un nome di pacchetto in stile Java completo per l'applicazione. Il nome dovrebbe essere unico. Il nome può contenere lettere maiuscole o minuscole (da 'A' a 'Z'), numeri e caratteri di sottolineatura ('_'). Tuttavia, le singole parti del nome del pacchetto possono iniziare solo con lettere. Per evitare conflitti con altri sviluppatori, è necessario utilizzare la proprietà del dominio Internet come base per i nomi dei pacchetti (al contrario). Ad esempio, le applicazioni pubblicate da Google iniziano con com.google. Non dovresti mai utilizzare lo spazio dei nomi com.example quando pubblichi le tue applicazioni.

Il nome del pacchetto funge da identificatore univoco dell'applicazione. È anche il nome predefinito per il processo di applicazione (vedere l'attributo di processo process dell'elemento) e l'affinità di attività predefinita di un'attività (vedere l'attributo taskAffinity dell'elemento <activity>).