bcoder

4月 122017
 

如下图,第二行的ImageView和TextView的layout_width属性都为wrap_content,layout_weight都为1,所以两者显示的权重并不是1:1

第四行ImageView和TextView的layout_width属性都为0dp,layout_weight都为1,所以两者显示的权重是1:1

笔者猜测应该是layout_content的值被优先计算,然后再计算layout_weight的值,所以造成第二行的问题

xml部局如下:

 

 

 Posted by on 2017-04-12
4月 122017
 

部局的xml如下:

部局的预览图如下

音乐标题(光辉岁月)的ellipsize属性为marquee,当设置专辑下面的当前播放进度的文本时音乐标题的marquee总是重新播放,应该是进度TextView的文本改变影响了父级的LinearLayout(按道理来说不应该影响的)。

解决办法:为父级的LinearLayout增加android:baselineAligned=”false”属性

 Posted by on 2017-04-12
4月 082017
 

一、下载Android6.0源码

大家可以从清华的镜像站下载源码库,具体参数https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/和网络上的教程

二、安装编译时需要的软件

直接连接Ubuntu速度比较慢,而且Ubuntu官方没有openjdk7的安装包了,所以更换更新源到国内的源,我把阿里和163的源都放进去了

1.先备份更新源

2. 增加阿里的源

3. 增加163的更新源

4. 执行一行apt-get update

5. 安装编译时需要的软件

三、开始编译

四、常见错误及解决办法

1.编译时出现unsupported reloc 43,解决方法如下:

It works to me:
in file /art/build/Android.common_build.mk, find out:

change to :

If it still not works,try this in your android root path: cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld

 Posted by on 2017-04-08
4月 032017
 

需要对Android中的sdcard目录进行扫描,获取文件列表,而且要对文件进行排序

本文使用了非递归的方式进行扫描,用一个栈保存需要扫描的文件夹,用while循环所有目录和文件

排序分为在内部排序和整体排序:

  • 内部排序即每扫描到一个文件夹就对这个文件夹内的文件进行排序,然后再扫描他的子文件夹(某些场景会用到这种要求)
  • 外部排序即扫描完所有的文件后再进行排序。

根据最后的测试,外部排序速度明显优于内部排序,内部排序的时间约是外部排序的1.3倍。

基于此优化使用排序,如果场景不允许可以先内部排序满足某些条件后再改为外部排序。

下面为文件扫描类的代码FileScanner.java

github项目地址:https://github.com/wintergoes/AndroidFunctionTestApplication

 Posted by on 2017-04-03
3月 202017
 

一、jni背景知识

  jni是Java Native Interface的缩写,jni并不是Android开发的特性,而是在java的早期版本中就已经支持了,用于java层和Native层进行通讯的中间桥梁,大部分情况下使用c和c++进行编写,也可以使用其他的语言编写,只要满足约定的接口就可以。

二、Jni的副作用

  Jni有以下副作用:

1、不再具有跨平台可移植性,如果移植到其他平台,需要开发Native层的相关代码

2、Native层的程序如果有问题将会导致java层的程序崩溃

三、开发步骤简述(Ubuntu 16 + openjdk-8-jdk)

  1、在java代码中定义Native函数,比如java文件名为JniTest.java

  2、使用javac编译java文件,javac JniTest.java

  3、使用javah工具传入java类名,生成native层的头文件,javah JniTest,此时目录下会有一个JniTest.h

  4、新建一个JniTest.cc的文件,并添加如下内容:

  5、将navtive层的代码编译成so库,命令如下:

  6、在java层使用System.loadLibrary(“jnitest”);加载动态库,并调用函数,见第1中的java代码

 

参考链接:

https://baike.baidu.com/item/JNI/9412164?fr=aladdin

 

 Posted by on 2017-03-20
3月 062017
 

1. 查看已创建的触发器
SELECT * FROM information_schema.TRIGGERS;
也可以使用
show triggers;

查询名字为my_trigger的触发器:
select * from information_schema.triggers where TRIGGER_NAME=’my_trigger’;

2. 删除已创建的触发器
drop trigger my_trigger;

 Posted by on 2017-03-06
3月 052017
 

转载自:http://blog.csdn.net/quqi99/article/details/51434248

SSH连接总是隔一段时间没有输入时就断开,解决办法如下:

方法一:修改服务端配置
sudo vi /etc/ssh/sshd_config
ClientAliveInterval 60 #服务端主动向客户端请求响应的间隔
ClientAliveCountMax 10 #服务器发出请求后客户端没有响应的次数达到一定值就自动断开
sudo restart ssh

方法二:修改客户端配置
sudo vi /etc/ssh/ssh_config #或~/.ssh/config

TCPKeepAlive=yes
ServerAliveInterval 60 #客户端主动向服务端请求响应的间隔

ssh -i <key-file> -o StrictHostKeyChecking=no -o TCPKeepAlive=yes -o ServerAliveInterval=30 ubuntu@<ip>

上面方式任选一种,我选客户端配置方式。

 

 Posted by on 2017-03-05  标签:
3月 012017
 

  本文总结了几种常用的补间动画效果,具体的使用方法请参考网络上的其他文章:

  先总结几点注意事项:

  • 如果是多个动画组成的动画系统,duration值最好会设置成相同的,否则Activity切换的时候会出现黑底
  • overridePendingTransition有的时候需要rebuild项目才有效果

  1.放大效果(附加淡入效果)

  在res/anim目录下新建zoomin.xml,并粘贴下面的代码

  2.缩小效果(附加淡出效果)

  在res/anim目录新建zoomout.xml,并粘贴下面的代码

  3. 淡入效果

  在res/anim目录新建fadein.xml,并粘贴下面的代码

  4. 淡出效果

  在res/anim目录下新建fadeout.xml,并粘贴下面的代码

  5. 纵向布幕拉开效果(自中间往上下拉开)

  在res/anim目录下新建open_verticaly_from_middle.xml,并粘贴下面的代码

  6.纵向布幕关闭效果(自上下往中间关闭) 

  在res/anim目录下新建close_verticaly_to_middle.xml,并粘贴下面的代码

  7. 从顶部进入

  在res/anim中建立文件slide_in_from_top.xml, 并粘贴下面的代码

  8. 从底部进入

  在res/anim中新建文件slide_in_from_bottom.xml, 并粘贴下面的代码

  9. 从顶部划出

  在res/anim中新建文件slide_out_to_top.xml, 并粘贴下面的代码

  10. 从底部划出

  在res/anim中新建文件slide_out_to_bottom.xml, 并粘贴下面的代码

 

 

 Posted by on 2017-03-01

startActivity流程分析

 分类:Android, Java 阅读 (1,161)  No Responses »
2月 212017
 

首先调用Activity.java中的startActivity

调用了另外一startActivity函数,增加了options参数,为避免过于复杂,我们使用options为null

实际上又调用到了startActivityForResult函数

同样,带options参数的startActivityForResult

我们这里假设mParent为null

然后调用Instrumentation的executeStartActivity

然后调用ActivityManagerService里的startActivity和startActivityAsUser

mStackSupervisor.startActivityMayWait函数

mStackSupervisor.startActivityLocked函数

调用函数mStackSupervisor.startActivityUncheckedLocked

调用函数ActiviyManagerService.checkGrantUriPermissionFromIntentLocked

调用函数ActivityStack.startActivityLocked

调用WindowManagerService.prepareAppTransition

调用函数ActivityStack.resumeTopActivityLocked

调用函数ActivityStack.startPausingLocked 开始pause当前Activity

调用函数ActivityManagerService.updateUsageStats 更新电池电量统计

调用函数mStackSupervisor.setFocusedStack

调用WindowManagerService.findFocusedWindowLocked 

调用函数WindowManagerService.updateFocusedWindowLocked

调用函数:mStackSupervisor.allPausedActivitiesComplete

 Posted by on 2017-02-21

对HandlerThread的理解

 分类:Android, Java 阅读 (2,075)  1 Response »
2月 202017
 

1.什么场景下需要使用HandlerThread

1). 比较耗时,不易于放在主线程中执行的操作(不考虑第2点使用其他线程方式也可以)

2). 有多个耗时操作需要后台执行(如果不嫌麻烦也可以考虑使用多个TThread)

2.HandlerThread的使用步骤

1). 创建HandlerThread对象

2). 执行start方法,启动HandlerThread的Looper循环

3). 在主线程中创建Handler对象并引用HandlerTherad的looper

4). 在Handler对象中加入各种消息的处理

5). 在需要的时候给步骤3创建的Handler对象发送消息

6). 不再需要HandlerThread的时候调用quit或者quitSafely停止HandlerThread

示例代码如下(没做各种错误处理,仅供参考):

测试时多次点击Download1和Download2按钮,handler对象就会按点击的顺序多次下载网页baid.com和bcoder.com

3. 要不要像Thread那样写一个HandlerThread的子类?

完全没有必要,因为真正程序执行部分都在handler的消息处理里

4. quit和quitSafely的区别?

 

5. HandlerThread的其它特点

1). HandlerThread中的多个操作是串行按序执行的,即任务1\任务2\任务3....,所以如果你想尽早的获得运行结果,不建议使用HandlerThread这种方式

6. 测试代码下载

LocaleTest