开源项目AndroidReview学习小结(1)
多看多学涨姿势
最近学习了一个开源项目,感觉收获颇多,这里做下简要的记录,首先感谢作者的开源。先看个大概图
感觉框架非常简单,界面也很一般,不过底层的处理的一些处理还是有很多可圈可点之处,代码的处理一看就是有工作经验的,下面将细细道来。项目在github传送门
启动
很经典的使用handler+子线程的延时加载方式,多了一个权限检查,应该是6.0系统中权限限制后需要用户手动设置,主要使用到一些系统intent的使用如启动应用设置的如
// 启动应用的设置
private void startAppSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
startActivity(intent);
}
需要在6.0系统做权限检查的可以去参考一下,顺便说一下,这里作者的处理方式是将相应的权限放置数组中检查权限,若是缺少通过startActivityForResult方式启动权限处理Actvity,处理完回调继续进行流程。
基类
稍微有点的经验的小伙伴写一个app时候都会先写上BaseActvity、BaseFragment,这里体现出很好的代码重用的思想。比如目前最常见的titlebar,每个Actvity都有,但是不同的Actvity的titlebar字段是不一样的,为了干掉冗余的代码可以都集成到基类中;Activity的入站管理等等,这些全局或者公共部分都可以放入一个基类
来看下作者的BaseActvity部分代码
public abstract class BaseActivity extends AppCompatActivity {
protected Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onBeforeSetContentLayout();
//禁止横屏省去在配置文件中逐个设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//base类中都会有App管理,将activity统一入栈,可以在退出时全局退出
AppManager.getAppManager().addActivity(this);
// 隐藏ToolBar
// hideToolBar();
Logger.d("当前Activity 栈中有:" + AppManager.getAppManager().getActivityCount() + "个Activity");
}
/**
* 隐藏ToolBar
*/
public void hideToolBar() {
if (getSupportActionBar() != null) {
getSupportActionBar().hide();
}
}
……
……
}
作者在基类中封装了titleBar、Actvity的入栈管理、禁止横屏。
titlebar
这个就不多说了Activty全局管理,
一般都是用一个工具类来分装AppManager.getAppManager().addActivity(this);将每个启动的Actvity加入到一个队列中管理,便于两次back全局退出或者按安全退出按钮。这个工具类后面会有分析禁止横屏
通常都是这样的,横屏之后actvity都会销毁重建处理起来不方面,直接禁止横屏得了,还有一种方式就是在配置文件中对需要禁止横屏的单独配置,这里通过代码全局禁止了横屏。
其他的部分一看作者就是从以前的项目中copy来的,那个TDevice关闭软键盘、状态栏兼容性,其实还可以在BaseAcivty中假如一些字体设置、actvity完结后的换场动画,actvity的透明度等等
再来看看作者的BaseFragment部分代码
只完成一件事,懒加载 重写了fragment中的setUserVisibleHint
public abstract class BaseFragment extends Fragment {
/**
* Fragment当前状态是否可见
*/
protected boolean isVisible;
protected boolean isCreate = true;
protected BaseActivity mActivity;
@Override
public void onAttach(Activity activity) {
this.mActivity = (BaseActivity) activity;
super.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 实现该方法即可实现可见再加载。不可见不加载的效果!!!
*
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isCreate = false;
if (getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
……
……
在继承的fragment中的onccreateView中还会配合使用缓存来判断是否需要再次加载
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (mRootView == null) {
mRootView = getRootView();
initArguments();//初始化参数
creatBaseViews();
createViewsOrListener();
}
//缓存的mRootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个mRootView已经有parent的错误。
ViewGroup parent = (ViewGroup) mRootView.getParent();
if (parent != null) {
parent.removeView(mRootView);
}
return mRootView;
}
这里多说一句,其实还有一种防止fragment每次重新加载方式,就是使用viewpager+fragment方式,在viewpager中
pager.setOffscreenPageLimit(2);这里表示每次缓存俩个fragmengt,作者这里采用FragmentTabHost方式搭建底部tab,只能对每个fragment进行处理
框架
这里作者采用的是 FragmentTabHost搭建的方式,个人比较不喜欢这种方式,首先,需要手动消除Tab切换时候按钮之间的分割线,而且不能够滑动切换比较僵硬,推荐radiobutton+viewpager+fragment,可以看看我早期写的一个demo简单app框架,不过作者使用枚举类处理fragment的方式让我眼前一亮,原谅我的少见多怪吧。
Indicator.actvity
public enum Indicator {
REVIEW(0, R.string.main_tab_name_review, R.drawable.tab_icon_review,
ReviewFragment.class),
TEST(1, R.string.main_tab_name_test, R.drawable.tab_icon_test,
TestFragment.class),
SETTING(2, R.string.main_tab_name_setting, R.drawable.tab_icon_other,
SettingFragment.class);
private int idx;
private int resName;
private int resIcon;
private Class<?> clz;
private Indicator(int idx, int resName, int resIcon, Class<?> clz) {
this.idx = idx;
this.resName = resName;
this.resIcon = resIcon;
this.clz = clz;
}
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public int getResName() {
return resName;
}
public void setResName(int resName) {
this.resName = resName;
}
public int getResIcon() {
return resIcon;
}
public void setResIcon(int resIcon) {
this.resIcon = resIcon;
}
public Class<?> getClz() {
return clz;
}
public void setClz(Class<?> clz) {
this.clz = clz;
}
}
在MainActivity中通过Indicator[] indicators = Indicator.values();就将枚举放到数组中了,这里values()方法是编译器添加的静态方法,Enum类中并没有该方法,该方法可以遍历枚举的实例。
再按一次退出应用
大家在使用App时经常会看到这个toast,这个项目中也可以学到,主要是在MainActivity中重写onKeyDown方法,再加上俩个工具类,DoubleClickExitHelper,AppManager(堆栈式管理Actvity)
MainActivity中重写onKeyDown方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return mDoubleClickExit.onKeyDown(keyCode, event);
}
return super.onKeyDown(keyCode, event);
}
如果你的app是侧滑式的需要判断一下抽屉是否打开,要是抽屉打开就关闭抽屉而不是退出
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if(mDrawerLayout.isDrawerOpen(GravityCompat.START)){
mDrawerLayout.closeDrawers();
return true;
}
return DoubleClickExit.onKeyDown(keyCode, event);
}
return super.onKeyDown(keyCode, event);
}
DoubleClickExitHelper工具类主要是使用handler方式获取到主线程的消息队列new Handler(Looper.getMainLooper());然后再onKyDown方法中延时处理,选择再按一次也许是防止用户点击出错吧。
关于网络
这里采用的bmob的云后台来管理数据,bmob提供一个云的数据库来存储我们的数据,传送门 已经弄了一个demo来玩了,挺不错的。下篇再继续介绍各个tab中的比较好的技术点。
开源项目AndroidReview学习小结(1)的更多相关文章
- 开源项目AndroidReview学习小结(2)
读书破万卷下笔如有神 作为入门级的android码农的我,还是需要多多研读开源代码 下面继续接着上一篇的分析,这一篇主要介绍第一个tab,ReviewFragment的分析,界面看起来简单,背后的逻辑 ...
- Android 开源项目及其学习
Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...
- 开源项目live555学习心得
推荐:伊朗美女找丈夫比找工作难女人婚前一定要看清三件事 × 登录注册 疯狂少男-IT技术的博客 http://blog.sina.com.cn/crazyboyzhaolei [订阅][手机订 ...
- 一个toolkit或者一个开源项目如何学习它并使用它
一个toolkit或者一个开源项目如何学习它并使用它 一般一个流行的toolkit和开源项目,一般都会被广泛地被应用: 那么,我们如何学习它,如何应用它在自己的业务场景中呢? 答案就是:学习源码并借鉴 ...
- iOS及Mac开源项目和学习资料【超级全面】
UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITable ...
- iOS开发--iOS及Mac开源项目和学习资料
文/零距离仰望星空(简书作者)原文链接:http://www.jianshu.com/p/f6cdbc8192ba著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 原文出处:codecl ...
- Android开源项目SlidingMenu学习(二)
前一篇SlidingMenu学习(一)文章中了解了导入SlidingMenu到我们项目经常出现的问题,下面我们正式学习. 先看一个效果: 看到两幅图片的差别了吗,左边的一栏时可以滑动的,可以隐藏掉,现 ...
- 分享海量 iOS 及 Mac 开源项目和学习资料
UI 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITable ...
- Github搭建属于自己的开源项目-androd学习之旅(72)
Github是一个基于的git的版本控制工具,分为私人代码管理和开源代码管理,下面我们简单的介绍一下 首先登陆官网https://github.com 完成注册,随后首页会有四个模块,第一个是安装的指 ...
随机推荐
- Android简易实战教程--第二十话《通过广播接收者,对拨打电话外加ip号》
没睡着觉,起来更篇文章吧哈哈!首先祝贺李宗伟击败我丹,虽然我是支持我丹的,但是他也不容易哈哈,值得尊敬的人!切入正题:这一篇来介绍个自定义广播接收者. 通常我们在外拨电话的时候,一般为使用网络电话.如 ...
- 1.使用C++封装一个链表类LinkList
使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...
- Android View框架总结(七)View事件分发机制
请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52282833 View布局告一段落,从本篇开始View事件相关分析, ...
- shell的数值计算,小数计算
shell脚本中,可以进行数值计算, 如加减乘除,通过expr.let.(())等完成,文章介绍:http://blog.csdn.net/longshenlmj/article/details/14 ...
- 【ShaderToy】跳动的心❤️
写在前面 注:如果你还不了解ShaderToy,请看开篇. 作为ShaderToy系列的第一篇,我们先来点简单的.下面是效果: (CSDN目前不能传gif文件了,暂时空缺,可以看下面的原shader效 ...
- 01 Android修改新建虚拟机存放的位置
创建的Android虚拟机(即AVD)的位置是在C盘的当前用户文件夹下(C:\Users\用户名\.android\avd) 这一默认设置不怎么好,特别是C盘空间吃紧的话. 这里提供2个解决办法(分2 ...
- J2EE学习从菜鸟变大鸟之七 Servlet
Servlet现在自己的理解是一个控制器,简单的可以理解为不同的JSP页面由用户发送过来的请求可以由Servlet控制器来控制其向下调用的方向(结合三层好理解),但它比较特殊,因为它通常会从外界接收数 ...
- 【Unity技巧】自定义消息框(弹出框)
写在前面 这一篇我个人认为还是很常用的,一开始也是实习的时候学到的,所以我觉得实习真的是一个快速学习工程技巧的途径. 提醒:这篇教程比较复杂,如果你不熟悉NGUI.iTween.C#的回调函数机制,那 ...
- React Native控件只TextInput
TextInput是一个允许用户在应用中通过键盘输入文本的基本组件.本组件的属性提供了多种特性的配置,譬如自动完成.自动大小写.占位文字,以及多种不同的键盘类型(如纯数字键盘)等等. 比如官网最简单的 ...
- 检查app的activity是否在当前
APP开发中经常会遇到这种需求,需要检查当前的APP是不是可见的,比如,如果是可见的就维持一个socket长连接,如果切到后台不可见了,就断开这个连接.Android本来并不允许APP去监听home键 ...