2011-02-04 7 views
12

Sto scrivendo una classe di libreria per incapsulare alcune delle mie logiche nella mia prima app per Android. Una delle funzioni che voglio incapsulare è una funzione che interroga la rubrica. Come tale, ha bisogno di un ContentResolver. Sto cercando di capire come mantenere le funzioni della libreria in black box ... cioè, per evitare che ogni passaggio Activity nel proprio contesto ottenga un ContentResolver.Come posso chiamare getContentResolver in Android?

Problema è che non riesco per la vita di me a capire come ottenere un ContentResolver dalla mia funzione di libreria. Non riesco a trovare un'importazione che contenga getContentResolver. Googling ha detto di utilizzare getContext per ottenere un Context su cui chiamare getContentResolver, ma non riesco a trovare un'importazione contenente getContext. I post successivi dicono di usare getSystemService per ottenere un oggetto da chiamare getContext. MA - Non trovo nessuna importazione contenente getSystemService!

Quindi sono bloccato chiedendo, come posso ottenere un ContentResolver all'interno di una funzione di libreria incapsulata, o sono praticamente bloccato avendo ogni chiamata Activity passare in un riferimento al proprio contesto?

Il mio codice è qualcosa di fondamentalmente come questo:

public final class MyLibrary { 
    private MyLibrary() { } 

    // take MyGroupItem as a class representing a projection 
    // containing information from the address book groups 
    public static ArrayList<MyGroupItem> getGroups() { 
     // do work here that would access the contacts 
     // thus requiring the ContentResolver 
    } 
} 

getgroups è il metodo in cui stavo cercando di evitare di dover passare in un Context o ContentResolver se potessi, come speravo di averlo in modo pulito nero -boxed.

risposta

7

Ogni chiamata di funzione di libreria passa in un ContentResolver ... oppure estendere Application per mantenere un contesto e accedervi in ​​modo statico.

+0

Quali sarebbero eventuali altri effetti collaterali o "trucchi" dell'estensione dell '"Applicazione"? Ci sarebbe qualcosa che avrei bisogno di ripulire con un metodo distruttore o altro, o? – eidylon

+0

Ok, quindi sto provando a seguire questa strada. Ho una classe che "estende l'applicazione" e ho aggiunto il nome di classe completo come "android: name" nel file manifest dell'app. Così ora nella mia classe di biblioteca, sto cercando di chiamare 'getApplication()', ma non lo trova come metodo, e non mi fornisce suggerimenti per il refactoring dell'importazione necessaria da aggiungere. Come posso chiamare 'getApplication()' per far gestire l'app? – eidylon

+0

Non importa, ho capito. Grazie per l'aiuto! Saluti! – eidylon

2

Un po 'difficile senza vedere più di come si sta codificando la libreria, ma non vedo un'altra opzione per utilizzare il contesto e quindi passare tale quando si chiama quella classe.

Una classe "casuale" non ha l'ambiente per ottenere un contentresolver: è necessario un contesto.

Ora non è troppo strano passare effettivamente il contesto (attività) alla classe. Da http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

Su Android, un contesto viene utilizzato per molte operazioni, ma soprattutto per caricare e accedere alle risorse. Questo è il motivo per cui tutti i widget ricevono un parametro di contesto in il loro costruttore. In un'applicazione normale Android, di solito sono disponibili due tipi di contesto, attività e applicazione . Di solito è il primo quello che lo sviluppatore passa al classi e metodi che hanno bisogno di un contesto

(sottolineatura mia)

+0

Ho aggiornato con un piccolo snippet di codice che mostra cosa stavo cercando di fare. – eidylon

+0

Penso che passare il contesto in modo che tu possa usarlo per ottenere il contentresolver è la tua solluzione :) – Nanne

+0

non se ha solo bisogno del contentresolver ... – techiServices

5

Ecco come Finii per fare questo, per qualsiasi che può trovare questo thread in futuro:

Ho utilizzato il metodo sugarynugs per creare una classe che è stata extends Application e quindi aggiunto la registrazione appropriata nel file manifest dell'applicazione.Il codice per la mia classe di applicazione è quindi:

import android.app.Application; 
import android.content.ContentResolver; 
import android.content.Context; 

public class CoreLib extends Application { 
    private static CoreLib me; 

    public CoreLib() { 
     me = this; 
    } 

    public static Context Context() { 
     return me; 
    } 

    public static ContentResolver ContentResolver() { 
     return me.getContentResolver(); 
    } 
} 

Poi, per ottenere un ContentResolver nella mia classe biblioteca, il mio codice funzione è tale:

public static ArrayList<Group> getGroups(){ 
    ArrayList<Group> rv = new ArrayList<Group>(); 

    ContentResolver cr = CoreLib.ContentResolver(); 
    Cursor c = cr.query(
     Groups.CONTENT_SUMMARY_URI, 
     myProjection, 
     null, 
     null, 
     Groups.TITLE + " ASC" 
    ); 

    while(c.moveToNext()) { 
     rv.add(new Group(
      c.getInt(0), 
      c.getString(1), 
      c.getInt(2), 
      c.getInt(3), 
      c.getInt(4)) 
     );   
    } 

    return rv; 
} 
+1

Come puoi gestire i permessi per questo? Se vuoi limitare l'esposizione dei dati per alcune app che usano la tua libreria, come possiamo riuscirci? – Manohar

7

È possibile utilizzare in questo modo:

getApplicationContext().getContentResolver() with the proper context. 
getActivity().getContentResolver() with the proper context. 
Problemi correlati