实例化对象与调用getApplicationContext()的区别及调用是否触发实例化疑问
实例化对象与getApplicationContext()的区别,以及你的代码疑问解答
嘿,我来帮你理清楚这两个点,结合你的Android代码场景来说明:
一、手动实例化对象 vs getApplicationContext()的核心区别
- 手动实例化(比如
new STXmaApplication()):这只是创建了一个普通的Java类实例,完全不具备Android应用上下文的能力。它不会被Android系统托管,无法访问系统资源(比如Resources、SharedPreferences),也不参与应用的生命周期管理,说白了就是个和Android环境无关的普通对象,在Android开发中这么做几乎没有意义。 getApplicationContext():这是Android系统提供的全局上下文获取方法,返回的是系统已经初始化完成的Application类实例。Android应用进程启动时,系统会自动实例化你在Manifest中配置的自定义Application类(如果有的话),这个实例是全局唯一的,伴随整个应用进程的生命周期。调用这个方法只是获取已存在的实例,而非创建新实例。
二、你的代码中getApplicationContext()是否会强制实例化STXmaApplication?
先纠正下代码里的小笔误:(STXmaAplication)应该是(STXmaApplication)(少了一个字母p)。然后回到你的问题:
你不需要手动实例化STXmaApplication,因为Android系统已经帮你做了这件事!
当你的应用启动时,系统会先读取AndroidManifest.xml中的<application>标签,如果这个标签配置了android:name=".STXmaApplication"(指定了自定义的Application子类),系统会在应用进程启动的最早期阶段自动实例化这个类,并且只实例化一次。
所以你在Activity的onCreate方法中调用getApplicationContext()时,STXmaApplication的实例早已经存在了,你只是把系统返回的全局上下文强转为你的自定义Application类型,从而调用它的getModel()方法而已。这就是为什么你找不到手动实例化的代码——因为根本不需要手动创建。
额外提醒
如果你的AndroidManifest.xml里没有给<application>标签配置android:name属性,那系统会使用默认的Application类实例,这时候你强行转成STXmaApplication就会抛出ClassCastException。所以建议你去检查下Manifest里的这个配置是否存在。
内容的提问来源于stack exchange,提问作者Gary Armstrong
相关产品推荐
相关产品推荐

