如何在Android库中保存对上下文对象的引用

如何在Android库中保存对上下文对象的引用,android,android-library,android-context,Android,Android Library,Android Context,我正在尝试制作我的第一个android库作为实践。这是谷歌云消息的包装 假设此代码在Android应用程序中的任意位置调用: GCMLib.initialize(this); 此方法接受上下文作为参数。稍后库在BroadcastReceiver(在清单中介绍)中接收到一个新的Push,我试图在那里创建一个通知,并使用该上下文检索目标应用程序的图标和AppName字符串 到目前为止,我在一个静态帮助器类中持有对上下文对象的引用: public final class HelperClass {

我正在尝试制作我的第一个android库作为实践。这是
谷歌云消息的包装

假设此代码在Android应用程序中的任意位置调用:

GCMLib.initialize(this);
此方法接受上下文作为参数。稍后库在
BroadcastReceiver
(在清单中介绍)中接收到一个新的
Push
,我试图在那里创建一个
通知
,并使用该
上下文
检索目标应用程序的图标和AppName字符串

到目前为止,我在一个静态帮助器类中持有对
上下文
对象的引用:

public final class HelperClass {
private static Context appContext;

public static Context getAppContext() {
    return appContext;
}

public static void setAppContext(Context appContext) {
    HelperClass.appContext = appContext;
}
}

android库项目的标准模式是什么?

如果上下文不需要绘制UI或类似内容,即应用程序上下文就足够了,您可以执行以下操作:

public class MyApplication extends Application
{

    private MyApplication instance;

    @Override
    public void onCreate() {
        super.onCreate();
        this.instance = this;
    }

    public MyApplication getApplication() {
        return instance;
    }

}
现在可以调用有效上下文的
MyApplication.getApplication()
。这不会导致泄漏,因为应用程序是单实例(只存在一个应用程序实例)


要使用自定义应用程序对象,您需要更新清单,请参阅此链接以获取示例:

从应用程序扩展上下文不是一个好主意。不能保证上下文不是空的。如果您有服务,您应该/可能希望使用服务上下文。指:

onStartCommand() {
   if (aSingleTonObject.getContext() == null) {      
      this.aSingleTonObject.setContext(this);
 }
 return START_STICKY; 
}

public class aSingleTonClass {
private static Context context = null; 
public static getContext() {
  if (this.context == null) { 
  //assure that the service is still running and run it if not
    startService(...);
  }
}
}

在extends应用程序类中保留引用从来都不是一个好主意。如果您想要lazyloading,请创建自己的工厂。

我被告知,使用静态上下文变量可能会导致内存泄漏,因此建议尽可能获取对ApplicationContext的引用(在某些特定情况下除外,如片段视图膨胀,因为膨胀器有自己的上下文),不让它静止。