OSChina App代码分析之BaseApplication
来源:互联网 发布:asp客服源码 编辑:程序博客网 时间:2024/06/03 01:08
转载请标明出处:
http://blog.csdn.net/zq2114522/article/details/50444217;
本文出自:【梁大盛的博客】
OSChina App代码分析之BaseApplication
引:进入程序以后Application类是一个不的不进行分析的大类.在OSChina当中Application承当着保存配置数据的角色此外还提供显示提示的功能(Toast).当然他的子类AppContext扩张了更多的功能.这就是后话了.这一篇文章当中具体分析BaseApplication类
首先抛出通过阅读BaseApplication类到底学到什么东西.
- sdk版本判断
- BaseApplication充当这个应用程序运行过程中的简单数据存储角色(通过sharedPreferences实现)
- 自定义Toast
BaseApplication.java
package net.oschina.app.base;import android.annotation.SuppressLint;import android.annotation.TargetApi;import android.app.Activity;import android.app.Application;import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.content.res.Resources;import android.os.Build;import android.util.DisplayMetrics;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import net.oschina.app.R;import net.oschina.app.util.StringUtils;@SuppressLint("InflateParams")public class BaseApplication extends Application { //杂七杂八的数据都是存在在这个xml文件 private static String PREF_NAME = "creativelocker.pref"; //用来存储cache文件更新时间戳 private static String LAST_REFRESH_TIME = "last_refresh_time.pref"; static Context _context; static Resources _resource; //上一次Toast显示的文字 private static String lastToast = ""; //上一次Toast显示的时间 private static long lastToastTime; //当前framework是否大于等于GINGERBREAD(Andrdoi 2.3) //因为在GINGERBREAD以前的更新sharedPreferences只能 //调用commit函数,在GINGERBREAD及其以 //后的版本可以调用性能更好的apply函数 private static boolean sIsAtLeastGB; //判断当前framework版本是否大于等于GINGERBREAD //Build.VERSION.SDK_INIT已int形式保存当前framework版本号 //在Build.VERSION_CODES类里保存所知的版本号 static { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { sIsAtLeastGB = true; } } @Override public void onCreate() { super.onCreate(); _context = getApplicationContext(); _resource = _context.getResources(); } public static synchronized BaseApplication context() { return (BaseApplication) _context; } public static Resources resources() { return _resource; } /** * 放入已读文章列表中 * */ public static void putReadedPostList(String prefFileName, String key, String value) { SharedPreferences preferences = getPreferences(prefFileName); int size = preferences.getAll().size(); Editor editor = preferences.edit(); //这里有一个bug? //clear函数,只是把editor里面的list清空.并且会导致后在调用commit函数不会生效. //具体 if (size >= 100) { editor.clear(); } editor.putString(key, value); apply(editor); } /** * 读取是否是已读的文章列表 * * @return */ public static boolean isOnReadedPostList(String prefFileName, String key) { return getPreferences(prefFileName).contains(key); } /** * 记录列表上次刷新时间 * * @param key * @param value * @return void * @author 火蚁 * 2015-2-9 下午2:21:37 */ public static void putToLastRefreshTime(String key, String value) { SharedPreferences preferences = getPreferences(LAST_REFRESH_TIME); Editor editor = preferences.edit(); editor.putString(key, value); apply(editor); } /** * 获取列表的上次刷新时间 * * @param key * @return * @author 火蚁 * 2015-2-9 下午2:22:04 */ public static String getLastRefreshTime(String key) { return getPreferences(LAST_REFRESH_TIME).getString(key, StringUtils.getCurTimeStr()); } //GINGERBREAD以后的framework调用apply函数提交修改.之前的版本调用commit函数提交修改. @TargetApi(Build.VERSION_CODES.GINGERBREAD) public static void apply(SharedPreferences.Editor editor) { if (sIsAtLeastGB) { editor.apply(); } else { editor.commit(); } } public static void set(String key, int value) { Editor editor = getPreferences().edit(); editor.putInt(key, value); apply(editor); } public static void set(String key, boolean value) { Editor editor = getPreferences().edit(); editor.putBoolean(key, value); apply(editor); } public static void set(String key, String value) { Editor editor = getPreferences().edit(); editor.putString(key, value); apply(editor); } public static boolean get(String key, boolean defValue) { return getPreferences().getBoolean(key, defValue); } public static String get(String key, String defValue) { return getPreferences().getString(key, defValue); } public static int get(String key, int defValue) { return getPreferences().getInt(key, defValue); } public static long get(String key, long defValue) { return getPreferences().getLong(key, defValue); } public static float get(String key, float defValue) { return getPreferences().getFloat(key, defValue); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static SharedPreferences getPreferences() { SharedPreferences pre = context().getSharedPreferences(PREF_NAME, Context.MODE_MULTI_PROCESS); return pre; } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static SharedPreferences getPreferences(String prefName) { return context().getSharedPreferences(prefName, Context.MODE_MULTI_PROCESS); } public static int[] getDisplaySize() { return new int[]{getPreferences().getInt("screen_width", 480), getPreferences().getInt("screen_height", 854)}; } //将屏幕规格信息存储起来 public static void saveDisplaySize(Activity activity) { DisplayMetrics displaymetrics = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay() .getMetrics(displaymetrics); SharedPreferences.Editor editor = getPreferences().edit(); editor.putInt("screen_width", displaymetrics.widthPixels); editor.putInt("screen_height", displaymetrics.heightPixels); editor.putFloat("density", displaymetrics.density); editor.commit(); } public static String string(int id) { return _resource.getString(id); } public static String string(int id, Object... args) { return _resource.getString(id, args); } public static void showToast(int message) { showToast(message, Toast.LENGTH_LONG, 0); } public static void showToast(String message) { showToast(message, Toast.LENGTH_LONG, 0, Gravity.BOTTOM); } public static void showToast(int message, int icon) { showToast(message, Toast.LENGTH_LONG, icon); } public static void showToast(String message, int icon) { showToast(message, Toast.LENGTH_LONG, icon, Gravity.BOTTOM); } public static void showToastShort(int message) { showToast(message, Toast.LENGTH_SHORT, 0); } public static void showToastShort(String message) { showToast(message, Toast.LENGTH_SHORT, 0, Gravity.BOTTOM); } public static void showToastShort(int message, Object... args) { showToast(message, Toast.LENGTH_SHORT, 0, Gravity.BOTTOM, args); } public static void showToast(int message, int duration, int icon) { showToast(message, duration, icon, Gravity.BOTTOM); } public static void showToast(int message, int duration, int icon, int gravity) { showToast(context().getString(message), duration, icon, gravity); } public static void showToast(int message, int duration, int icon, int gravity, Object... args) { showToast(context().getString(message, args), duration, icon, gravity); } //上面一大寸showToast总归到要走到这里 public static void showToast(String message, int duration, int icon, int gravity) { //message为nul或者为"",就不好意思咯.一律居于门外 if (message != null && !message.equalsIgnoreCase("")) { long time = System.currentTimeMillis(); //如果message显示的信息和上一回显示的是一样必须有2S的间隔 //如果message显示的信息和上一回显示的不一样那么立马请进 if (!message.equalsIgnoreCase(lastToast) || Math.abs(time - lastToastTime) > 2000) { //根据layout文件生成View //R.layout.view_toast就是一个相对布局里面,横着放着一个ImageView和TextView //因为ImageView有时候会隐藏,TextView又是依赖ImageView布局的. //所以TextView设置了layout_alignWithParentIfMissing属性 View view = LayoutInflater.from(context()).inflate( R.layout.view_toast, null); ((TextView) //设置文字 view.findViewById(R.id.title_tv)).setText(message); //还可设置图片哦 if (icon != 0) { ((ImageView) view.findViewById(R.id.icon_iv)) .setImageResource(icon); ((ImageView) view.findViewById(R.id.icon_iv)) .setVisibility(View.VISIBLE); } //创建Toast实例 Toast toast = new Toast(context()); //设置Toast实例的View toast.setView(view); //设置对其方式 if (gravity == Gravity.CENTER) { toast.setGravity(gravity, 0, 0); } else { toast.setGravity(gravity, 0, 35); } //Toast显示时间 toast.setDuration(duration); toast.show(); //记录显示的文字 lastToast = message; //记录此次的现实时间戳 lastToastTime = System.currentTimeMillis(); } } }}
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/toast_background" > <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="@dimen/space_8" android:paddingLeft="10.0dip" android:paddingRight="10.0dip" android:paddingTop="@dimen/space_8" > <ImageView android:id="@+id/icon_iv" android:layout_width="wrap_content" android:layout_height="40.0dip" android:layout_centerVertical="true" android:layout_marginRight="@dimen/space_8" android:scaleType="fitCenter" android:visibility="gone" /> <TextView android:id="@+id/title_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignWithParentIfMissing="true" android:layout_toRightOf="@id/icon_iv" android:gravity="center_vertical" android:textColor="@color/white" android:textSize="16.0dip" /> </RelativeLayout></FrameLayout>
总结:
1.SDK framework的判断通过两个关键类Build.VERSION和Build.VERSION_CODES.Build.VERSION记录着当前的版本是多少.Build.VERSION_CODES里面记录了所有版本号的信息
2.基于Application类的特殊性.因为在每个一Activity都可以访问到的相当一个单类?.Application在很多时候也充当保存配置的角色.
3.在使用Toast多数情况下都是调用Toast的静态方法makeText.事实上除了这方法.使用Toast提供构造函数的能更灵活使用Toast.灵活体现在能自定义Toast显示内部的View.还有就是可以设置Toast显示的位置.可以告诉妈妈Toast不用在呆在底部了!
附:
在api里面很清楚可以看到apply函数在GINGERBREAD才新加进的
参考:
1:SharedPreferences http://www.android-doc.com/reference/android/content/SharedPreferences.html
2:Editor http://www.android-doc.com/reference/android/content/SharedPreferences.Editor.html
3:Toast http://www.android-doc.com/reference/android/widget/Toast.html
4:Build.VERSION http://www.android-doc.com/reference/android/os/Build.VERSION.html
5:Build.VERSION_CODES http://www.android-doc.com/reference/android/os/Build.VERSION_CODES.html
- OSChina App代码分析之BaseApplication
- OSChina App代码分析之摇一摇Demo
- OSChina App代码分析一
- OSChina App代码分析二
- oschina代码结构分析
- 从头开始敲代码之《从BaseApplication/Activity开始》
- 提高安卓APP开发效率、管理代码的架子(一):BaseActivity&BaseApplication
- BaseApplication
- 从头开始敲代码之《从BaseApplication/Activity开始(二)》
- 从头开始敲代码之《从BaseApplication/Activity开始(三)》
- 从头开始敲代码之《从BaseApplication/Activity开始(四)》
- oschina-app 的源码分析-主页面滑动切换
- oschina-app 源码分析-数据缓存(离线功能)
- oschina-app源码分析-提醒标签BadgeView使用方法
- oschina-app源码分析-提醒标签BadgeView使用逻辑流程
- oschina-app源码分析-提醒标签BadgeView使用逻辑流程
- 从头开始敲代码之《从BaseApplication/Activity开始(五)》(自定义控件,实现点击/滑动翻页)
- Android学习之自定义基类BaseApplication和BaseActivity
- 20160101自学Linux
- solutions to errors occured when compiling kernel linux-2.6.31.14
- 2016,留下你的心愿,2017,我们一起回来见证!
- ARM指令集详解
- Ubuntu SSH 开启 Root 远程登陆
- OSChina App代码分析之BaseApplication
- Bye,2015;Hi,2016
- 装完Centos7提示Initial setup of CentOS Linux 7 (core)
- Hive,Hbase,HDFS等之间的关系
- 黑马程序员——多线程之线程安全的实现详解
- 二零一五小结
- ARM汇编指令集
- 图像识别--翻译论文
- html<audio>标签实现的网页播放器