以下哪种方式更适合获取Application
的实例在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();
}
}
创建静态方法,该方法将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);
}
}
答案 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)
应该是正确的方法