没有活动的Android上下文?和其他活动较少的编程?

没有活动的Android上下文?和其他活动较少的编程?,android,android-activity,gps,location,android-context,Android,Android Activity,Gps,Location,Android Context,我会尽力把这变成一个综合性的问题: 我正在编写一个方法来获取一个字符串,该字符串包含Android设备所在城市的名称,由LocationManager和getLastKnownLocation()以及所有这些决定 然后我意识到我需要在另一个活动中再次做同样的事情,那么为什么不创建一个完全独立的类(LocationFinder),我可以在我的程序中使用它,而不是在任何地方编写重复的代码呢 但我遇到了让我困惑的问题。例如,如果我创建了这个类(LocationFinder),它是否应该扩展活动,即使它

我会尽力把这变成一个综合性的问题:

我正在编写一个方法来获取一个字符串,该字符串包含Android设备所在城市的名称,由
LocationManager
getLastKnownLocation()
以及所有这些决定

然后我意识到我需要在另一个活动中再次做同样的事情,那么为什么不创建一个完全独立的类(
LocationFinder
),我可以在我的程序中使用它,而不是在任何地方编写重复的代码呢

但我遇到了让我困惑的问题。例如,如果我创建了这个类(
LocationFinder
),它是否应该扩展活动,即使它从未真正可视化过?这个类所要做的就是拥有各种getter,如
getlastnowncity()
getCurrentCity()
和返回字符串。我假设它不必扩展Activity类,因为它实际上不是一个Activity

但是,我使用什么样的上下文:

Geocoder geocoder = new Geocoder(Context context, Locale locale)
?

这让我认为这一定是一项活动。所以我扩展了活动,并用

@Override
protected void onCreate(..............
但出于某种原因,即使我把它放在

String city = new LocationFinder().getLastKnownCity();
我的
LocationFinder
onCreate()
的第一行是

System.out.println("HEY!")
甚至都没有达到这个目的。我在android.internal.os.LoggingPrintStream.println()和其他地方得到一个空指针


另外,还有一堆来自活动类的系统常量。例如,我需要在
位置获取服务
,这是一个字符串,如果不扩展活动,就无法获取该字符串。当然,我可以作弊,只输入文本字符串,但这感觉不对。

编辑:如果可能,使用frogmanx的答案。只有当他的答案无法使用时,才应使用此选项。(即需要即时上下文的单身汉。)

听起来你应该扩展而不是活动

使您的应用程序如下所示:

public class MyApplication extends Application {
    private static MyApplication instance;

    public MyApplication() {
        instance = this;
    }

    public static MyApplication getInstance() {
         return instance;
    }
然后将此属性添加到清单的应用程序标记:

 <application android:name=".your.package.MyApplication" ... />


在所有这些之后,您可以通过从任何地方调用
MyApplication.getInstance()
来获取上下文。

在构建类时,您可以拥有一个构造函数,该构造函数接收上下文并在类中为其分配一个本地上下文对象

public class LocationFinder {
     private Context myContext;
     private Geocoder geocoder;

     public LocationFinder(Context context)
     {
         myContext = context;
         geocoder = new Geocoder(myContext);
     }

}
然后,当您尝试访问该类时,请确保对其进行初始化,如下所示:

public class TestActivity extends Activity {
     protected void onCreate(Bundle savedInstanceState)
     {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
          LocationFinder lFinder = new LocationFinder(getApplication());
     }
}
当然,您不能从要运行的每个类访问上下文。因此,对视图的引用就足够了

LocationFinder lFinder = new LocationFinder(anyView.getApplication());
不,来自安卓系统

活动是用户可以做的一件专注的事情。几乎 所有活动都与用户交互,因此Activity类 为您创建一个窗口,您可以在其中使用 setContentView(视图)

将活动想象为用户看到的屏幕

但是我用什么样的上下文呢 Geocoder Geocoder=新的地理编码器(上下文、区域设置)

活动
类扩展了
上下文
,包括
应用程序在内的许多其他类也扩展了
上下文。上下文提供对与扩展上下文的类关联的资源的访问

当需要与与活动相关联的资源和具体活动类实现的方法进行交互时,您只需要并且应该只使用活动上下文。当您确实需要访问该上下文时,您将把它传递给需要访问的类,通常作为该类构造函数的参数

如果确实在扩展活动的活动之外传递了活动上下文,请确保引用的作用域和生命周期小于或等于扩展活动,否则,如果活动被破坏,您将泄漏大量内存,因为存在对上下文的引用,垃圾收集器无法释放内存

如果您查看Geocoder的构造函数,您将看到它将上下文作为参数,如您所知。说明中需要上下文的原因有一条线索:

     Geocoder(Context context, Locale locale)
Constructs a Geocoder whose responses will be localized for the given Locale.  [1]: 
需要上下文的原因是为了访问有关平台区域设置和当前系统区域设置的系统信息

因此,在您的示例中,只需将应用程序上下文传递给构造函数,就可以使用
getApplicationContext()

例如,我需要获取LOCATION_服务,这是一个字符串,如果不扩展活动,就无法获取该字符串


您可以从应用程序上下文获得它。

谢谢!只是想知道,在Geocoder中使用getApplicationContext()作为我的上下文(上下文…)是否不明智?其他人建议从实例化这个新类的活动中传入上下文,我不确定哪种方式是最好的。再次感谢。关键是,您是否需要从
地理编码器
访问您的
活动
?好的设计表明不会。如果需要将值传递给
活动
,请使用侦听器。您始终可以定义自己的
接口
来执行自定义回调,例如更新
文本视图
。使用应用程序上下文并没有什么“不好”的地方。它保证是单例的,并且在应用程序生命周期中始终存在,因此最好问“为什么我需要活动上下文”?谢谢!只是想知道,使用getApplicationContext()而不是像您建议的那样传递活动的上下文是否不好?我仍然缺乏对上下文的理解,即使我不断地阅读上下文的定义。。。我只是不明白是什么使一个活动的上下文与另一个不同。没错,当调用该活动的onDestroy时,对上下文的引用将被销毁。这不完全是我的问题,但你的回答帮助了我!ThanksAwesome+1正是我的情况,singleton需要一个上下文。T
     Geocoder(Context context, Locale locale)
Constructs a Geocoder whose responses will be localized for the given Locale.  [1]: