Android开发笔记——android开发框架的使用说明
(2014-06-11 15:43:44)原文地址:http://www.eoeandroid.com/thread-325185-1-1.html
框架的说明
如果你想看ui方面的东西,这里没有,想要看牛X的效果这里也没有。这只是纯实现功能的框架,它的目标是节省代码量,降低耦合,让代码层次看起来更清晰。整个框架一部分是网上的,一部分是我改的,为了适应我的编码习惯,还有一部分像orm完全是网上的组件。在此感谢那些朋友们。
整个框架式的初衷是为了偷懒,之前都是一个功能一个jar,做项目的时候拉进去,这样对于我来说依然还是比较麻烦。最后就导致我把所有的jar做成了一个工具集合包。
有很多框架都含有这个工具集合里的功能,这些不一定都好用,因为这是根据我个人使用喜欢来实现的,如果你们有自己的想法,可以自己把架包解压了以后,源码拉出来改动下。
目前很多框架都用到了注解,除了androidannotations没有入侵我们应用的代码以外,其他的基本上都有,要么是必须继承框架里面的activity,要么是必须在activity的oncreat里面调用某个方法。
整个框架式不同于androidannotations,Roboguice等ioc框架,这是一个类似spring的实现方式。在整应用的生命周期中找到切入点,然后对activity的生命周期进行拦截,然后插入自己的功能。
框架的主要功能
其中分为以下几种:
1自动注入框架(只需要继承框架内的application既可)
2图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性)
3网络请求模块(继承了基本上现在所有的http请求)
4 eventbus(集成一个开源的框架)
5验证框架(集成开源框架)
6 json解析(支持解析成集合或者对象)
7 数据库(不知道是哪位写的 忘记了)
8 多线程断点下载(自动判断是否支持多线程,判断是否是重定向)
9 自动更新模块
10 一系列工具类
一 自动注入框架
1 无需继承任何BaseActivity
举例:普通activity
public class FourActivity extends Activity {
View xx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main4);
xx = find......;
//---------------------------------------------------------
组件的初始化
//---------------------------------------------------------
}
}
这其中我们会耗费大量的代码或者重复性的去些一些代码。特别是布局比较复杂的情况下。
如果用框架
@InjectLayer(R.layout.activity_main3)
public class ThirdActivity extends Activity {
@InjectView
View xx;
}
即可
像软件的说明页面,就是单纯的展示一个布局,那么就是
@InjectLayer(R.layout.activity_main3)
public class ThirdActivity extends Activity {
}
即可
整个ioc框架不需要你继承任何的acitivity,这样就保证了不会在你的代码结构层次上造成影响,因为有的时候你需要自己的BaseActivity来实现你公用的功能。
2 支持子父布局
如下图
这种情况下,对于一般的框架来说,做法有以下几种:
1 ActivityGroup 一般的ioc框架都需要继承框架内的activity,activitygroup会让很多框架用不了,现在ActivityGroup也是不提倡的了。
2 BaseActivity 一般的Ioc框架会需要你的BaseActivity 去继承框架内的activity
3 中间用fragment 这样的情况也一样,你的FragmentActivity必须继承它的activity才能实现ioc框架功能。
对于这个框架来说很容易实现
1 ActivityGroup 你不需要继承任何activity(实现方式如上面的例子)
2 BaseActivity
见代码:
首先是BaseActivity
@InjectPLayer(R.layout.activity_com)
public class BaseActivity extends Activity {}
其中R.layout.activity_com是包括上下导航的布局,中间是一个view
子activity只需要这么写即可
@InjectLayer(value = R.layout.activity_main, parent = R.id.common)
public class MainActivity extends BaseActivity {}
当然 又会有问题了,那么我上下导航里面的点击事件怎么绑定,怎么去初始化,难道要每一个子activity都要去写吗?
当然不需要
@InjectPLayer(R.layout.activity_com)
public class BaseActivity extends Activity {
@InjectInit
private void init() {
MeApplication.logger.s("公共类的初始化");
}
// 这里是第一种交互事件注入方式(单击)
@InjectMethod(@InjectListener(ids = { R.id.top, R.id.bottom }, listeners = { OnClick.class }))
private void click2(View view) {
Handler_TextStyle handler_TextStyle = new Handler_TextStyle();
switch (view.getId()) {
case R.id.top:
handler_TextStyle.setString("点击了顶部按钮(在基类中统一注册,也可以单独注册)");
handler_TextStyle.setBackgroundColor(Color.RED, 3, 5);
Toast.makeText(this, handler_TextStyle.getSpannableString(), Toast.LENGTH_LONG).show();
break;
case R.id.bottom:
handler_TextStyle.setString("点击了底部按钮(在基类中统一注册,也可以单独注册)");
handler_TextStyle.setBackgroundColor(Color.RED, 3, 5);
Toast.makeText(this, handler_TextStyle.getSpannableString(), Toast.LENGTH_LONG).show();
break;
}
}
}
如上 其中@InjectInit注解表示不管是在子activity还是父activity 都是在布局初始化完成以后才会调用,其先后顺序是
父布局layout->子布局layout->父布局ioc和事件绑定->子布局事件绑定。
父activity 中可以对所有的公用组件和事件进行初始化和绑定
还没完,又会有另一个问题,如果我某个页面下导航的a按钮和其他页面底部a按钮的功能不一样 要单独设置怎么办。
那么我们可以在子布局进行@InjectMethod和@InjectView进行事件绑定和组件注入,它们会覆盖父类中相同id的组件的操作
以下是view注入的方法说明:
@InjectPLayer
表示是Activity的setContentView
1 @InjectLayer(value = R.layout.activity_main2, parent = R.id.common, isFull = true, isTitle = true)
其中需要哪个参数就用哪个,value 是必须的如果只有layout可以这么写@InjectPLayer(R.layout.activity_com)。其中value 表示layout,parent表示它在父布局中所对应组件的id 如上图中中间显示区域的view的id。Isfull是否全屏,默认为false.isTitle 是否有标题,默认false;
@InjectView
自动注入view注解。
基本写法:
@InjectView
TextView test;
其中test表示它在xml中对应的Id为test
@InjectView(R.id.next2)
TextView test;
表示它在xml中对应的Id为next2
高级写法:
@InjectView(binders = { @InjectBinder(method = "click", listeners = { OnClick.class, OnLongClick.class }) })
Button next, next3, next4;
其中表示对id为next,next3,next4进行注解,其中binders 表示绑定了以下事件,binders 是个数组,也就是说可以用多个InjectBinder绑定多个事件,也可以用listeners = { OnClick.class, OnLongClick.class }来表示对组件注入了点击事件和长按事件
@InjectView(value = R.id.next2, binders = { @InjectBinder(method = "click", listeners = { OnClick.class }) })
Button button;
对于变量名和组件id不一致的view则需要设置value
Click 表示那些注入的事件触发以后所调用的方法,其必须在当前类内。
// 支持由参数和无参数 即click(View view)或者click() 当然click名字必须对于变量注解中的method = "click"
private void click(View view) {
switch (view.getId()) {
case R.id.next:
startActivity(new Intent(this, ThirdActivity.class));
break;
...
}
}
@InjectResource 1 @InjectResource
String action_settings;
@InjectResource
Drawable ic_launcher;
InjectResource支持string和drawable的注解
@InjectMethod 01 // 底部导航栏 子类覆盖父类
@InjectMethod(@InjectListener(ids = { R.id.bottom }, listeners = { OnClick.class, OnLongClick.class }))
private void click3(View view) {
Handler_TextStyle handler_TextStyle = new Handler_TextStyle();
handler_TextStyle.setString("点击了底部按钮 子类覆盖了父类");
handler_TextStyle.setBackgroundColor(Color.RED, 3, 5);
Toast.makeText(this, handler_TextStyle.getSpannableString(), Toast.LENGTH_LONG).show();
}
@InjectMethod是当我们对一个组件只需要触发而不需要find出来的时候用到。
ids 表示绑定哪些id,listeners 表示绑定哪些事件 这两个参数都是数组
当然 如果嫌注解字段太长,可以自己修改。整个view注入的相关到此结束。
以下是acitivity的生命周期
@InjectInit 1 @InjectInit
void init() {
MeApplication.logger.s("子类的初始化");
test.setText("初始化完成,第一个页面");
}
这个注解你在activity中添加到任何一个方法名上,那么,当所有的layout和所有的view以及事件绑定完毕以后,会第一个调用含有这个注解的方法。它相当于oncreat
注意:框架注解了整个activity的生命周期,@InjectOnNewIntent,@InjectPause,@InjectResume,@InjectRestart,@InjectStart,@InjectStop 其中OnDestroy无注解。如果Activity中有含有这些注解的方法 那么不同生命周期下会自动调用这些方法
必须继承框架类的application