Android开发框架及注解的使用
为什么需要框架?
很多时候有重复需要用的模块,比如,网络的模块,在APP开发中经常会使用到网络,而且获取不同的结果,那么需要我们来重复去写这些代码吗,并不需要,我们可以将其封装成一个功能模块,暴露出相应的接口只需传入参数就可以获取结果而不是自己一步步实现,大大简化了开发的时间提高了代码的效率
哪些内容可以做成框架?
- 网络通讯模块
- 数据库模块
- UI基础模块
- 图片缓存模块
好处
- 开发效率提升
- 代码更简洁
- 好统一管理
- 代码的复用性提高
AndroidAnnotations 开源框架
官网:
http://androidannotations.org/
使用介绍:
http://www.cnblogs.com/caobotao/p/5138935.html
使用注解能减少很多代码量,例如 findViewById()
bookmarkList = (ListView) findViewById(R.id.bookmarkList);
改成用注解—》@ViewById 就能直接初始化
@ViewById
ListView bookmarkList;
可以去看官方文档
https://github.com/androidannotations/androidannotations/wiki/AvailableAnnotations
在ANDROID STUDIO配置AndroidAnnotations
AndroidAnnotation jar包下载:
http://pan.baidu.com/s/1dF9P58d 密码:px7u
- 下载两个jar包,可在上面的网盘上下载
- 打开AS,在libs文件夹里放入androidannotations-api-3.0.1.jar包
- 在最大的文件那里新建一个Directory,命名为compile-libs,把androidannotations-3.0.1.jar包复制进去
- 打开project 的 builder.gradle,添加一条classpath
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
//添加的classpath!!!
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
- 打开Mudule 的 build.gradle 添加以下代码
在apply plugin下面添加:
apply plugin: 'android-apt'
def AAVersion = '3.0.1'
在android{……}下面,dependencies{……}上面,添加:
apt {
arguments {
androidManifestFile variant.outputs[0].processResources.manifestFile
// androidManifestFile variant.processResources.manifestFile
resourcePackageName 'com.example.asus.hear'
}
}
在dependencies{……}里面:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
//添加的代码
apt "org.androidannotations:androidannotations:$AAVersion"
compile "org.androidannotations:androidannotations-api:$AAVersion"
}
然后重新sync就可以了。
常用的注解
【注意】在注册表上注册活动时,名字后面需要加上一个_,之后要用的时候也要用这个名字来用,例如:
<activity android:name=".SecondActivity_"></activity>
@EActivity
设置指定布局
@EActivity (R.layout.activity_main)
public class MainActivity extends Activity{……}
@ViewById
控件初始化
@ViewById(R.id.button)
Button button;
@ViewsById
初始化多个控件并放到集合当中
@ViewsById({R.id.textView2,R.id.textView3})
List<TextView> list;
@Click
添加点击事件
@Click(R.id.button)
public void start(){
Intent intent = new Intent(MainActivity.this, SecondActivity_.class);
startActivity(intent);
}
//多个点击,用集合
@Click({R.id.button1,R.id.button2})
public void start()
@AfterViews
控件初始化之后完成的方法
@AfterViews
public void setTextView(){
textView.setText("Hello");
}
@Extra
获取Intent传递的参数,并判断是否为空
//在MainActivity中传递参数
Intent intent = new Intent(MainActivity.this,SecondActivity_.class);
intent.putExtra(NAME_KEY,"name");
startActivity(intent);
//在SecondActivity_中接受参数,用到@Extra
@Extra(MainActivity.NAME_KEY)
String name;
@LongClick
添加长按监听事件
@LongClick
public void longclick(){
//长按之后的操作代码
}
@ItemClick
用于列表的Item点击事件
@ItemClick(R.id.listView)
public void listViewItemClick(){
//点击事件的操作
}
重温一下BaseAdaper的使用:
1. 创建一个类继承BaseAdapter
2. 创建构造方法
3. 修改getCount()方法返回值为list.size()
4. 修改getItem()方法返回值为list.get(position)
5. 修改getItemId返回值为position
6. 重写getView(),设置item内容
@ItemLongClick
列表的item的长按事件
@ItemLongClick(R.id.listView)
public void longClick(){
//长按的操作
}
@Touch
给View添加监听事件,和上面的用法一样
@Background
用于处理后台任务,添加一个子线程,不需要用new thread
@Background
public void doSomething(){
//操作(这个操作是在子线程执行的)
}
@UiThread
在子线程中更新UI的操作
@Background
public void doSomething(){
//操作(这个操作是在子线程执行的)
updateUI();
}
@UiThread
public void updateUI(){
//更新UI的操作,这个操作如果放在子线程中执行,更新操作仍会在主线程中调用
}
@StringRes
在Values\strings.xml中定义的字符串, 直接在Java中使用,资源内容获取
@StringRes(R.string.name)
String name;
//字符串name初始化并赋值
@StringArrayRes
在Values\strings.xml中定义的一大堆数组类字符串,在Java代码中获取数组
@DimensionRes
在values\dimens.xml中配置宽度大小,Java代码中获取
@DimensionRes(R.dimen.text_size)
float size;
@NoTitle
@WindowFeature
去掉顶部的title
@WindowFeature({Window.FEATURE_NO_TITLE,Window.FEATURE_INDETERMINATE_PROGRESS })
@HttpsClient
工作原理
生成代码分析
标签的背后都是有相应的代码,标签本身不能做任何事情,只是后台对标签进行了相应的处理。
如何生成这些代码呢?
- 反射处理注解,
- 编译器编译时处理注解:AbstractProcessor, javax.lang.model.element包——对标签的描述
AbstractProcessor源代码中,init()方法操作初始化,process()方法
生成代码
Jcodemodel——通过Java语言生成相应的代码,通过相应的API构成相关的代码逻辑
官网:https://codemodel.java.net/
Android开发懒人库——Butterknife
提供的注解标签相对于AndroidAnnotations不够丰富
AndroidAnnotations常见开发错误
要注册同名的activity_
例如MainActivity在Manifest中注册,需要在名字后面加一个_
android:name="com.example.androidannotation.MainActivity_"
然后如果还是报错,就打开Project–Clean,重新编译
View使用修饰符在Java中实例化不能用private修饰,可以用protect
用了注释的方法不能是private的
因为后台代码需要重新生成代码来调用,私有化之后就不能被调用了,所以会报错。
需要重点学习框架的生成原理,设计原理,怎么实现的
比较复杂的软件不要用AndroidAnnotation,注解只适合用在一些小型和中型的项目。一般来说,一个APP最多能支持65536个方法,一旦超过这个数量,APP可能就无法装到手机上。