Android框架总结
来源:互联网 发布:淘宝怎样报名天天特价 编辑:程序博客网 时间:2024/06/14 22:28
构建Android框架都需要事先做哪些准备呢,最近研究Android框架,我们首先分析界面都需要哪些相同的控件为提取出来为以后使用的时候提供方便。
BaseApplication :
主要作用是管理activity,入栈出栈和退出整个应用
public class EBaseApplication extends Application { public static final String TAG = EBaseApplication.class.getSimpleName(); private RequestQueue mRequestQueue; private static EBaseApplication mInstance; public EBaseApplication() { } public void onCreate() { super.onCreate(); mInstance = this; } public static synchronized EBaseApplication getInstance() { return mInstance; } public RequestQueue getRequestQueue() { if(this.mRequestQueue == null) { this.mRequestQueue = Volley.newRequestQueue(this.getApplicationContext()); } return this.mRequestQueue; } public <T> void addToRequestQueue(Request<T> req, String tag) { req.setTag(TextUtils.isEmpty(tag)?TAG:tag); this.getRequestQueue().add(req); } public <T> void addToRequestQueue(Request<T> req) { req.setTag(TAG); this.getRequestQueue().add(req); } public void cancelPendingRequests(Object tag) { if(this.mRequestQueue != null) { this.mRequestQueue.cancelAll(tag); } }}
public class BaseApplication extends EBaseApplication { private Stack<Activity> activityStack; private BaseApplication instance; @Override public void onCreate() { super.onCreate(); instance = this; } /** * 添加Activity到堆栈 */ public void addActivity(Activity activity) { if (activityStack == null) { activityStack = new Stack<Activity>(); } activityStack.add(activity); } /** * 获取当前Activity(堆栈中最后一个压入的) */ public Activity currentActivity() { Activity activity = activityStack.lastElement(); return activity; } /** * 结束指定的Activity */ public void finishActivity(Activity activity) { if (activity != null) { activityStack.remove(activity); activity.finish(); activity = null; } } /** * 结束指定类名的Activity */ public void finishActivity(Class<?> cls) { for (Activity activity : activityStack) { if (activity.getClass().equals(cls)) { finishActivity(activity); } } } /** * 结束所有Activity */ public void finishAllActivity() { for (int i = 0, size = activityStack.size(); i < size; i++) { if (null != activityStack.get(i)) { activityStack.get(i).finish(); } } activityStack.clear(); } /** * 结束当前Activity(堆栈中最后一个压入的) */ public void finishActivity() { Activity activity = activityStack.lastElement(); finishActivity(activity); } /** * 退出应用程序 */ public void AppExit(Context context) { try { finishAllActivity(); ActivityManager activityMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); activityMgr.restartPackage(context.getPackageName()); System.exit(0); } catch (Exception e) { } }}
BaseActivity :把界面中共同的结构提取出来,比如标题栏toolbar,加载动画dialog,跳转到另外一个界面,toast展示,弹出信息提示框alertDialog,网络加载,数据加密等方法(url编码安全的base64编码Base64.encodeToString还有
HMAC-SHA1加密)
baseFragment和BaseActvity相似
Volley提供的功能
简单的讲,提供了如下主要的功能:
1、封装了的异步的RESTful 请求API;
2、一个优雅和稳健的请求队列;
3、一个可扩展的架构,它使开发人员能够实现自定义的请求和响应处理机 制;
4、能够使用外部HTTP Client库;
5、缓存策略;
6、自定义的网络图像加载视图(NetworkImageView,ImageLoader等);
把请求队列集中放到一个地方,最好是初始化应用程序类中初始化请求队列例如在baseapplication中
request = new StringRequest(Request.Method.POST, ApiUtils.MCINFO, this, this) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> map = new HashMap<>(); map.put("id", getIntent().getStringExtra("merchantId")); return map; } }; addToRequestQueue(request, ApiUtils.MCINFO, true);
@Override protected void doResponse(ResponseResult response) { JSONObject data = (JSONObject) response.getData(); marchantName.setText(data.getString("name")); marchantCount.setText(data.getString("phone")); merchantDesc.setText(data.getString("desc")); }
加载动画MaterialLoadingProgressBar
加载内容使用的类似于SwipeRefreshLayout的加载中指示器:MaterialLoadingProgressBar。有空专门写一下demo
弹出信息框使用NiftyDialogBuilder
/** * 弹出信息提示框 * * @param message * @param okClickListener */ public void alertDialog(String message, final View.OnClickListener okClickListener) { dialogBuilder = NiftyDialogBuilder.getInstance(this); dialogBuilder .withTitle("温馨提示") .withDialogColor(getResources().getColor(R.color.p_77_color)) .withIcon(R.mipmap.ic_launcher) .withButton1Text("确定") //def gone .withDuration(500) .withEffect(Effectstype.SlideBottom); dialogBuilder.withMessage(message).setButton1Click(new View.OnClickListener() { @Override public void onClick(View v) { if (okClickListener != null) okClickListener.onClick(v); dialogBuilder.dismiss(); } }); dialogBuilder.show(); }
NumberPicker来设置时间选择器
抽取出来EBaseAdapter继承baseadapter共同类,使用listview的时候只需要绘制界面就行
例如EbaseAdapter
public class EBaseAdapter extends BaseAdapter { private int[] mTo; private String[] mFrom; private List<? extends EBaseModel> mData; private EBaseAdapter.ViewBinder mViewBinder; private int mResource; private int mDropDownResource; private LayoutInflater mInflater; public EBaseAdapter(Context context, List<? extends EBaseModel> data, int resource, String[] from, int[] to) { this.mData = data; this.mResource = this.mDropDownResource = resource; this.mFrom = from; this.mTo = to; this.mInflater = (LayoutInflater)context.getSystemService("layout_inflater"); } public int getCount() { return this.mData.size(); } public Object getItem(int position) { return this.mData.get(position); } public long getItemId(int position) { return (long)position; } public View getView(int position, View convertView, ViewGroup parent) { return this.createViewFromResource(position, convertView, parent, this.mResource); } private View createViewFromResource(int position, View convertView, ViewGroup parent, int resource) { View v; if(convertView == null) { v = this.mInflater.inflate(resource, parent, false); } else { v = convertView; } this.bindView(position, v); return v; } public void setDropDownViewResource(int resource) { this.mDropDownResource = resource; } public View getDropDownView(int position, View convertView, ViewGroup parent) { return this.createViewFromResource(position, convertView, parent, this.mDropDownResource); } public void setmData(List<? extends EBaseModel> mData) { this.mData = mData; } private void bindView(int position, View view) { EBaseModel dataModel = (EBaseModel)this.mData.get(position); if(dataModel != null) { EBaseAdapter.ViewBinder binder = this.mViewBinder; String[] from = this.mFrom; int[] to = this.mTo; int count = to.length; for(int i = 0; i < count; ++i) { View v = view.findViewById(to[i]); if(v != null) { String[] properties = from[i].split("\\."); Object data = null; if(properties.length > 1) { EBaseModel text = (EBaseModel)dataModel.getValue(properties[0]); for(int bound = 1; bound < properties.length; ++bound) { data = text.getValue(properties[bound]); if(!(data instanceof EBaseModel)) { break; } text = (EBaseModel)data; } } else { data = dataModel.getValue(from[i]); } String var14 = data == null?"":data.toString(); if(var14 == null) { var14 = ""; } boolean var15 = false; if(binder != null) { var15 = binder.setViewValue(v, data, var14); } if(!var15) { if(v instanceof Checkable) { if(data instanceof Boolean) { ((Checkable)v).setChecked(((Boolean)data).booleanValue()); } else { if(!(v instanceof TextView)) { throw new IllegalStateException(v.getClass().getName() + " should be bound to a Boolean, not a " + (data == null?"<unknown type>":data.getClass())); } this.setViewText((TextView)v, var14); } } else if(v instanceof TextView) { this.setViewText((TextView)v, var14); } else { if(!(v instanceof ImageView)) { throw new IllegalStateException(v.getClass().getName() + " is not a " + " view that can be bounds by this SimpleAdapter"); } if(data instanceof Integer) { this.setViewImage((ImageView)v, ((Integer)data).intValue()); } else { this.setViewImage((ImageView)v, var14); } } } } } } } public EBaseAdapter.ViewBinder getViewBinder() { return this.mViewBinder; } public void setViewBinder(EBaseAdapter.ViewBinder viewBinder) { this.mViewBinder = viewBinder; } public void setViewImage(ImageView v, int value) { v.setImageResource(value); } public void setViewImage(ImageView v, String value) { try { v.setImageResource(Integer.parseInt(value)); } catch (NumberFormatException var4) { v.setImageURI(Uri.parse(value)); } } public void setViewText(TextView v, String text) { v.setText(text); } public interface ViewBinder { boolean setViewValue(View var1, Object var2, String var3); }}
使用的时候
baseAdapter = new EBaseAdapter(this, merchantBeans, R.layout.list_sub_merchant_item, new String[]{"merchantName", "merchantAddress", "phone"}, new int[]{R.id.subName, R.id.address, R.id.telphone}); subMerchantList.setAdapter(baseAdapter);
写一个Stringutils主要是String类型数据类型转化和判空,等于等等操作
这是我看项目总结出来的,不过对开发Android项目框架的搭建还是会有很大的帮助
- Android框架设计总结
- Android开发框架总结
- Android框架总结
- Android复习框架总结
- Android开发框架总结
- Android数据库框架总结
- Android RIL框架学习总结
- Android系统框架学习总结
- Android框架设计之-总结
- Android插件化框架总结
- Android View框架总结(一)
- Android总结——Android系统框架
- android中框架设计的小总结
- Android - Binder机制 - Binder框架总结
- Android 快速开发框架 最新总结
- Android网络框架总结Volley(一)
- Android网络框架总结Volley(二)
- Android各框架的总结及选型
- 二期 , 第二章 数据库的实现---- 课后作业--- 创建图书馆管理系统数据库
- UIView 透明 , 事件向下传递
- 设计模式大汇总,是时候来复习一波了
- Eclipse以 . 开头的文件(Eclipse显示忽略文件)
- java创建文件
- Android框架总结
- 添加Tab页切换效果
- Java 的方法签名与字段类型表示-[Ljava.lang.String;
- 单例模式
- 阿里云服务器被挖矿minerd入侵的解决办法
- 启动vsftpd报错
- 最好用的侧滑删除--SwipeLayout
- Groovy 和 Gradle (Android Studio)基础
- PlSQL DROP 表后找回表和数据