搭建一个android项目的准备工作
2016-09-05 17:35
417 查看
我们开始一个主流的android项目至少或者最好包含哪些内容呢
图片加载框架( fresco http://www.fresco-cn.org/ )
http网络框架(https://github.com/hongyangAndroid/okhttputils )
crash收集机制(bugly https://bugly.qq.com/v2/ )
多渠道打包( http://blog.csdn.net/szydwy/article/details/50854676 )
app统计、apk升级、推送等(友盟)
沉浸式的状态栏(https://github.com/D-clock/AndroidSystemUiTraining/tree/master/note)
http接口的数据缓存
统一的工具栏toolbar(https://github.com/D-clock/AndroidSystemUiTraining/tree/master/note)
统一对话框、toast、PopupWindows、SharePrefrence、log等使用工具类
注解框架Butterknife
基类的设计BaseActivity,BaseFragment等
viewpager+fragment模式懒加载
列出来的这些内容都是最基本的,当然以上这些根据自身项目需要自行增加或删除,就像沉浸式状态不需要也可以。
下面我们看下如何搭建项目,把上面这些基本功能加进来。
我们先来看下效果
公用的libray
项目使用传统的MVC架构,我们要新建一个libray项目,包括业务无关的逻辑,主工程引用此项目。
那么是哪些业务无关的的逻辑呢?
base包中存放的是业务无关的BaseActivity,BaseFragment
okhttp包中存放的是网络框架的封装补充
view包存存放一些共用的自定义控件
utils包中存放统一对话框、toast、PopupWindows、SharePrefrence、log等使用工具类
为什么要单独设计一个存放业务无关逻辑的library项目?
试想一下,随着项目的逐渐增大,引用的library越来越多,如果其他library也要使用网络访问,对话框等,是不是又得重新写一份。
如果我们有个共用的library,其他的library应用这个共用的,那么里面的类都可以共同使用了。
library中base包
BaseActivity的实现如下
在onResume()和onPause()中定义了友盟的统计,继承至BaseActivity的Activity 可以实现统计功能,当然也可以选择其他的第三方统计方式
oncreate中ButterKnife.bind(this);继承至BaseActivity的Activity可以方便使用ButterKnife
oncreate中调用initVariables();initViews(savedInstanceState);loadData();这3个abstract方法,继承至BaseActivity的Activity必须实现这3个方法,这样Activity看起来相对清晰
BaseIndicatorActivity实现
集成BaseIndicatorActivity,实现setTitles,getFragment方法可以很方便实现首页指示器导航,viewpager+fragment模式懒加载
utils包
ChannelUtil是多渠道打包工具类,不清楚的可以看下http://blog.csdn.net/szydwy/article/details/50854676,现在360渠道要单独加固,加固后会重新打包签名,META-INF下的渠道标识会删除掉,所以最后增加配置,从manifest中再读一次渠道号。
DialogUtils是统一的对话框工具类,参考https://github.com/afollestad/material-dialogs
实现如下:
定义了OnClickDialogLinstener ,如果以后要修改对话框样式,可以统一修改,使用的话:
ObjectCacheManager是缓存http接口数据使用,根据接口的入参做为缓存数据的key,自定义缓存时间,避免每次都重点内容请求网络,节省用户流量
主工程
我们看下主工程的包结构,将相应的activity、adapter、entity都放入各种对应的包中,小组内开发定义好统一的命名规范和编码规范。
首页使用首页DrawerLayout+FragmentTabHost+Toolbar
网络框架使用okhttp,使用鸿洋已经封装好的框架https://github.com/hongyangAndroid/okhttputils
图片框架使用facebok fresco http://www.fresco-cn.org/
关于框架的选择可根据实际情况自行选择
appstroe中定义需要调用的接口方法,使用起来比较清晰,直接查看IInfoSource就可以知道有哪些http接口
demo下载地址
图片加载框架( fresco http://www.fresco-cn.org/ )
http网络框架(https://github.com/hongyangAndroid/okhttputils )
crash收集机制(bugly https://bugly.qq.com/v2/ )
多渠道打包( http://blog.csdn.net/szydwy/article/details/50854676 )
app统计、apk升级、推送等(友盟)
沉浸式的状态栏(https://github.com/D-clock/AndroidSystemUiTraining/tree/master/note)
http接口的数据缓存
统一的工具栏toolbar(https://github.com/D-clock/AndroidSystemUiTraining/tree/master/note)
统一对话框、toast、PopupWindows、SharePrefrence、log等使用工具类
注解框架Butterknife
基类的设计BaseActivity,BaseFragment等
viewpager+fragment模式懒加载
列出来的这些内容都是最基本的,当然以上这些根据自身项目需要自行增加或删除,就像沉浸式状态不需要也可以。
下面我们看下如何搭建项目,把上面这些基本功能加进来。
我们先来看下效果
公用的libray
项目使用传统的MVC架构,我们要新建一个libray项目,包括业务无关的逻辑,主工程引用此项目。
那么是哪些业务无关的的逻辑呢?
base包中存放的是业务无关的BaseActivity,BaseFragment
okhttp包中存放的是网络框架的封装补充
view包存存放一些共用的自定义控件
utils包中存放统一对话框、toast、PopupWindows、SharePrefrence、log等使用工具类
为什么要单独设计一个存放业务无关逻辑的library项目?
试想一下,随着项目的逐渐增大,引用的library越来越多,如果其他library也要使用网络访问,对话框等,是不是又得重新写一份。
如果我们有个共用的library,其他的library应用这个共用的,那么里面的类都可以共同使用了。
library中base包
BaseActivity的实现如下
public abstract class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getContentViewResID()); ButterKnife.bind(this);//必须setContentView后调用 initVariables(); initViews(savedInstanceState); loadData(); } /** * 初始化变量,包括intent传递进来的数据 */ protected abstract void initVariables(); /** * 初始化控件 * @param savedInstanceState */ protected abstract void initViews(Bundle savedInstanceState); /** * layout xml * @return */ public abstract int getContentViewResID(); /** * 逻辑处理 */ protected abstract void loadData(); @Override protected void onResume() { super.onResume(); MobclickAgent.onResume(this); } @Override protected void onPause() { super.onPause(); MobclickAgent.onPause(this); } }
在onResume()和onPause()中定义了友盟的统计,继承至BaseActivity的Activity 可以实现统计功能,当然也可以选择其他的第三方统计方式
oncreate中ButterKnife.bind(this);继承至BaseActivity的Activity可以方便使用ButterKnife
oncreate中调用initVariables();initViews(savedInstanceState);loadData();这3个abstract方法,继承至BaseActivity的Activity必须实现这3个方法,这样Activity看起来相对清晰
BaseIndicatorActivity实现
public abstract class BaseIndicatorActivity extends AppCompatActivity { public String[] mTitles; public SimpleViewPagerIndicator mIndicator; public LazyViewPager mViewPager; protected Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; initViews(); setTitles(); initDatas(); initEvents(); } public abstract void initViews(); public abstract void setTitles(); public abstract int getFragmentCount(); public abstract Fragment getFragment(int posation); public void onPause() { super.onPause(); MobclickAgent.onPause(this); } @Override protected void onResume() { super.onResume(); MobclickAgent.onResume(this); } private void initEvents() { mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { mIndicator.setTextColor(position); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { mIndicator.scroll(position, positionOffset); } @Override public void onPageScrollStateChanged(int state) { } }); } private void initDatas() { mIndicator.setTitles(mTitles); LazyFragmentPagerAdapter lazyFragmentPagerAdapter = new LazyFragmentPagerAdapter(getSupportFragmentManager()) { @Override protected Fragment getItem(ViewGroup container, int position) { return getFragment(position); } @Override public int getCount() { return getFragmentCount(); } }; mViewPager.setAdapter(lazyFragmentPagerAdapter); mIndicator.setViewPager(mViewPager); }
集成BaseIndicatorActivity,实现setTitles,getFragment方法可以很方便实现首页指示器导航,viewpager+fragment模式懒加载
utils包
ChannelUtil是多渠道打包工具类,不清楚的可以看下http://blog.csdn.net/szydwy/article/details/50854676,现在360渠道要单独加固,加固后会重新打包签名,META-INF下的渠道标识会删除掉,所以最后增加配置,从manifest中再读一次渠道号。
mChannel = getAppMetaData(context,"UMENG_CHANNEL"); if(!TextUtils.isEmpty(mChannel)){ //保存sp中备用 saveChannelBySharedPreferences(context, mChannel); return mChannel; }
DialogUtils是统一的对话框工具类,参考https://github.com/afollestad/material-dialogs
实现如下:
public class DialogUtils { public interface OnClickDialogLinstener { public void clickOK(Dialog mBindDialog); public void clickCancel(Dialog mBindDialog); } public static void showMdDialog(Context context, String title, String ok, String cancel, final OnClickDialogLinstener onClickDialogLinstener) { new MaterialDialog.Builder(context) .title(title) .positiveText(ok) .negativeText(cancel) .onAny(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { if(which.ordinal()==0){ onClickDialogLinstener.clickOK(dialog); }else if(which.ordinal()==2){ onClickDialogLinstener.clickCancel(dialog); } } }) .show(); } public static void showDialog(Context context, final OnClickDialogLinstener onClickDialogLinstener, int title, int... buttons) { if (buttons.length == 1) { showMdDialog(context, context.getString(title), context.getString(buttons[0]), null, onClickDialogLinstener); } else if (buttons.length == 2) { showMdDialog(context, context.getString(title), context.getString(buttons[0]), context.getString(buttons[1]), onClickDialogLinstener); } } public static void showDialog(Context context, final OnClickDialogLinstener onClickDialogLinstener, String title, String... buttons) { if (buttons.length == 1) { showMdDialog(context, title, buttons[0], null, onClickDialogLinstener); } else if (buttons.length == 2) { showMdDialog(context, title, buttons[0], buttons[1], onClickDialogLinstener); } } }
定义了OnClickDialogLinstener ,如果以后要修改对话框样式,可以统一修改,使用的话:
DialogUtils.showDialog(getActivity(), new DialogUtils.OnClickDialogLinstener() { @Override public void clickOK(Dialog mBindDialog) { } @Override public void clickCancel(Dialog mBindDialog) { } },"showDialog", "cancel", "ok");
ObjectCacheManager是缓存http接口数据使用,根据接口的入参做为缓存数据的key,自定义缓存时间,避免每次都重点内容请求网络,节省用户流量
主工程
我们看下主工程的包结构,将相应的activity、adapter、entity都放入各种对应的包中,小组内开发定义好统一的命名规范和编码规范。
首页使用首页DrawerLayout+FragmentTabHost+Toolbar
网络框架使用okhttp,使用鸿洋已经封装好的框架https://github.com/hongyangAndroid/okhttputils
图片框架使用facebok fresco http://www.fresco-cn.org/
关于框架的选择可根据实际情况自行选择
appstroe中定义需要调用的接口方法,使用起来比较清晰,直接查看IInfoSource就可以知道有哪些http接口
demo下载地址
相关文章推荐
- 搭建一个属于自己的Mainframe 之 准备工作
- 谈谈作为一个五人团队的项目经理的心得之准备工作
- android项目开发准备工作
- 从零开始启动一个项目,需要哪些准备工作
- Nancy简单实战之NancyMusicStore(一):准备工作和搭建项目
- 用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM(三)——搭建Android开发环境,用Hibernate生成Android项目的Model层
- 实习前的准备工作:Android开发环境的搭建
- 从0到1 ,搭建一个android项目(仿券妈妈)
- 【Android】1、准备工作——软件安装与环境搭建
- 项目准备工作与环境搭建
- Android开发准备工作简单啦!---Android开发环境搭建及配置
- 项目期---项目的搭建的准备工作
- Android项目开发前准备工作(一)
- Android JNI(NDK)简单学习(环境搭建,创建一个JNI项目的基本流程)
- [ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 01 准备工作
- 学院有意找你开发一个“毕业论文选题管理”的软件,在正式承接本项目的开发任务之前,你认为需要做哪些前期准备工作。
- Android项目开发前准备工作(三)
- 从零开始启动一个项目,需要哪些准备工作
- 打开一个已经存在于工作空间的android项目
- Arms是一个整合了大量主流开源项目的Android Mvp快速搭建框架