如何在非活动类(LocationManager)中使用getSystemService?

Kev*_*ker 171 android

我无法将主要活动OnCreate方法中的任务卸载到另一个类来完成繁重的工作.

当我尝试从非Activity类调用getSystemService时会抛出异常.

任何帮助将不胜感激 :)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Lab*_*lan 272

你需要将你的上下文传递给你的fyl类.
一个解决方案是为你的fyl类创建这样的构造函数:

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

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

       --
 }
}
Run Code Online (Sandbox Code Playgroud)

所以在你的activity类中,在onCreate函数中创建fyl的对象,如下所示:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便提一下,Android 管理器(`BluetoothManager`、`ActivityManager` 等)也被[构建](https://android.googlesource.com/platform/frameworks/base/+/742a67127366c376fdf188ff99ba30b27d3bf90c/core/java/android/app /ActivityManager.java#62) 那样(不一定将 `Activity` 上下文传递给它们的构造函数),这就是它们可以访问应用程序范围内的组件的原因。 (2认同)

Mad*_*ddy 45

你可以这样做:

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
Run Code Online (Sandbox Code Playgroud)

  • 对于类,getActivity()方法是未定义的.出现此错误. (3认同)
  • 我的工作是使用 getContext() 而不是 getActivity()! (3认同)

bre*_*njt 13

我解决这个问题的一种方法是为实例创建一个静态类.我在AS3中经常使用它我在android开发方面也很适合我.

Config.java

public final class Config {
    public static MyApp context = null;
}
Run Code Online (Sandbox Code Playgroud)

MyApp.java

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

        Config.context = this;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以访问上下文或使用 Config.context

LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = Config.context.getSystemService(context);
Run Code Online (Sandbox Code Playgroud)

  • 我用这种方法看到的问题是它留下了一些不受保护的东西,如果有人要为它分配null,可能会产生灾难性的失败? (3认同)
  • 对此的一个变体是在 MyApp 中放置一个私有静态,然后添加 getter。`private static MyApp _context;` `public static MyApp getContext() { return _context; } }` ...在onCreate中:`_context = this;`在onStop中:`_context = null;` ...用法:`MyApp.getContext()`。 (2认同)
  • 它可能会导致内存泄漏 (2认同)
  • 这绝对会导致内存泄漏。理想情况下,您不应使用此过程。 (2认同)