58 Stimmen

Wie verwendet man getSystemService in einer Nicht-Aktivitätsklasse?

Ich baue eine Anwendung, die einen Alarm über AlarmManager auslöst.

Ich möchte in der Lage sein, den Alarm über seine eigene Nicht-Activity-Klasse aufzurufen, aber da ich Activity nicht erweitere, habe ich anscheinend keinen "Kontext". Dieses Konzept verwirrt mich, und ich habe die SDK-Dokumente gelesen.

Wie würde ich vorgehen?

alarmTest = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

in meiner Nicht-Aktivitätsklasse?

Außerdem nehme ich an, immer Kontext wird mir erlauben, SharedPrefs und Intents in meinem nicht-Aktivität-Klasse als auch zu verwenden?

43voto

Marek Szanyi Punkte 2318

Sie können den Kontext an die Nicht-Aktivitätsklasse übergeben, was der bevorzugte Weg ist, oder Sie könnten den Basiskontext der Anwendung in ein Singleton kapseln, das Ihnen den Zugriff auf den Kontext überall innerhalb der Anwendung ermöglicht. In manchen Fällen mag dies eine gute Lösung sein, in anderen jedoch sicher nicht.

Wie auch immer, wenn Sie einen Alarm auslösen wollen über die AlarmManager Ich bin mir ziemlich sicher, dass der Alarm von einem der folgenden Elemente geerbt werden sollte Service oder besser noch von IntentService und in solchen Fällen haben Sie Zugang zum Kontext über this.getBaseContext() o this.getApplicationContext()

21voto

Jean Hominal Punkte 16038

Service y Activity erben von Context - wenn Sie also anrufen getSystemService in diesen Klassen, rufen Sie wirklich super.getSystemService .

Wenn Sie eine Context in einer anderen Klasse vorhanden ist, können Sie es als Argument an eine Methode dieser Klasse übergeben, einen Verweis darauf behalten usw.

Modifier : Code-Beispiel. Aber im Ernst, es ist extrem einfach - wenn Sie Vererbung und Methoden verstehen.

class MyActivity extends Activity { // Activity extends Context, so MyActivity also extends Context
  void someMethod() {
    MyOtherClass.useStaticContext(this);
    MyOtherClass instance = new MyOtherClass();
    instance.useInstanceContext(this.getApplicationContext());
  }
}
class MyOtherClass {
  static void useStaticContext(Context context) {
  }
  void useInstanceContext(Context context) {
  }
}

16voto

Kevin Parker Punkte 16483

Sie können Folgendes ausprobieren, um den aktuellen Kontext zu ermitteln, in dem die Ansicht ausgeführt wird.

alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE);

4voto

Ryan Reeves Punkte 10099

Sie müssen einen Kontext an die Nicht-Aktivitätsklasse übergeben.

1voto

dimvolk Punkte 308

Verwenden Sie dies in der Aktivität:

private Context context = this;

........
if(Utils.isInternetAvailable(context){
Utils.showToast(context, "toast");
}
..........

in Utils:

public class Utils {

    public static boolean isInternetAvailable(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected();
    }

    public static void showToast(Context context, String text) {
        Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.CENTER, 0, 0);
        toast.show();
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X