【问题标题】:How to obtain AssetManager without reference to Context?不参考Context如何获取AssetManager?
【发布时间】:2010-12-10 15:23:23
【问题描述】:

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

澄清一下:我的课程旨在像库一样用于其他应用程序。它没有关联的AndroidManifest.xml 或对调用它的上下文的控制。

【问题讨论】:

    标签: android android-context


    【解决方案1】:
    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())。

    【讨论】:

    • 澄清一下,我的课程旨在像库一样用于其他应用程序。它没有关联的 AndroidManifest.xml。
    • 在这种情况下,在应用程序中创建资产管理器并将其传递给库(通过方法或构造函数)。
    • 考虑到我打算如何让其他开发人员在他们的应用程序中使用该库,我希望有一个替代方法来要求他们手动设置资产管理器。
    【解决方案2】:

    我不确定 OP 问题的最佳答案。但是,我知道在使用 Android developer resources 中建议的静态上下文时必须非常小心:

    在您的应用实例的onCreate() 方法中,将您的上下文(例如this)保存到名为app 的静态字段并创建一个返回此字段的静态方法,例如getApp():

    使用静态上下文可能会导致内存泄漏问题,尤其是在静态上下文用于引用视图时。

    【讨论】:

    • 在 Cristian 的回答中,这个问题对于应用程序实例本身没有实际意义,它是存储在 mContext 中的内容。应用实例与您的应用具有相同的生命周期;没有什么可以“泄露”的。 如果需要访问 UI,这个问题就变得很重要;在这种情况下,Activity 将作为上下文传递,重要的是让活动在 onPause 和 onDestroy 中再次调用“注销”自身。当需要 Activity 上下文时,请参阅stackoverflow.com/a/13994622/199364 了解此类技术。 static WeakReference<Context> mContext 也可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 2023-03-31
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多