2012-03-24 8 views
10

La documentazione (http://developer.android.com/guide/topics/manifest/manifest-element.html#uid) indica solo che non è possibile utilizzare stringhe non elaborate e il livello API è stato aggiunto, ma non spiega perché vorrei utilizzarlo. Se ho già impostato android: sharedUserID su "com.foo.bar" quale valore dovrei inserire nella stringa a cui fa riferimento android: sharedUserLabel e, soprattutto, perché !?Cos'è Android: sharedUserLabel e quale valore aggiunto aggiunge su android: sharedUserID?

Grazie

risposta

7

Per quanto ho capito dal AOSP in realtà si può usare questa etichetta solo per visualizzare un bel nome per un utente (se si dispone di più processi nella stessa uid). Per esempio, ecco una parte del codice nel file RunningState.java:

// If we couldn't get information about the overall 
    // process, try to find something about the uid. 
    String[] pkgs = pm.getPackagesForUid(mUid); 

    // If there is one package with this uid, that is what we want. 
    if (pkgs.length == 1) { 
     try { 
      ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0); 
      mDisplayLabel = ai.loadLabel(pm); 
      mLabel = mDisplayLabel.toString(); 
      mPackageInfo = ai; 
      return; 
     } catch (PackageManager.NameNotFoundException e) { 
     } 
    } 

    // If there are multiple, see if one gives us the official name 
    // for this uid. 
    for (String name : pkgs) { 
     try { 
      PackageInfo pi = pm.getPackageInfo(name, 0); 
      if (pi.sharedUserLabel != 0) { 
       CharSequence nm = pm.getText(name, 
         pi.sharedUserLabel, pi.applicationInfo); 
       if (nm != null) { 
        mDisplayLabel = nm; 
        mLabel = nm.toString(); 
        mPackageInfo = pi.applicationInfo; 
        return; 
       } 
      } 
     } catch (PackageManager.NameNotFoundException e) { 
     } 
    } 

Fondamentalmente, si fa le seguenti cose. All'inizio, cerca di ottenere informazioni sul processo complessivo. Se non ha trovato, cerca di ottenere informazioni usando UID dell'applicazione come parametro (questa è una parte del codice che ho fornito qui). Se c'è un solo pacchetto con questo UID, le informazioni sul processo sono tratte da questo pacchetto. Ma se ci sono diversi pacchetti (usando shareUserId) allora itera e prova a trovare il nome ufficiale (carino).

A conferma alle mie parole ho trovato la seguente stringa nel Mediaprovider:

<!-- Label to show to user for all apps using this UID. --> 
<string name="uid_label">Media</string> 

Così, tutti i processi che utilizza android:sharedUserId="android.media" avrà nome Media.

Non credo che questa funzione verrà utilizzata molto dagli sviluppatori ordinari ed è utile per loro.