我正在开发一个包含多个活动的Android应用程序。在其中我有一个类有几个静态方法。我希望能够从不同的活动中调用这些方法。我正在使用静态方法通过XmlResourceParser从xml文件加载数据。要创建XmlResourceParser,需要在Application Context上进行调用。所以我的问题是,将应用程序上下文引用到静态方法的最佳方法是什么?让每个Activity获取并传递它吗?以某种方式将它存储在全局变量中?
答案 0 :(得分:22)
更好的方法是将Activity对象作为参数传递给静态函数。
AFAIK,没有这样的方法可以在静态方法中为您提供应用程序上下文。
答案 1 :(得分:3)
我不确定这会一直有效但现在对我有用了:
public class myActivity extends ListActivity
{
public static Context baseContext;
public void onCreate(Bundle savedInstanceState)
{
baseContext = getBaseContext();
}
然后你可以在你的包装中使用静电:
myApplication.baseContext
答案 2 :(得分:2)
这可以让您从任何地方访问applicationContext
,这样您就可以在任何可以使用它的地方获得applicationContext
; Toast
,getString()
,sharedPreferences
等。我已经使用它来多次在静态方法中获取applicationContext
。
The Singleton:
package com.domain.packagename;
import android.content.Context;
/**
* Created by Versa on 10.09.15.
*/
public class ApplicationContextSingleton {
private static PrefsContextSingleton mInstance;
private Context context;
public static ApplicationContextSingleton getInstance() {
if (mInstance == null) mInstance = getSync();
return mInstance;
}
private static synchronized ApplicationContextSingleton getSync() {
if (mInstance == null) mInstance = new PrefsContextSingleton();
return mInstance;
}
public void initialize(Context context) {
this.context = context;
}
public Context getApplicationContext() {
return context;
}
}
在Application
子类中初始化Singleton:
package com.domain.packagename;
import android.app.Application;
/**
* Created by Versa on 25.08.15.
*/
public class mApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ApplicationContextSingleton.getInstance().initialize(this);
}
}
如果我没错,这会给你一个applicationContext到处的钩子,用ApplicationContextSingleton.getInstance.getApplicationContext();
调用它
你不应该在任何时候都清楚这一点,因为当应用程序关闭时,无论如何都是这样。
请务必更新AndroidManifest.xml
以使用此Application
子类:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.domain.packagename"
>
<application
android:allowBackup="true"
android:name=".mApplication" <!-- This is the important line -->
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:icon="@drawable/app_icon"
>
如果你在这里看到任何错误,请告诉我,谢谢。 :)
答案 3 :(得分:1)
在Sane Tricks For InsaneWorld博客中有一篇文章,并给出答案。 它表示您可以使用自己的子类替换Application对象,然后静态保留应用程序上下文。 您可以在帖子中找到示例代码。
原始博文 - http://uquery.blogspot.co.il/2011/08/how-to-get-application-context.html