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à.

È stato utile?

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 '.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top