【问题标题】:Is it possible to get application's context in an Android Library Project?是否可以在 Android 库项目中获取应用程序的上下文?
【发布时间】:2011-11-01 17:14:23
【问题描述】:

我想在我的库项目的一个类中获取在运行时引用/托管我的库的应用程序的上下文。可能吗?如果是,怎么做?

谢谢

更新 我不希望我的用户将参数中的上下文传递给我的库项目,因为我的库项目可能会通过 JNI 调用,而我不知道如何在 JNI 中获取上下文并将其传递给 Java 层。

【问题讨论】:

  • getApplicationContext()?
  • 如果你在其他项目中使用你的库,你的库的上下文将是项目的上下文。你想对上下文做什么?
  • @Aracem:我需要库项目中的上下文来执行某些操作,但我不想要求用户在某些参数中显式传递上下文。如何在我的库中独立获取当前应用程序的上下文?
  • 不,我的课程不要扩展活动,它是一个简单的普通课程
  • @Haris 如果你的类是普通类,你需要显式地传入上下文。

标签: android android-context android-library


【解决方案1】:

还有一种方法,在你的库项目中添加应用类:

/**
 * Base class for those who need to maintain global application state.
 */
public class LibApp extends Application {

  /** Instance of the current application. */
  private static LibApp instance;

  /**
   * Constructor.
   */
  public LibApp() {
    instance = this;
  }

  /**
   * Gets the application context.
   * 
   * @return the application context
   */
  public static Context getContext() {
    return instance;
  }

}

然后在你的常规项目中让真正的应用程序类扩展 LibApp:

/**
 * Base class for those who need to maintain global application state.
 */
public class App extends LibApp {

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

}

确保您在 AndroidManifest 中定义了“名称”:

<application android:name="App" ...>

并且您的 App 类在基础包中。

然后您可以使用 LibApp.getContext() 您的库项目来获取正在使用该库的应用程序的应用程序上下文。

这可能不是一个好的解决方案,但它对我有用。 我分享它是因为它可能对其他人有用。

【讨论】:

  • 嗨!对不起,但我认为这个答案有不同的意义。 @Haris-Hasan 想要的是从库内部访问库外部的类。也许库中的一个方法想要访问继承类的资源或类似的东西。无论如何,您的答案是单身人士的好答案:P
  • 他说:“我想在我的库项目的一个类中获取在运行时引用/托管我的库的应用程序的上下文。有可能吗?如果可以,怎么做?”这段代码正是这样做的,它可以访问正在使用该库的应用程序的上下文。
  • 我想这是一个解释问题。我有你在我自己的库中发布的相同代码,它解决了这个问题......如果你可以从你的库中定义你的类。我认为哈里斯-哈桑想从图书馆内访问“任何东西”。无论如何,最简单的方法(如果可以的话)就是你的答案,@peceps。一个通用的答案可能意味着反思?
  • 对不起,这个应用程序类需要在基础包中吗?
  • 强制库的用户从你的类继承Application 是一种不好的做法——它会产生多重继承问题,并且需要创建额外的类来集成库。这里最好的方法是使用某种init 方法,该方法将具有Context 参数
【解决方案2】:

有可能吗?

是的。

如果是,怎么做?

作为参数传入。

我不希望我的用户将参数中的上下文传递给我的库项目,因为我的库项目可能会通过 JNI 调用,我不知道如何在 JNI 中获取上下文并将其传递给 Java 层.

然后弄清楚“[您]如何在 JNI 中获取上下文并将其传递给 Java 层”。我想你会像传递任何其他对象一样传递它。正如@Blundell 指出的那样,您实际上没有任何其他选择。

【讨论】:

  • :) 所以简而言之,在 android 库项目中无法独立获取应用程序上下文
  • 是的,对于扩展应用程序或活动的类是可能的。对于普通的 Android 项目或库项目中的任何普通 Java 类包括,不可能独立。正如我们一直说的那样,您必须将其作为参数传递
【解决方案3】:

在jni中还有另外一种获取context的方式,既不是传参数也不是自己保存context,而是使用android api。 我发现有一个类名为:

  • android.app.AppGlobals

在源代码中。还有静态函数

  • getInitialApplication

    可以返回一个Application 对象。但它必须在主线程中调用,并且该类是隐藏的。 无论如何,您可以通过在 java 中反射来使用它。您可以使用FindClass()FindStaticObjectMethod() 找出方法并使用它。 希望对您有所帮助。

【讨论】:

  • 伙伴,你现在是我的个人英雄。非常感谢你。我正在为持久性任务制作一个 Android 库,该库应该完全可重用,而无需从项目到库的任何依赖,所以我不能真的只是在我的库中创建一个 Application 类并将其硬编码到我的清单中,这将完全破坏当我想将库移植到其他项目时,可重用性和导致不兼容问题。此外,我计划尽快作为开源发布,这意味着它不能强迫其他人使用库 Application 类。谢谢
  • 访问隐藏类是being blocked on Android 9.0+
【解决方案4】:

我会将它作为参数传递或在该库中传递一个单例。

让主应用程序扩展库的应用程序类是一个坏主意,因为在 java 中你只能从一个类扩展一次。如果您的应用程序需要传递到另一个库,您将遇到麻烦。

【讨论】:

    【解决方案5】:

    根据this post,您可以借助ContentProvider,让库使用应用程序上下文自动初始化。

    无论如何都要小心,如post comments 中所述,在加载时间和即时运行方面可能存在缺陷,以及多进程应用程序崩溃。

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2013-12-26
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多