1. Android 环境 虚拟机的区别:
① JVM: .java --> javac --> .class --> jar --> .jar
架构: 堆栈
② DVM: .java --> javac --> .class --> dx.bat --> .dex
架构: 寄存器(cpu上一块高速的缓存)
模拟器启动失败:
需要配置ANDROID_SDK_HOME
指定一个非中文, 并且没有空格的文件夹
2.获得内存状态 --- 学习源码查找技巧
在 Android 源码的 /packages/apps 目录下,有很多系统的应用的源码,都是对外公开的。
找到settings ,拷出来,把它加入到 Eclipse ,使用 Android Project from Existing Code.
把Google源代码的工程导入进来,肯定是有错的,不要想着去把它运行起来。因为它可能调用了一些隐藏的 API,这些API 没有暴露出来,我们不能用。我们看到的都是暴露出来的。
// 获得sd卡的内存状态
File sdcardFileDir = Environment.getExternalStorageDirectory();
String sdcardMemory = getMemoryInfo(sdcardFileDir);
通过扇区大小,扇区总数相乘得到。
小知识:
1. 怎么在整个工程中 搜索某个String ?
答:在Package Explorer 中选中工程 ----> 按下 Ctrl + S ---->在弹出的 Search 窗口中 选 File Search. ----->填入 String ,点击 Search 按钮。
3. 单位
常见的密度比值:
240*320 的密度比值是: 0.75
320*480 的密度比值是: 1.0
480*800 的密度比值是: 1.5
float density = getResources().getDisplayMetrics().density;
1.0 * 160dp = 160px
0.75 * 160dp = 120px
1.5 * 160dp = 240px
4. android下单元测试:
在AndroidManifest.xml文件中配置一下信息:
在manifest节点下:
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.itheima28.junittest" />
在application节点下配置下面信息:
<uses-library android:name="android.test.runner" />
测试时, 定义一个类继承AndroidTestCase
5. 数据库
1). SQLiteOpenHelper --- 作用: 创建数据库,打开数据库,更新数据库
onCreate,onUpgrade,onOpen
① 创建表:
create table person(
_id integer primary key,
name varchar(20),
age integer
);
② 添加: insert into person(name, age) values('lisi', 19);
③ 删除: delete from person where _id = 1;
④ 修改: update person set name = '李四' where name = '王五';
⑤ 查询所有: select * from person;
⑥ 查询单条: select * from person where name = 'zhangsan';
2). 使用api方式查询数据库 ---- 不需要懂 SQL 语句
ContentValues values = new ContentValues();
values.put("name", person.getName()); // key作为要存储的列名, value对象列的值
values.put("age", person.getAge());
long id = db.insert("person", "name", values);
3). 事务:
update person set balance = balance - 100 where name = 'lisi';
update person set balance = balance + 100 where name = 'zhangsan';
// 开启事务
db.beginTransaction();
// 标记事务成功
db.setTransactionSuccessful();
// 停止事务
db.endTransaction();
快束插入1w 条数据:
1.每插入一条数据都要打开、关闭数据库
可以把它写成一个事务,全部插入完后再关闭数据库。
2》 Content Provider ---- 把自己的数据暴露给别人用,让其它人可以增删改查自己的数据
UriMatcher ----> 相当于 分机号
3》 权限
<permission> 自定义权限
<use_permission> 可申请 自定义权限
4》示列表的控件: ListView
MVC
mode 数据模型(List<Person>)
view 视图(ListView)
controller 控制器(把mode层的数据绑定到view上去)(Adapter适配器)
System.gc(); // 垃圾回收
6.短信、联系人
操作系统短信的uri: content://sms/
查询联系人: raw_contacts, data
① 查询:
1. 去raw_contacts表中取所有联系人的_id
2. 去data表中根据上面取到的_id查询对应id的数据.
content://com.android.contacts/raw_contacts
content://com.android.contacts/data
② 添加:
1. 在raw_contacts表中添加一个记录
2. 根据上面添加记录的id, 取data表中添加三条数据
内容观察者:
发件箱的uri: content://sms/outbox
Android not Responding(应用程序无响应) 阻塞了主线程 ANR异常
异常:
CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
只有原始的线程(主线程, ui线程)才能修改view对象.在子线程中修改view的显示状态, 会报上面异常.
http://localhost:8080/ServerItheima28/servlet/LoginServlet?username=%E6%9D%8E%E5%9B%9B&password=%E5%BC%A0%E4%B8%89
7. 多线程下载、断点下载
1》 多线程下载
① 怎么获得文件的总大小
② 怎么确定每个线程下载的大小,从哪开始下载 到哪下载结束
③ 怎么把每个线程的大小写到文件中去
④ 下载前应该检测一下SDcard 空间够不够
⑤ 动态添加进度条(有几个线程 显示几个进度条)
⑥ 下载完后 清除进度条
1. 进度条 可以在 子线程中更新 ---- 内部维护了 Handler 与 Message
2. Android 中子线程 3~5 个比较合理,不是越多越好。
拿单核举例,它是CPU 不断切换去执行子线程,线程太多 大部分时间花在切换上了。
2》断点下载
① 每个线程 把已下载的大小积存到一个 “.txt” 文件中 -----(专业点的作法:写到数据库中)
② 打开文件以“rwd” 方式打开,这样就会刷到磁盘中 而不仅是缓冲区 (rw方式 )
③ 每次写入的大小 [1024*1024] 缓冲越小 就越慢,因为定写入磁盘的次数更多
④ 如果断点下载的过程中再 中断了,业务逻辑
⑤ 下载完成后,删除临时文件 --- 在哪删除? 文件占用不能被删除?
⑥ 自定义子线程个数时,原来是5,中断后,再改成3 再断点下载就会出问题?怎么解决呢?
断点下载后 子线程个数不能改,如果改了就重载开始下载。
问1. Message.obtain() 与 new Message() 的区别?
答: Message.obtain() 会去检测消息池里有没有旧的消息,如果有就拿来用;没有再new Message()。
这样可以减少创建 消息的对象。
3》 解决了我动态布局弱点
① 在需要动态布局的地方加个 <LinearLayout>
② 把需要加进这个 <LinearLayout> 的view 写在一个layout布局中(外面不需要再套一层了);然后用 inflater转换成view
③ 调用 ll.addvView() ,把上面的view 加入到 <LinearLayout> 中,就行了。
8. 第5代 自然语言 打 酱油 (动+名)
显示意图 --- 直接指定谁来执行 (激活自己的应用中的组件)
隐式意图 --- 指定动作、数据 ,不关心由谁来执行
所以 <intent-infliter> 中要指定 action -- 动作,data --- 数据 ,miniType --- 类型,指定打的是酱油,
Category --- 附加的数据,说明 在什么情况下去打酱油
setData() 和 setType() 会互相清除对方的数据,怎么做到既指定 Data 又指定 Type 呢?
setDataAndType()
隐式意图 的好处:---- 应用程序之间没有耦合
当两个Activity 的 <intent-infliter> 一样时,就会弹出一个框 让你选择用哪个程序打开。同一意图 就关联了两个 Activity. 如 下载了几个视频播放器,点开一个视频文件就会弹出好多选择。
4》一个新知识点:
TextView 中也可以添加图片,在布局中加入 android:drawableLeft="@drawable/xx" 就可以在内容上下左右指定 图片。
① JVM: .java --> javac --> .class --> jar --> .jar
架构: 堆栈
② DVM: .java --> javac --> .class --> dx.bat --> .dex
架构: 寄存器(cpu上一块高速的缓存)
模拟器启动失败:
需要配置ANDROID_SDK_HOME
指定一个非中文, 并且没有空格的文件夹
2.获得内存状态 --- 学习源码查找技巧
在 Android 源码的 /packages/apps 目录下,有很多系统的应用的源码,都是对外公开的。
找到settings ,拷出来,把它加入到 Eclipse ,使用 Android Project from Existing Code.
把Google源代码的工程导入进来,肯定是有错的,不要想着去把它运行起来。因为它可能调用了一些隐藏的 API,这些API 没有暴露出来,我们不能用。我们看到的都是暴露出来的。
// 获得sd卡的内存状态
File sdcardFileDir = Environment.getExternalStorageDirectory();
String sdcardMemory = getMemoryInfo(sdcardFileDir);
通过扇区大小,扇区总数相乘得到。
小知识:
1. 怎么在整个工程中 搜索某个String ?
答:在Package Explorer 中选中工程 ----> 按下 Ctrl + S ---->在弹出的 Search 窗口中 选 File Search. ----->填入 String ,点击 Search 按钮。
3. 单位
常见的密度比值:
240*320 的密度比值是: 0.75
320*480 的密度比值是: 1.0
480*800 的密度比值是: 1.5
float density = getResources().getDisplayMetrics().density;
1.0 * 160dp = 160px
0.75 * 160dp = 120px
1.5 * 160dp = 240px
4. android下单元测试:
在AndroidManifest.xml文件中配置一下信息:
在manifest节点下:
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.itheima28.junittest" />
在application节点下配置下面信息:
<uses-library android:name="android.test.runner" />
测试时, 定义一个类继承AndroidTestCase
5. 数据库
1). SQLiteOpenHelper --- 作用: 创建数据库,打开数据库,更新数据库
onCreate,onUpgrade,onOpen
① 创建表:
create table person(
_id integer primary key,
name varchar(20),
age integer
);
② 添加: insert into person(name, age) values('lisi', 19);
③ 删除: delete from person where _id = 1;
④ 修改: update person set name = '李四' where name = '王五';
⑤ 查询所有: select * from person;
⑥ 查询单条: select * from person where name = 'zhangsan';
2). 使用api方式查询数据库 ---- 不需要懂 SQL 语句
ContentValues values = new ContentValues();
values.put("name", person.getName()); // key作为要存储的列名, value对象列的值
values.put("age", person.getAge());
long id = db.insert("person", "name", values);
3). 事务:
update person set balance = balance - 100 where name = 'lisi';
update person set balance = balance + 100 where name = 'zhangsan';
// 开启事务
db.beginTransaction();
// 标记事务成功
db.setTransactionSuccessful();
// 停止事务
db.endTransaction();
快束插入1w 条数据:
1.每插入一条数据都要打开、关闭数据库
可以把它写成一个事务,全部插入完后再关闭数据库。
2》 Content Provider ---- 把自己的数据暴露给别人用,让其它人可以增删改查自己的数据
UriMatcher ----> 相当于 分机号
3》 权限
<permission> 自定义权限
<use_permission> 可申请 自定义权限
4》示列表的控件: ListView
MVC
mode 数据模型(List<Person>)
view 视图(ListView)
controller 控制器(把mode层的数据绑定到view上去)(Adapter适配器)
System.gc(); // 垃圾回收
6.短信、联系人
操作系统短信的uri: content://sms/
查询联系人: raw_contacts, data
① 查询:
1. 去raw_contacts表中取所有联系人的_id
2. 去data表中根据上面取到的_id查询对应id的数据.
content://com.android.contacts/raw_contacts
content://com.android.contacts/data
② 添加:
1. 在raw_contacts表中添加一个记录
2. 根据上面添加记录的id, 取data表中添加三条数据
内容观察者:
发件箱的uri: content://sms/outbox
Android not Responding(应用程序无响应) 阻塞了主线程 ANR异常
异常:
CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
只有原始的线程(主线程, ui线程)才能修改view对象.在子线程中修改view的显示状态, 会报上面异常.
http://localhost:8080/ServerItheima28/servlet/LoginServlet?username=%E6%9D%8E%E5%9B%9B&password=%E5%BC%A0%E4%B8%89
7. 多线程下载、断点下载
1》 多线程下载
① 怎么获得文件的总大小
② 怎么确定每个线程下载的大小,从哪开始下载 到哪下载结束
③ 怎么把每个线程的大小写到文件中去
④ 下载前应该检测一下SDcard 空间够不够
⑤ 动态添加进度条(有几个线程 显示几个进度条)
⑥ 下载完后 清除进度条
1. 进度条 可以在 子线程中更新 ---- 内部维护了 Handler 与 Message
2. Android 中子线程 3~5 个比较合理,不是越多越好。
拿单核举例,它是CPU 不断切换去执行子线程,线程太多 大部分时间花在切换上了。
2》断点下载
① 每个线程 把已下载的大小积存到一个 “.txt” 文件中 -----(专业点的作法:写到数据库中)
② 打开文件以“rwd” 方式打开,这样就会刷到磁盘中 而不仅是缓冲区 (rw方式 )
③ 每次写入的大小 [1024*1024] 缓冲越小 就越慢,因为定写入磁盘的次数更多
④ 如果断点下载的过程中再 中断了,业务逻辑
⑤ 下载完成后,删除临时文件 --- 在哪删除? 文件占用不能被删除?
⑥ 自定义子线程个数时,原来是5,中断后,再改成3 再断点下载就会出问题?怎么解决呢?
断点下载后 子线程个数不能改,如果改了就重载开始下载。
问1. Message.obtain() 与 new Message() 的区别?
答: Message.obtain() 会去检测消息池里有没有旧的消息,如果有就拿来用;没有再new Message()。
这样可以减少创建 消息的对象。
3》 解决了我动态布局弱点
① 在需要动态布局的地方加个 <LinearLayout>
② 把需要加进这个 <LinearLayout> 的view 写在一个layout布局中(外面不需要再套一层了);然后用 inflater转换成view
③ 调用 ll.addvView() ,把上面的view 加入到 <LinearLayout> 中,就行了。
8. 第5代 自然语言 打 酱油 (动+名)
显示意图 --- 直接指定谁来执行 (激活自己的应用中的组件)
隐式意图 --- 指定动作、数据 ,不关心由谁来执行
所以 <intent-infliter> 中要指定 action -- 动作,data --- 数据 ,miniType --- 类型,指定打的是酱油,
Category --- 附加的数据,说明 在什么情况下去打酱油
setData() 和 setType() 会互相清除对方的数据,怎么做到既指定 Data 又指定 Type 呢?
setDataAndType()
隐式意图 的好处:---- 应用程序之间没有耦合
当两个Activity 的 <intent-infliter> 一样时,就会弹出一个框 让你选择用哪个程序打开。同一意图 就关联了两个 Activity. 如 下载了几个视频播放器,点开一个视频文件就会弹出好多选择。
4》一个新知识点:
TextView 中也可以添加图片,在布局中加入 android:drawableLeft="@drawable/xx" 就可以在内容上下左右指定 图片。