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

Ich habe Probleme, Aufgaben von der Hauptmethode “Activities OnCreate” auf eine andere class zu verlagern, um das Heavy Lifting durchzuführen.

Wenn ich versuche, getSystemService von der Nicht-Activity-class aufzurufen, wird eine Ausnahme ausgetriggers.

Jede Hilfe würde sehr geschätzt werden 🙂

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; } } 

Sie müssen Ihren Kontext an Ihre class weitergeben.
Eine Lösung ist, einen Konstruktor wie diesen für Ihre class zu fyl :

 public class fyl { Context mContext; public fyl(Context mContext) { this.mContext = mContext; } public Location getLocation() { -- locationManager = (LocationManager)mContext.getSystemService(context); -- } } 

Erstellen Sie in Ihrer Aktivitätsklasse das Objekt fyl in onCreate wie onCreate :

 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); } } 

Sie können dafür gehen:

 getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 

Eine Möglichkeit, die ich habe, ist, eine statische class für Instanzen zu erstellen. Ich habe es sehr oft in AS3 verwendet. Ich habe auch in der Android-Entwicklung gut mit mir gearbeitet.

Konfig.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 oder mit Config.context

 LocationManager locationManager; String context = Context.LOCATION_SERVICE; locationManager = Config.context.getSystemService(context); 

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

 LocationManager locationManager = (LocationManager) context.getSystemService(context.LOCATION_SERVICE); 
 (LocationManager) ((lmt) new Activity()).getSystemService(context); 

Probieren Sie diesen Code aus. Dies funktioniert nur, wenn Sie vor dem Aufrufen dieser Codezeile eine Aktivität gestartet haben. Da die Aktivität erstellt und ausgeführt werden muss.