在android中获取Application实例的正确方法

时间:2016-03-03 06:51:50

标签: android applicationcontext

以下哪种方式更适合获取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);
        }
    } 
    

3 个答案:

答案 0 :(得分:2)

如果需要应用程序的实例,我建议使用方法3。

如果您在Application类中有其他方法,我建议使用方法1,因为您可以更清楚地执行

MyApplication.getInstance().foo();

方法2只是方法3的快捷方式,所以我不推荐它。

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

答案 1 :(得分:1)

如果你真的想要Application实例,那么你们两种方式都是错误的。这将导致在同时访问实例时锁定。因此,要更好地使用synchronized

来克服这种情况并提高性能

看看下面的方式

  public static MyApplication getInstance() {
    if (sInstance == null) {
        synchronized (MyApplication.class) {
            if (sInstance == null) {
                sInstance = new MyApplication();
            }
        }
    }

    return applicationInstance;
}
您在onCreate(...)

中初始化的

sInstance

答案 2 :(得分:-3)

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