Wie kann ich getSystemService in einer Nicht-Aktivitätsklasse (LocationManager) verwenden?

180

Ich habe Probleme, Aufgaben von der Hauptmethode "Aktivitäten OnCreate" in eine andere Klasse zu verlagern, um das schwere Heben durchzuführen.

Wenn ich versuche, getSystemService aus der Nicht-Aktivitätsklasse aufzurufen, wird eine Ausnahme ausgelöst.

Jede Hilfe wäre sehr dankbar :)

lmt.java:

package com.atClass.lmt;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.location.Location;

public class lmt extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        fyl lfyl = new fyl();
        Location location = lfyl.getLocation();
        String latLongString = lfyl.updateWithNewLocation(location);

        TextView myLocationText = (TextView)findViewById(R.id.myLocationText);
        myLocationText.setText("Your current position is:\n" + latLongString);
    }
}

fyl.java

package com.atClass.lmt;

import android.app.Activity;
import android.os.Bundle;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.content.Context;

public class fyl {
    public Location getLocation(){
        LocationManager locationManager;
        String context = Context.LOCATION_SERVICE;
        locationManager = (LocationManager)getSystemService(context);

        String provider = LocationManager.GPS_PROVIDER;
        Location location = locationManager.getLastKnownLocation(provider);

        return location;
    }

    public String updateWithNewLocation(Location location) {
        String latLongString;

        if (location != null){
            double lat = location.getLatitude();
            double lng = location.getLongitude();
            latLongString = "Lat:" + lat + "\nLong:" + lng;
        }else{
            latLongString = "No Location";
        }

        return latLongString;
    }
}
Kevin Parker
quelle
2
Das Hinzufügen der Ausnahme und der Stapelverfolgung zur Frage kann potenziellen Antwortenden helfen
Bert F
Hallo, Entschuldigung für den Fehler. Die Ausnahme wird ausgelöst, wenn ich versuche, die Aktivitätsklasse mit dieser zu erweitern. Ich möchte die Activity-Klasse für diese Klasse nicht erweitern und möchte einfach getSystemService über meine getLocation-Methode aufrufen können. Ausnahme: java.lang.IllegalStateException: Systemdienste für Aktivitäten vor onCreate () nicht verfügbar
Kevin Parker

Antworten:

280

Sie müssen Ihren Kontext an Ihre fyl-Klasse übergeben.
Eine Lösung besteht darin, einen Konstruktor wie diesen für Ihre fylKlasse zu erstellen :

public class fyl {
 Context mContext;
 public fyl(Context mContext) {
       this.mContext = mContext;
 }

 public Location getLocation() {
       --
       locationManager = (LocationManager)mContext.getSystemService(context);

       --
 }
}

Erstellen Sie also in Ihrer Aktivitätsklasse das Objekt von fyl in folgender onCreateFunktion:

package com.atClass.lmt;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.location.Location;

public class lmt extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        fyl lfyl = new fyl(this); //Here the context is passing 

        Location location = lfyl.getLocation();
        String latLongString = lfyl.updateWithNewLocation(location);

        TextView myLocationText = (TextView)findViewById(R.id.myLocationText);
        myLocationText.setText("Your current position is:\n" + latLongString);
    }
}
Labeeb Panampullan
quelle
Entschuldigung, ich verstehe es nicht, Code wäre hilfreicher. Wenn ich ein LocationManager-Objekt an die getLocation-Methode übergeben sollte ... Ich sehe nicht wirklich, wie das Übergeben des Kontexts an die Methode hilfreich ist, wenn ich getSystemService nicht einmal aufrufen kann, ohne diese Klasse als erweiterte Klasse an Activity zu schreiben.
Kevin Parker
Hast du das versucht? In der onCreate, wenn Sie übergeben, greifen Sie auf den Kontext von 'this' zu
Labeeb Panampullan
Aber wenn die lmtKlasse nicht ausgeführt wird, hat sie flykeinen Kontext
Hunt
Übrigens getSysytemService()akzeptiert nur Stringals Parameter. Daher können Sie ihm keinen Kontext übergeben. Wie komme ich darum herum? @ Hunt
Parth Sane
2
Nur zu erwähnen, Android Manager ( BluetoothManager, ActivityManageretc.) werden ebenfalls konstruiert , dass Art und Weise (nicht unbedingt einen Übergang ActivityKontext zu ihrem Konstruktor) und das ist , warum sie Komponenten in Anwendungsbereich zugreifen können.
Eido95
46

Sie können dies tun:

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
Maddy
quelle
5
Die Methode getActivity () ist für die Klasse nicht definiert. Dieser Fehler wird angezeigt.
Darpan
In welchem ​​Klassentyp verwenden Sie es? dh es ist eine Empfängerklasse, ein Fragment, eine einfache Java-Klasse oder eine andere.
Maddy
Sie müssen Ihre Aktivität mit FreagementActivity anstelle einer Aktivität erweitern. Ich hoffe es wird für dich funktionieren ...?
Maddy
Es funktioniert nicht für eine einfache Klasse, in der ich erweitern möchte ArrayAdapter.
David Silva-Barrera
2
MIne arbeitete mit getContext () anstelle von getActivity ()!
Amir
16

Eine Möglichkeit, dies zu umgehen, besteht darin, eine statische Klasse für Instanzen zu erstellen. Ich habe es oft in AS3 verwendet. Ich habe auch in der Android-Entwicklung großartig für mich gearbeitet.

Config.java

public final class Config {
    public static MyApp context = null;
}

MyApp.java

public class MyApp extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Config.context = this;
    }
    ...
}

Sie können dann auf den Kontext zugreifen oder ihn verwenden Config.context

LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = Config.context.getSystemService(context);
brenjt
quelle
4
Das Problem, das ich bei dieser Methode sehe, ist, dass etwas ungeschützt bleibt, das, wenn jemand ihm Null zuweisen würde, wahrscheinlich einen katastrophalen Fehler verursachen würde.
Rob
2
Eine Variation davon besteht darin, eine private Statik in MyApp einzufügen und dann Getter hinzuzufügen. private static MyApp _context; public static MyApp getContext() { return _context; }... in onCreate: _context = this; in onStop: _context = null;... Verwendung : MyApp.getContext().
ToolmakerSteve
2
Es kann zu einem Speicherverlust führen
Yat3s
2
Dies führt absolut zu einem Speicherverlust. Idealerweise sollten Sie diesen Prozess nicht verwenden.
Anfänger
0

Ich weiß nicht, ob das helfen wird, aber ich habe Folgendes getan:

LocationManager locationManager  = (LocationManager) context.getSystemService(context.LOCATION_SERVICE);
Ruchir Baronia
quelle
Der richtige Weg ist, statisch zu verwenden, wie @Maddy sagt
russellhoff
0

Für einige Nicht-Aktivitätsklassen wie Worker erhalten Sie bereits ein Context-Objekt im öffentlichen Konstruktor.

Worker(Context context, WorkerParameters workerParams)

Sie können dies einfach verwenden, z. B. in einer privaten Kontextvariablen in der Klasse (z. B.) speichern mContextund dann beispielsweise

mContext.getSystenService(Context.ACTIVITY_SERVICE)
verheißungsvoll99
quelle