2012-03-26 2 views
17

Wie wir wissen, Content-Provider lädt auf Anwendung ausgeführt. Aber ich möchte einige Operationen ausführen, bevor der Inhaltsanbieter gestartet wird. Wie erfasse ich diese Operation? Bevor onCreate Methode des Content-Provider genannt würdeWie kann ich Content Provider initialisieren?

Antwort

24

Ich denke, ich habe eine Lösung gefunden. Ive erstellt meine benutzerdefinierte Anwendungsklasse und außer Kraft gesetzt attachBaseContext Methode

<application android:name=".ApplicationController" ...> 

public class ApplicationController extends Application { 
    @Override 
    protected void attachBaseContext(Context base) { 
     super.attachBaseContext(base); 

     // some of your own operations before content provider will launch 
    } 
} 
+2

Das mag im Moment funktionieren, aber ich weiß nicht, ob es in allen Versionen zuverlässig sein wird. – CommonsWare

+0

Es hat über 17 apis überlebt)) Vielleicht in der Funktion Google wird uns irgendwelche Apis für diese Operation zur Verfügung stellen, aber für den Moment funktioniert es. Danke für deine Antwort! – pleerock

+1

Diese Lösung funktioniert, ist jedoch nicht voll funktionsfähig. Zum Beispiel gibt die 'Context.getMainLooper()' Methode 'null' zurück, wenn sie vor 'Application.onCreate() 'aufgerufen wird. – Michael

10

Aber ich möchte einige Operationen, bevor Content-Provider startet ... Bevor onCreate Methode des Content-Provider würde

AFAIK genannt werden, ist das nicht möglich. onCreate() Ihrer ContentProvider wird die erste Möglichkeit sein, die Sie Code ausführen müssen, Momente, nachdem Ihr Prozess verzweigt ist. Das passiert schon bevor onCreate() auf Application aufgerufen wird, wenn ich das richtig verstehe.

+0

ist es sehr traurig. Ich habe versucht, OnCreate der Anwendung zu überschreiben, aber es scheint, dass Content-Provider vor onCreate der Anwendung auch lädt. Danke für die Antwort. – pleerock

3

Meine Lösung Nutzung des call(Uri, String, String, Bundle) API erfordert (so, es ist nicht vollständig rückwärtskompatibel). Aber ich habe die Sachen, die ich die ContentProvider vorbereiten möchte, bevor es in meiner Überschreibung dieser call Methode verwendet wird. Dann mache ich getContentResolver().call(BASE_URI, METHOD, null, Bundle.EMPTY) in meinem Application.onCreate(). Im Wesentlichen, es wird dieses Zeug bis nach meinem Application wird erstellt, was wir erwartet, dass die ContentProvideronCreate natürlich tun.