如何在没有上下文引用的情况下获取AssetManager?

22

我有一个类需要获取对其应用程序的 AssetManager 的引用。这个类不扩展任何android UI类,因此它没有 getContext() 方法或类似的内容。是否有某种静态的 Context.getCurrentApplicationContext() 类型的方法?

为了澄清:我的类旨在像一个库一样供其他应用程序使用。它没有关联的 AndroidManifest.xml 或控制调用它的上下文。

2个回答

27
  1. 创建一个继承自Application的子类,例如public class App extends Application {
  2. AndroidManifest.xml文件中的<application>标签的android:name属性设置为指向你的新类,例如android:name=".App"
  3. 在你的应用程序实例的onCreate()方法中,将上下文(例如this)保存到名为app的静态字段中,并创建一个返回该字段的静态方法,例如getApp():

如下所示:

public class App extends Application{

    private static Context mContext;

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

    public static Context getContext(){
        return mContext;
    }
}

现在您可以使用:App.getContext()来获取上下文,然后使用getAssetManager()(或者App.getContext().getAssetManager())。


1
澄清一下,我的类旨在像库一样供其他应用程序使用。它没有关联的AndroidManifest.xml文件。 - ab11
1
在这种情况下,在应用程序中创建资产管理器并将其传递给库(通过方法或构造函数)。 - Cristian
3
考虑到我希望图书馆能够被其他开发人员在他们的应用程序中使用,我希望有一种替代方法来避免要求他们手动设置资产管理器。 - ab11

7
我不确定对于OP的问题最佳答案是什么。然而,我知道当使用静态上下文时要非常小心,正如Android开发者资源中所建议的:在您的应用程序实例的onCreate() 方法中,将您的上下文(例如,this)保存到名为app的静态字段中,并创建一个返回此字段的静态方法,例如getApp()。如果静态上下文用于对视图的引用,则可能会出现内存泄漏问题。

1
这个问题对于应用程序实例本身是无关紧要的,因为它是存储在Cristian答案中的mContext。应用程序实例的生命周期与您的应用程序相同;没有任何东西会“泄漏”。如果需要访问UI,则此问题变得重要;在这种情况下,将作为上下文传递一个“Activity”,并且很重要的是在onPause和onDestroy中使活动进行另一个“取消注册”的调用。请参见https://dev59.com/nGgu5IYBdhLWcg3wUljt#13994622,了解需要Activity上下文时的技术。`static WeakReference<Context> mContext`也可能有所帮助。 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接