将应用程序上下文转换为Android中的静态方法的最佳方法

时间:2010-05-07 01:43:12

标签: android android-context

我正在开发一个包含多个活动的Android应用程序。在其中我有一个类有几个静态方法。我希望能够从不同的活动中调用这些方法。我正在使用静态方法通过XmlResourceParser从xml文件加载数据。要创建XmlResourceParser,需要在Application Context上进行调用。所以我的问题是,将应用程序上下文引用到静态方法的最佳方法是什么?让每个Activity获取并传递它吗?以某种方式将它存储在全局变量中?

4 个答案:

答案 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; ToastgetString()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