Come fa un ContentResolver individuare il corrispondente ContentProvider?
-
26-09-2019 - |
Domanda
Questa è una domanda magica profonda. Capisco che una chiamata a un metodo ContentResolver prende un URI specifico al ContentProvider, ma come fa Android effettivamente rendere l'associazione?
Sono indovinando che qualsiasi URI corrispondenti all'autorità fornito con il ContentProvider nel AndroidManifest.xml è coinvolto. È la richiesta inviata a tutti i provider contenente tale autorità? Se provo a creare provider la cui autorità prefissi un'altra autorità sarà che essere un problema?
C'è un modo per vedere se il ContentProvider è in esecuzione? Sto pensando che forse una risposta fittizio sul getType () metodo indicherebbe vitalità.
Soluzione
Classe ContentResolver
mantiene una mappatura da autorità Content alle classi ContentProvider
. I dati per la mappatura che deriva dagli elementi <provider>
di file AndroidManifest.xml le varie applicazioni installate. ContentResolver utilizza questa mappatura per identificare quale classe provider è quello giusto da usare per un determinato URI che viene in. Pensate ContentResolver come una specie di DNS. Si capisce quale server (provider) è quella giusta per rispondere alla vostra domanda.
Un solo ContentProvider corrisponderà, perché contentAuthorities (la parte "nome a dominio" del contenuto: tipo di URI) sono tenuti a essere unico. Essi non sono gerarchici. trattarli come una stringa univoca che deve corrispondere esattamente. Il motivo per cui guardano gerarchico è quello di consentire un modo semplice di garantire unicità, simile al modo in cui i nomi dei pacchetti Java sono garantiti per essere unico.
Per la 'Descrizione:" la sezione per la documentazione tag :
L'Android contenuti sistema identifica fornitori da parte di una parte dell'autorità contenuti: URI. Per esempio, supponiamo che il seguente URI è passato a ContentResolver.query ():
content://com.example.project.healthcareprovider/nurses/rn
Il contenuto: identifica i schema dati come appartenenti ad un contenuto fornitore e l'autorità (Com.example.project.healthcareprovider) identifica il fornitore particolare. L'Autorità ha pertanto deve essere unico. Tipicamente, come in questo esempio, è il nome completo di un ContentProvider sottoclasse. Il sentiero parte di un URI può essere utilizzato da un contenuto fornitore per identificare i dati particolari sottoinsiemi, ma quei sentieri non sono dichiarato nel manifesto
Per quanto riguarda ciò che accade quando si effettua un provider con un contentAuthority che è identico a un altro ... Beh, le interruzioni di roba. In particolare, si rifiuterà di installare qualsiasi pacchetto va avanti secondo, dicendo:
WARN / PackageManager: Impossibile installare perché il nome del fornitore com.xxx.Provider (In pacchetto com.xxx) è già utilizzato da com.zzz
Quindi .... non farlo.
Non v'è alcun modo per vedere se il ContentProvider è in esecuzione. E 'avviato e arrestato automaticamente dal ContentResolver come necessario. Quando si inizia a fare le richieste per una specifica contentAuthority, il provider associato sarà avviato se non è già in esecuzione. Si sarà fermato automaticamente ContentResolver, qualche tempo dopo, una volta che si è seduto inattivo e sembra che potrebbe non essere necessario per un po '.