2012-03-24 8 views
10

La documentación (http://developer.android.com/guide/topics/manifest/manifest-element.html#uid) solo indica que no puedo usar cadenas sin formato y el nivel de API que se agregó, pero no explica por qué me gustaría usarla. Si ya configuré android: sharedUserID en "com.foo.bar", ¿qué valor debo poner en la cadena a la que hace referencia android: sharedUserLabel, y lo más importante, ¿por qué?¿Qué es android: sharedUserLabel y qué valor agregado agrega en la parte superior de android: sharedUserID?

Gracias

Respuesta

7

Por lo que yo entiendo de los PSE en realidad se puede utilizar esta etiqueta sólo para mostrar un bonito nombre para un usuario (si tiene varios procesos en el mismo UID). Por ejemplo, aquí es una parte de código en el archivo 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) { 
     } 
    } 

Básicamente, se hace lo siguiente. Al principio, trata de obtener información sobre el proceso general. Si no ha encontrado, intenta obtener información usando el UID de la aplicación como parámetro (esta es una parte del código que he proporcionado aquí). Si solo hay un paquete con este UID, la información sobre el proceso se obtiene de este paquete. Pero si hay varios paquetes (que usan shareUserId), itera e intenta encontrar el nombre oficial (bonito).

Como confirmación de mis palabras me encontré con la siguiente cadena en Mediaprovider:

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

Por lo tanto, todo proceso que utiliza android:sharedUserId="android.media" tendrá nombre Media.

No creo que esta característica sea utilizada mucho por los desarrolladores comunes y es útil para ellos.

Cuestiones relacionadas