基础笔记1

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"  就可以在内容上下左右指定 图片。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值