如何在Android库中保存对Context对象的引用

时间:2014-06-12 14:11:04

标签: android android-library android-context

我正在尝试将我的第一个Android库作为练习。这是Google Cloud Messaging

的包装器

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

GCMLib.initialize(this);

此方法接受Context作为参数。稍后,Library会在Push(在Manifest中引入)中收到一个新BroadcastReceiver,我正在尝试在那里创建Notification,并使用{{{}检索目标应用程序的Icon和AppName字符串1}}。

到目前为止,我在静态助手类中持有对Context对象的引用:

Context

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

2 个答案:

答案 0 :(得分:1)

如果Context不需要绘制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()。这不会导致泄漏,因为Application是Singleton(只存在一个Application实例)。

要使用自定义Application对象,您需要更新清单,请参阅此链接以获取示例:http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/

答案 1 :(得分:0)

从应用程序扩展Context不是一个好主意。不确定上下文不是空的。如果您有服务,则应该/可能想要使用服务上下文。的意思是:

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类中保留引用绝不是一个好主意。如果你想要延迟加载,请创建自己的工厂。