Android开发框架搭建——BaseActivity的抽取(二)
来源:互联网 发布:sql server error 40 编辑:程序博客网 时间:2024/06/06 11:04
在日常的开发中,我们都会不断地抽取基类让自己的代码看起来更加简洁易懂,这样我们就要抽取我们自己的基类,让后面的类都继承这个Base基类,这样我们可以少写一些代码,可以增加复用性,降低耦合 今天我们就抽取了所有的应用程序都需要的BaseActivity,这个大家在开发过程中都需要用到的类,那么废话不说,看看我们的BaseActivity的源码:
- 初始化布局initLayout(savedInstanceState);
- 初始化View 主要是使用findviewbyid的 如果你用的是ButterKnife 这个方法可以忽略
- 所有监听的方法都在该类中实现
- 添加activity 控制activity的关闭addActivity()
- 移除当前的页面管理器的页面 removeActivity()
- 销毁当前的activity destroyActivity()
- 界面销毁 (1)关闭所有activity finishAll()
- 界面销毁 (2)退出整个程序exit()
- 页面跳转 activityPageChange
- 获取页面传输过程传输的非基本类型数据getMapData(String key)
- 判断内存卡是否存在isSDCardExist()
- 获取sd卡剩余的空间大小 单位是byte getSDFreeSize()
- 关于数据存储的方法
- 吐司
- log日志打印
package ledon.com.retrofitdemo.base;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.Window;import android.widget.Toast;import java.util.Map;import ledon.com.retrofitdemo.application.MyAppliaction;import ledon.com.retrofitdemo.utils.DataStorageUtils;import ledon.com.retrofitdemo.utils.LogUtils;/** * Created by Administrator on 2017/3/16. */public abstract class BaseActivity extends AppCompatActivity { private MyAppliaction appliaction; private DataStorageUtils dataStorageUtils; private String tag = this.getClass().getName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //全局没有标题栏 initLayout(savedInstanceState); initView(); initListener(); appliaction = MyAppliaction.getMyAppliaction(); dataStorageUtils = new DataStorageUtils(this); } /** * 所有监听的方法都在该类中实现 */ protected abstract void initListener(); /** * 初始化布局 * @param savedInstanceState */ protected abstract void initLayout(Bundle savedInstanceState); /** * 初始化View 主要是使用findviewbyid的 如果你用的是ButterKnife 这个方法可以忽略 */ protected abstract void initView() ; /** * 添加activity 控制activity的关闭 */ public void addActivity(){ appliaction.addActivity(this); } /** * 移除当前的页面管理器的页面 */ public void removeActivity(){ appliaction.removeActivity(this); } /** * 销毁当前的activity */ public void destroyActivity(){ appliaction.destroyActivity(this); } /** * 界面销毁 (1)关闭所有activity */ public void finishAll() { appliaction.finishAll(); } /** * 界面销毁 (2)退出整个程序 */ public void exit() { appliaction.exit(); } /** * 不设置flags,不需要返回值的页面跳转 * * * 当前Activity * @param c * 要跳转的class * @param map * 传输数据的键值对 没有时为null * @param b * 是否关闭当前页面 为true时关闭,false时保留 */ public void activityPageChange(Class<?> c, Map<String, Object> map, boolean b) { // 这里的页面关闭可控制 appliaction.activityPageChange(this, c, map, -1, false, 0, b); } /** * 设置flags,不需要返回值的页面跳转 * * * 当前Activity * @param c * 要跳转的class * @param map * 传输数据的键值对 没有时为null * @param flags * 为要跳转的页面设置的flags 没有时为-1 * @param b * 是否关闭当前页面 为true时关闭,false时保留 */ public void activityPageChange(Class<?> c, Map<String, Object> map, int flags, boolean b) { // 这里的页面关闭可控制 appliaction.activityPageChange(this, c, map, flags, false, 0, b); } /** * 设置flags,需要返回值的页面跳转 * * * 当前Activity * @param c * 要跳转的class * @param map * 传输数据的键值对 没有时为null * @param flags * 为要跳转的页面设置的flags 没有时为-1 * @param requestCode * 跳转页面调用startActivityForResult() 对应的请求码 * @param b * 是否关闭当前页面 为true时关闭,false时保留 */ public void activityPageChange(Class<?> c, Map<String, Object> map, int flags, int requestCode, boolean b) { // 这里的页面关闭可控制 appliaction.activityPageChange(this, c, map, flags, true, requestCode, b); } /** * 获取页面传输过程传输的非基本类型数据 * * @param key * @return */ public Object getMapData(String key) { return appliaction.getMapData(key); } /** * 判断内存卡是否存在 * @return */ public static boolean isSDCardExist(){ return DataStorageUtils.isSDCardExist(); } /** * 获取sd卡剩余的空间大小 单位是byte * @return */ public static long getSDFreeSize(){ return DataStorageUtils.getSDFreeSize(); } /** * 根据键字符串,存储一个字符串值 * * @param key * @param value * @return 返回提交是否成功 */ public boolean putString(String key, String value) { return dataStorageUtils.putString(key, value); } /** * 根据key值得到存储结果,如果没有找到value就返回null * * @param key * @return */ public String getString(String key) { return dataStorageUtils.getString(key); } /** * 根据键字符串,存储一个整型值, 值不能为-1 * * @param key * @param value * 不能为-1 * @return 返回提交是否成功 */ public boolean putInt(String key, int value) { return dataStorageUtils.putInt(key, value); } /** * 根据key值得到存储结果,如果没有找到value就返回-1 * * @param key * @return */ public int getInt(String key) { return dataStorageUtils.getInt(key); } /** * 根据key值移除对应的数据 * * @param key * @return */ public boolean remove(String key) { return dataStorageUtils.remove(key); } /** * 吐司 * @param message */ public void toast(String message){ Toast.makeText(this,message,Toast.LENGTH_SHORT).show(); } public void log(String s){ LogUtils.i(tag,s); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); appliaction = null; dataStorageUtils = null; } @Override protected void onStart() { super.onStart(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { super.onStop(); }}
目前更新的BaseActivity就是这样抽取的,其中有一些方法可以参考上一篇文章,这里还有一些用到的工具类,下面就把需要的工具类的源码给大家粘贴出来:
DataStorageUtils:
package ledon.com.retrofitdemo.utils;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.RandomAccessFile;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.content.SharedPreferences;import android.os.Environment;import android.os.StatFs;import android.text.TextUtils;import android.util.Log;import ledon.com.retrofitdemo.application.MyAppliaction;/** * 数据存储工具包 * * @author Alba * */public class DataStorageUtils { private final static String TAG = "SharedPreferencesHelper"; private SharedPreferences prefs; private SharedPreferences.Editor editor; /** 当存在SD时,且空间足够时,app文件下载存放的目录 */ public final static String SDCARD_STORAGE = Environment .getExternalStorageDirectory() + File.separator + "Ilodo"; /** 当不存在SD时,app文件下载存放的目录 */ public final static String INNER_STORAGE = MyAppliaction .getMyAppliaction().getFilesDir() + File.separator; public DataStorageUtils(Context context) { // 貌似都是同一文件名存储,只是访问权限不同 prefs = context.getSharedPreferences(TAG, Context.MODE_PRIVATE); editor = prefs.edit(); } /** * 判断SD卡是否存在 * * @return */ public static boolean isSDCardExist() { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { Log.w("isSDCardExist", "isSDCardExist:" + true); return true; } Log.w("isSDCardExist", "isSDCardExist:" + false); return false; } /** * 获取存储目录的剩余空间 返回值单位 Byte * * @return */ public static long getSDFreeSize() { File path; if (isSDCardExist()) { // 取得SD卡文件路径 path = Environment.getExternalStorageDirectory(); } else { path = MyAppliaction.getMyAppliaction().getFilesDir(); } StatFs sf = new StatFs(path.getPath()); // 获取单个数据块的大小(Byte) long blockSize = sf.getBlockSize(); // 空闲的数据块的数量 long freeBlocks = sf.getAvailableBlocks(); // 返回SD卡空闲大小 long size = freeBlocks * blockSize; Log.w("isSDCardExist", "剩余空间大小:" + size); return size; // 单位Byte // return (freeBlocks * blockSize)/1024; //单位KB // return (freeBlocks * blockSize)/1024 /1024; //单位MB } /** * 根据键字符串,存储一个字符串值 * * @param key * @param value * @return 返回提交是否成功 */ public boolean putString(String key, String value) { if (TextUtils.isEmpty(key)) { return false; } editor.putString(key, value); return editor.commit(); } /** * 根据key值得到存储结果,如果没有找到value就返回null * * @param key * @return */ public String getString(String key) { return prefs.getString(key, null); } /** * 根据键字符串,存储一个整型值, 值不能为-1 * * @param key * @param value * 不能为-1 * @return 返回提交是否成功 */ public boolean putInt(String key, int value) { if (TextUtils.isEmpty(key) || value == -1) { return false; } editor.putInt(key, value); return editor.commit(); } /** * 根据key值得到存储结果,如果没有找到value就返回-1 * * @param key * @return */ public int getInt(String key) { return prefs.getInt(key, -1); } /** * 根据键字符串,存储一个布尔值 * * @param key * @param value * @return 返回提交是否成功 */ public boolean putBoolean(String key, boolean value) { if (TextUtils.isEmpty(key)) { return false; } editor.putBoolean(key, value); return editor.commit(); } /** * 根据key值得到存储结果,如果没有找到value就返回false * * @param key * @return */ public boolean getBoolean(String key) { return prefs.getBoolean(key, false); } /** * 根据key值移除对应的数据 * * @param key * @return */ public boolean remove(String key) { editor.remove(key); return editor.commit(); } /** * 清空少量的数据 * * @return */ public boolean clearLittleData() { editor.clear(); return editor.commit(); } // 注意拓展多用户登录 /** * 存储登录时 的个人信息,以实现记住最后一次登录用户的效果 * * @param context * 上下文对象 * @param headMsg * 头部信息,区分是账号登录还是第三方登录 * @param accountInforma * 这里包含账号登录时,存储账号名和密码;第三方登录时,存储thirdIdentify和openId * @param imgUrl * 头像url * @param username * 用户名 * @return */ public static boolean savePersonData(Context context, String headMsg, String accountInforma, String imgUrl, String username) { // 考虑到注册账号的特殊性,除了登陆是必要的账号密码,其他信息都可为空,但是也需要做相关处理 // || imgUrl == null || username == null || headMsg == null if (context == null || accountInforma == null) { Log.i("savePersonData", "message is null"); return false; } File file = new File(context.getFilesDir(), "ledonPerson.txt"); if (!file.exists()) { try { file.createNewFile(); } catch (IOException ioException) { ioException.printStackTrace(); Log.i("savePersonData", "error in file"); return false; } } if (!file.exists()) { return false; } else { try { // 如果存在之前的账户信息,应该删除掉 clearData(file.getAbsolutePath()); /** 以读写方式建立一个RandomAccessFile对象 */ RandomAccessFile raf = new RandomAccessFile(file, "rws"); Log.i("savePersonData", "RandomAccessFile文件指针的初始位置:" + raf.getFilePointer()); // 将记录指针移动到文件最前 raf.seek(0);// 确保是最后一次登录用户 如果是多用户登录,此处应去掉 raf.write((headMsg + "\r\n").getBytes("utf-8"));// 头部信息,区分是账号登录还是第三方登录 // 注意会出现乱码 raf.write((accountInforma + "\r\n").getBytes("utf-8")); // 这里包含账号登录时,存储账号名和密码;第三方登录时,存储thirdIdentify和openId // 注意会出现乱码 raf.write((imgUrl + "\r\n").getBytes("utf-8")); // 注意会出现乱码 if (!TextUtils.isEmpty(username)) { raf.write((username + "\r\n").getBytes("utf-8")); // 注意会出现乱码 } else { raf.write(("上一次登录用户" + "\r\n").getBytes("utf-8")); // 注意会出现乱码 } raf.close(); } catch (Exception e) { e.printStackTrace(); Log.i("savePersonData", "error in write"); return false; } Log.i("savePersonData", "Success"); return true; } } /** * 更新用户信息 * * @param context * @param imgUrl * @param username * @return */ public static boolean updatePersonData(Context context, String imgUrl, String username) { if (context == null || TextUtils.isEmpty(imgUrl)) { Log.i("updatePersonData", "message is null"); return false; } File file = new File(context.getFilesDir(), "ledonPerson.txt"); List<String> personMsg = new ArrayList<String>(); if (file.exists()) { /** 以读写方式建立一个RandomAccessFile对象 */ try { RandomAccessFile raf = new RandomAccessFile(file, "rws"); Log.i("updatePersonData", "RandomAccessFile文件指针的初始位置:" + raf.getFilePointer()); // 将记录指针移动到文件最前 raf.seek(0); byte[] buff = new byte[1024]; int hasRead = 0; String data = null; while ((hasRead = raf.read(buff)) > 0) { // 打印读取的内容,并将字节转为字符串输入 存在乱码问题 String str = new String(buff, 0, hasRead); Log.i("updatePersonData", "personData:" + str); data = str;// 如果是多用户登录,此处得加信息判断 } Log.i("updatePersonData", "RandomAccessFile文件指针的位置:" + raf.getFilePointer()); String[] strArray = data.split("\r\n"); for (int i = 0; i < strArray.length; i++) { personMsg.add(strArray[i]); } strArray = null; Log.i("updatePersonData", "msg length:" + personMsg.size()); personMsg.set(personMsg.size() - 2, imgUrl); personMsg.set(personMsg.size() - 1, username); clearData(file.getAbsolutePath()); // 将记录指针移动到文件最前 raf.seek(0);// 确保是最后一次登录用户 如果是多用户登录,此处应去掉 for (int i = 0; i < personMsg.size(); i++) { if (i != personMsg.size() - 1) { raf.write((personMsg.get(i) + "\r\n").getBytes("utf-8")); } else { if (!TextUtils.isEmpty(personMsg.get(i))) { raf.write((personMsg.get(i) + "\r\n") .getBytes("utf-8")); // 注意会出现乱码 } else { raf.write(("上一次登录用户" + "\r\n").getBytes("utf-8")); // 注意会出现乱码 } } } /* * raf.write((headMsg + "\r\n").getBytes("utf-8"));// * 头部信息,区分是账号登录还是第三方登录 // 注意会出现乱码 raf.write((accountInforma + * "\r\n").getBytes("utf-8")); // * 这里包含账号登录时,存储账号名和密码;第三方登录时,存储thirdIdentify和openId // 注意会出现乱码 * raf.write((imgUrl + "\r\n").getBytes("utf-8")); // 注意会出现乱码 if * (!TextUtils.isEmpty(username)) { raf.write((username + * "\r\n").getBytes("utf-8")); // 注意会出现乱码 } else { * raf.write(("上一次登录用户" + "\r\n").getBytes("utf-8")); // 注意会出现乱码 * } */ raf.close(); } catch (Exception e) { e.printStackTrace(); Log.i("updatePersonData", "error in write"); return false; } } Log.i("updatePersonData", "Success"); return true; } /** * 清空数据 * * @param path */ public static void clearData(String path) { try { BufferedWriter bw = new BufferedWriter(new FileWriter( new File(path))); bw.write(""); bw.close(); } catch (IOException e) { // TODO Auto-generated catch block Log.i("savePersonData", "clearData error"); e.printStackTrace(); } } /** * 获取最后一次登录账户的信息 * * @param context * 上下文对象 * @return */ public static List<String> getPersonData(Context context) { File file = new File(context.getFilesDir(), "ledonPerson.txt"); List<String> personMsg = new ArrayList<String>(); if (file.exists()) { try { /** 以读写方式建立一个RandomAccessFile对象 */ RandomAccessFile raf = new RandomAccessFile(file, "rws"); Log.i("getPersonData", "RandomAccessFile文件指针的初始位置:" + raf.getFilePointer()); // 将记录指针移动到文件最前 raf.seek(0); byte[] buff = new byte[1024]; int hasRead = 0; String data = null; while ((hasRead = raf.read(buff)) > 0) { // 打印读取的内容,并将字节转为字符串输入 存在乱码问题 String str = new String(buff, 0, hasRead); Log.i("getPersonData", "personData:" + str); data = str;// 如果是多用户登录,此处得加信息判断 } raf.close(); String[] strArray = data.split("\r\n"); for (int i = 0; i < strArray.length; i++) { // Log.i("getPersonData", "strArray :" + strArray[i]); personMsg.add(strArray[i]); } strArray = null; Log.i("getPersonData", "msg length:" + personMsg.size()); return personMsg; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); Log.i("getPersonData", "error"); return null; } } Log.i("getPersonData", "file isn't exist"); return null; } // 大文件存储,只适应从网络download数据下来,但是网络请求封装已经借由第三方框架实现了 /** * 清除文件 这里只会删除某个文件夹下的文件,如果传入的directory是个文件,将不做处理 * * @param directory * 对应文件夹 */ private static void deleteFilesByDirectory(File directory) { if (directory != null && directory.exists() && directory.isDirectory()) { for (File item : directory.listFiles()) { item.delete(); } } } /** * 清除Cache * * @param context * 上下文对象 */ public static void clearCache(Context context) { // 内部缓存 deleteFilesByDirectory(context.getCacheDir()); if (isSDCardExist()) { // 外部cache deleteFilesByDirectory(context.getExternalCacheDir()); } }}
LogUtils:
package ledon.com.retrofitdemo.utils;
import android.util.Log;
/**
* 封装打印工具类 添加控制开启日志的配置:OPENLOG
* 当开发的时候设为true,线上版本设为false
* @author Alba
*
*/
public class LogUtils {
private final static boolean OPENLOG = true;public static void i(String tag, String content) { if (OPENLOG) { Log.i(tag, content); }}public static void v(String tag, String content) { if (OPENLOG) { Log.v(tag, content); }}public static void d(String tag, String content) { if (OPENLOG) { Log.d(tag, content); }}public static void w(String tag, String content) { if (OPENLOG) { Log.w(tag, content); }}public static void e(String tag, String content) { if (OPENLOG) { Log.e(tag, content); }}
}
0 0
- Android开发框架搭建——BaseActivity的抽取(二)
- android应用框架搭建------BaseActivity
- android应用框架搭建------BaseActivity
- Android开发系列( 二)----BaseActivity
- 搭建一个简单、易用的 Android 项目框架之BaseActivity(一)
- Android学习笔记--BaseActivity和BaseFragment的再抽取
- 继承与BaseActivity的抽取
- BaseActivity框架搭建
- BaseActivity框架搭建
- 框架搭建之BaseActivity
- 手把手教你如何搭建一个自己的安卓快速开发框架之BaseActivity(一)
- 《一个Android工程的从零开始》-3、base(二) BaseActivity布局相关代码——空布局控件的运用
- Extjs4开发笔记(二)——框架的搭建
- Android BaseActivity App框架设计BaseActivity封装
- Android开发环境搭建(二)——基于Eclipse的开发环境搭建
- Android开发环境搭建(二)——基于Eclipse的开发环境搭建
- 为了快速Android开发整理出的一套框架,BaseFragment,BaseActivity,RecyleAdapter
- ## 抽取BaseActivity解放你的titlebar ##
- 面试总结之C语言的静态变量、全局变量、局部变量
- 最大连续子序列和问题O(n)解法
- FLASH延长写寿命算法
- struts2的核心和工作原理
- iOS学习笔记-055.简单矩阵操作
- Android开发框架搭建——BaseActivity的抽取(二)
- 如何修改element.style内联样式;
- 快速点击的判断
- java体系结构介绍
- make clean与make distclean的区别
- vijos1033 整数分解(版本2)
- 使用命令行工具构建ionic项目
- 算法导论 思考题 3-2
- duplicate symbols for architecture x86_64 clang