如何在Android库中保存对上下文对象的引用
我正在尝试制作我的第一个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应用程序中的任意位置调用:
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的引用(在某些特定情况下除外,如片段视图膨胀,因为膨胀器有自己的上下文),不让它静止。