2012-03-24 5 views
10

Die Dokumentation (http://developer.android.com/guide/topics/manifest/manifest-element.html#uid) besagt nur, dass ich keine rohen Strings und die API-Ebene, die es hinzugefügt wurde, verwenden kann, aber nicht erklären, warum ich es verwenden möchte. Wenn ich bereits android: sharedUserID auf "com.foo.bar" gesetzt habe, welchen Wert sollte ich in die Zeichenfolge von Android: sharedUserLabel, und vor allem warum !?Was ist android: sharedUserLabel und welchen Mehrwert fügt es auf Android hinzu: sharedUserID?

Danke

Antwort

7

Soweit ich aus der AOSP wirklich verstehen Sie dieses Label nur an einen Benutzer einen hübschen Namen (wenn Sie mehrere Prozesse in der gleichen uid haben) können angezeigt werden soll. Zum Beispiel ist hier ein Teil des Codes in der RunningState.java Datei:

// 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) { 
     } 
    } 

Grundsätzlich tut es die folgenden Dinge. Zunächst versucht es Informationen über den Gesamtprozess zu erhalten. Wenn es nicht gefunden wird, versucht es Informationen über die UID der Anwendung als Parameter zu erhalten (dies ist ein Teil des Codes, den ich hier angegeben habe). Wenn es nur ein Paket mit dieser UID gibt, werden die Informationen über den Prozess von diesem Paket erhalten. Aber wenn es mehrere Pakete gibt (mit shareUserId), iteriert es und versucht den offiziellen (hübschen) Namen zu finden.

Als Bestätigung meiner Worte fand ich die folgende Zeichenfolge in MediaProvider:

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

So alle Prozess, der android:sharedUserId="android.media" Namen Media wird verwendet.

Ich denke nicht, dass diese Funktion von normalen Entwicklern verwendet wird und für sie nützlich ist.