Android开发框架及注解的使用

Android开发框架及注解的使用

为什么需要框架?

很多时候有重复需要用的模块,比如,网络的模块,在APP开发中经常会使用到网络,而且获取不同的结果,那么需要我们来重复去写这些代码吗,并不需要,我们可以将其封装成一个功能模块,暴露出相应的接口只需传入参数就可以获取结果而不是自己一步步实现,大大简化了开发的时间提高了代码的效率

哪些内容可以做成框架?

  • 网络通讯模块
  • 数据库模块
  • UI基础模块
  • 图片缓存模块

好处

  1. 开发效率提升
  2. 代码更简洁
  3. 好统一管理
  4. 代码的复用性提高

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

  1. 下载两个jar包,可在上面的网盘上下载
  2. 打开AS,在libs文件夹里放入androidannotations-api-3.0.1.jar包
  3. 在最大的文件那里新建一个Directory,命名为compile-libs,把androidannotations-3.0.1.jar包复制进去
  4. 打开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'
    }
}
  1. 打开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可能就无法装到手机上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值