在Android开发中怎样使用Application类
2017-09-13 14:45
375 查看
转载地址:http://www.jianshu.com/p/3138f9c351e8
--- 在Android开发中怎样使用Application类
自己独立开发项目才发现以前对Application类并不是十分了解,现在开始直接搭建一个新项目的框架才重新踩过这个坑。
context继承图
Context的继承结构从图中可以看到,直系子类有两个,一个是ContextWrapper,一个是ContextImpl。那么从名字上就可以看出,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。而ContextWrapper又有三个直接的子类,ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity。
在这里我们至少看到了几个所比较熟悉的面孔,Activity、Service、还有Application。由此,其实我们就已经可以得出结论了,Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的。
一种比较特殊的情况是Dialog要求在Activity的Context中弹出,而一些全局的例如网络终端的Dialog需要什么特殊权限。
然后千万不要忘了在Android项目的Manifest文件中指定Application的实现类,不然系统会创建一个默认的Application类。
上面这种方式如果是单纯的Java工程可能没有问题,但是在Android里这样说大错特错的。因为Application是系统组件,系统组件实例是要由系统去创建的,如果我们这里直接创建一个,不过是简单的Java对象而已,不具备任何Context能力,也无法进行任何Context操作。标准的写法就本文的第一段示意代码那样。
Application方法执行顺序
作者:蝉翅的空响
链接:http://www.jianshu.com/p/3138f9c351e8
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
--- 在Android开发中怎样使用Application类
自己独立开发项目才发现以前对Application类并不是十分了解,现在开始直接搭建一个新项目的框架才重新踩过这个坑。
1. Context类型
Android是用Java语言来编写和,然而Android却需要一个完整的Android工程环境,在这个环境下,我们熟悉的Activity、Service、ContentPrivoder等系统组件才能有自己各自的上下文环境,也就是Context。Context是维持Android应用的核心功能类,是整个Android系统交互的核心。context继承图
Context的继承结构从图中可以看到,直系子类有两个,一个是ContextWrapper,一个是ContextImpl。那么从名字上就可以看出,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。而ContextWrapper又有三个直接的子类,ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity。
在这里我们至少看到了几个所比较熟悉的面孔,Activity、Service、还有Application。由此,其实我们就已经可以得出结论了,Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的。
一种比较特殊的情况是Dialog要求在Activity的Context中弹出,而一些全局的例如网络终端的Dialog需要什么特殊权限。
2. Application类在项目开发中的使用
首先在项目目录下一个Java类继承Application类,实现是onCreate()方法。这个类可以做APP的全局初始化工作,比如图片加载框架的全局配置信息设置。public class AndroidApplication extends Application { private static AndroidApplication instance; @Override public void onCreate() { super.onCreate(); instance = this; } public static AndroidApplication getInstance(){ return instance; } }
然后千万不要忘了在Android项目的Manifest文件中指定Application的实现类,不然系统会创建一个默认的Application类。
<application android:name=".AndroidApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application>
3. Application类或Context类的误用情况
1. 不能用Application缓存数据!!!
因为Application会因为进入background后内存不足被系统干掉,进入后系统会重现创建一个Application类,而导致缓存在Application类里的数据全部初始化而丢失。2. 错误的获取全局Context对象的方式
public class AnddroidApplication extends Application { private static AnddroidApplication app; public static AnddroidApplication getInstance() { if (app == null) { app = new AnddroidApplication(); } return app; } }
上面这种方式如果是单纯的Java工程可能没有问题,但是在Android里这样说大错特错的。因为Application是系统组件,系统组件实例是要由系统去创建的,如果我们这里直接创建一个,不过是简单的Java对象而已,不具备任何Context能力,也无法进行任何Context操作。标准的写法就本文的第一段示意代码那样。
3. 在控件的构造方法中获取Context或者做其他视图操作
写过Android的同学应该知道自己或者看别人dome都很少或者基本看不到在控件构造函数内进行初始化,获取参数等这些操作吧!是的,这样做是很容易出难以发现的Bug的。具体原因是在ContextWrapper类的源码中,他有一个attachBaseContext()方法,这个方法会将传入的一个Context参数赋值给mBase对象,之后mBase对象就有值了。而我们又知道,所有Context的方法都是调用这个mBase对象的同名方法,那么也就是说如果在mBase对象还没赋值的情况下就去调用Context中的任何一个方法时,就会出现空指针异常,上面的代码就是这种情况。Application中方法的执行顺序如下图所示:Application方法执行顺序
作者:蝉翅的空响
链接:http://www.jianshu.com/p/3138f9c351e8
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章推荐
- 在Android开发中怎样使用Application类
- [转]怎样使用Eclipse来开发Android源码
- 怎样使用eclipse来开发android源码
- 怎样使用Eclipse来开发Android源码
- android开发环境建立以及开发工具的使用--怎样使用eclipse来开发android源码
- 怎样使用Eclipse来开发Android源码
- android开发环境建立以及开发工具的使用--怎样使用eclipse来开发android源码
- 怎样使用Eclipse来开发Android源码
- android 开发中 使用Application类 OnCreate()方法没被调用
- 怎样使用Eclipse来开发Android源码
- 怎样使用Eclipse来开发Android源码
- android开发环境建立以及开发工具的使用--怎样使用eclipse来开发android源码
- 怎样使用Eclipse来开发Android源码
- android开发环境建立以及开发工具的使用--怎样使用eclipse来开发android源码
- android开发中,在java中怎样使用c提供过来char*
- 求助 android开发中 如果两个控件的id相同 会怎样?如何使用findviewbyid ()寻找到?
- 怎样使用Eclipse来开发Android源码
- Android开发中怎样使用cookieManager来管理cookie
- 怎样使用Eclipse来开发Android源码
- android开发环境建立以及开发工具的使用--怎样使用eclipse来开发android源码