【问题标题】:Correct way to get the instance of Application in android在android中获取Application实例的正确方法
【发布时间】:2016-06-16 08:38:21
【问题描述】:

以下哪种方式更适合获取Application的实例

  1. 初始化 Application.onCreate() 中的静态字段并提供对其的静态访问

    public class MyApplication extends Application {
    
        private static MyApplication sInstance;
    
        @Override
        public void onCreate() {
            super.onCreate();
            sInstance = this;
        }
    
        public static MyApplication getInstance() {
            return MyApplication.sInstance;
        }
    }
    
    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            MyApplication application = MyApplication.getInstance();
        }
    }
    
  2. 创建以 Context 作为参数的静态方法并将该 Context 转换为 MyApplication

    public class MyApplication extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
        }
    
        public static MyApplication getInstance(Context context) {
            return ((MyApplication) context.getApplicationContext());
        }
    }
    
    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            MyApplication application = MyApplication.getInstance(context);
        }
    } 
    

【问题讨论】:

  • 我不明白这里的一件事。如果您真的想要BroadcastReceiver 中的Context,那么onReceive(Context context,...) 已经作为第一个参数提供。使用那个。
  • 我从未见过方式 2,但这对我来说没有意义,因为如果你有一个上下文,你可以做 getApplicationContext

标签: android applicationcontext


【解决方案1】:
(getActivity().getApplication() as MyApplication)

这将返回 MyApplication 的实例

【讨论】:

    【解决方案2】:

    (getActivity().getApplication() instanceOf MyApplication)应该是正确的方式

    【讨论】:

    • 您的代码返回真或假,而不是应用程序实例
    【解决方案3】:

    如果您需要应用程序的实例,我会推荐方法 3。

    如果您的 Application 类中有其他方法,我会推荐方法 1,因为您可以更清楚地做到这一点

    MyApplication.getInstance().foo();
    

    方法 2 只是方法 3 的一个捷径,所以我不推荐它。


    总而言之,这是一个偏好问题。没有一种“正确”的方法,因为它们都会起作用。

    【讨论】:

    • 将上下文和应用程序实例设为静态不是一个好方法。这可能会泄漏内存。
    • @Mohit 随意写下你自己的答案,然后
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2021-06-16
    相关资源
    最近更新 更多