在安卓中获取Application实例的正确方式

15
哪种方法更适合获取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();
        }
    }
    
    创建一个静态方法,该方法接受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,...)已经作为第一个参数提供了。请使用它。 - M D
1
我从未见过第二种方式,但它对我来说没有意义,因为如果你有一个Context,你可以使用getApplicationContext。 - OneCricketeer
3个回答

6
我建议使用方法3,如果你只需要应用程序的实例。
如果您的Application类中有其他方法,我建议使用方法1,因为您可以更清晰地进行操作。
MyApplication.getInstance().foo();

方法2只是方法3的一种快捷方式,所以我不建议使用它。


总之,这只是个人偏好问题。因为它们都可以工作,所以没有一种“正确”的方法。


1
将上下文和应用程序实例设为静态并不是一种好的方式,这样可能会导致内存泄漏。 - Mohit Rajput

2
(getActivity().getApplication() as MyApplication)

这将会返回MyApplication实例。

-3

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


你的代码返回true或false,而不是应用程序实例。 - from56

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接