正确的方式来获得应用的实例中的Android
问题描述:
以下哪种方式是获取应用的实例更合适正确的方式来获得应用的实例中的Android
-
在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(); } }
-
创建这需要上下文作为PARAM静态方法和铸造的文脉,所有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如果你只有只有需要应用程序的实例。
我建议的方法1,如果你有在你的应用程序类的其他方法,因为可以更清晰地做
MyApplication.getInstance().foo();
方法2仅仅是方法3的快捷方式,所以我不会推荐它。
总而言之,这是一个偏好问题。没有一个“正确”的方式,因为他们都会工作。
答
如果你真的想Application
实例,那么你是两种方式都是错误的。这会在同时访问实例时导致锁定。因此,要克服这一点,并提高性能,最好使用
看看下面
public static MyApplication getInstance() {
if (sInstance == null) {
synchronized (MyApplication.class) {
if (sInstance == null) {
sInstance = new MyApplication();
}
}
}
return applicationInstance;
}
sInstance您在onCreate(...)
初始化的路上,我不明白这里的一件事。如果你真的想在'BroadcastReceiver'中设置'Context',那么'onReceive(Context context,...)'已经提供了第一个参数。使用那个。 –
我从来没有见过方式2,但它对我没有意义,因为如果你有一个上下文,你可以做getApplicationContext –