关于Android Library需要注意的细节

1. 设置库的资源为私有

我们都知道,库中的所有资源(res/目录的所有文件)在默认情况下均处于公开状态。如果不希望库的使用者访问这些资源,我们必须通过声明一个或多个公开资源的方式来使用这种自动私有标识机制。

具体做法:

在库的 res/value/ 目录下创建 public.xml 文件,添加 mylib_app_namemylib_public_string 为公开字符串资源。使用库的模块如果尝试引用库中的其他资源时,Lint会显示警告信息:

1
2
3
4
<resources>
    <public name="mylib_app_name" type="string"/>
    <public name="mylib_public_string" type="string"/>
</resources>

Android性能优化中的16ms问题(转)

转自:http://www.jianshu.com/p/a769a6028e51

前言

Android应用有一个明显的趋势—越来越多地使用动画效果来提升用户体验。但任何事情都是有代价的,丰富复杂的动画提升用户体验的同时,性能问题像隐形的恶魔一样,逐渐地侵蚀着你的应用。动画不流畅、界面卡顿开始困扰着你,逼着你进行性能优化。在这个优化过程中,最理想的标准就是绘制一帧的时间不要超过16ms。这是什么意思?让我们一探究竟。

GitHub pull request相关要点

  1. fork原项目到自己仓库
  2. 拉取自己仓库中fork的项目

    git clone 自己仓库地址

  3. 添加上游远程库的地址,否则无法追踪上游库的更新。这里指定上游库名为upstream

    git remote add upstream 远程库的地址

  4. 如果上游库有新的分支创建,自己仓库需要创建并切换到对应的分支。进行如下操作:

    git fetch upstream 下载上游库的所有变动

    git checkout 远程仓库新创建的分支名 此时分支对应的remote是上游库的

    git push --set-upstream origin 分支名(可以保持和上游仓库一致)

    此时你所在的分支的remote就是自己仓库的了。

  5. 开发,add,commit

  6. 拉取上游远程库的更新。可以参考http://blog.csdn.net/zhangdaiscott/article/details/17438153

    git pull upstream 远程库的分支名

  7. push到自己仓库

  8. 发送pull request

多线程_《Android开发进阶从小工到专家》读书笔记

3.1 Android中的消息机制

3.1.1 处理消息的手段——Handler、Looper与MessageQueue

  • 在Android应用启动时,会默认有一个主线程(UI线程),在这个线程中会关联一个消息队列,所有的操作都会被封装成消息然后交给主线程来处理。为了保证主线程不会主动退出,会将获取消息的操作放在一个死循环中,这样程序就相当于一直在执行死循环,因此不会退出。

3.2 Android中的多线程

3.2.1 多线程的实现——Thread和Runnable

  • Thread也是一个Runnable,它实现了Runnable接口,在Thread类中有一个Runnable类型的target字段,代表要被执行在这个子线程中的任务。

ubuntu将中文目录名改成英文(转)

参考链接:http://www.cnblogs.com/belinda/p/4056042.html

为了使用起来方便,装了ubuntu中文版,自然在home文件里用户目录的“桌面”、“图片”、“视频”、“音乐”……都是中文的。

很多时候都喜欢在桌面上放一些要操作的文件,linux里命令行操作又多,难免会用命令行操作桌面上的东西,那么就要 “cd 桌面”,打“桌面”的时候要输入法切换,麻烦……所以就想办法把用户目录下的路径改成英文,而其他的中文不变,方法如下:

打开终端,在终端中输入命令:

export LANG=en_US
xdg-user-dirs-gtk-update

跳出对话框询问是否将目录转化为英文路径,同意并关闭.
在终端中输入命令:

export LANG=zh_CN

关闭终端,账号登出或重启,系统会提示是否把转化好的目录改回中文。选择不再提示,并取消修改。主目录的中文转英文就完成了~

Android应用监听切换到后台/前台、熄屏的正确姿势

首先确保你的应用最低支持的API版本为14(Android 4.0 ICS)以上。

应用切换至后台

调用Application.onTrimMemory(int level),这个方法包含了一个等级叫TRIM_MEMORY_UI_HIDDEN,用于记录应用即将进入后台运行。

sample:

1
2
3
4
5
6
7
8
9
10
public class MyApplication extends Application { 
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
if (level == TRIM_MEMORY_UI_HIDDEN) {
isBackground = true;
notifyBackground();
}
}
}

《疯狂Java程序员的基本修养》读书笔记

去年读的电子版写的读书笔记兼目录,放出来温习一下😊

第1章 数组及其内存管理

1.1 数组初始化 p11

1.1.1 Java数组是静态的 p11

  • 数组静态初始化、动态初始化的sample p11

  • Java数组是静态的,一旦数组初始化完成,数组元素的内存空间分配即结束,程序只能改变数组元素的值,而无法改变数组的长度。

  • 数组变量也是一种引用类型的变量,指向堆内存的数组对象。

  • JS的数组可动态改变。

Android系统架构概览

首先是官网的架构图

Android stack

从图中可以看出,整个Android操作系统分为五层。它们分别是:

  1. 内核层(Linux Kernel),这一层包含了Linux Kernel以及Android定制的一些改动。除此之外,Android在Linux增加了一些定制的驱动,这些驱动通常与硬件无关,而是为了上层软件服务的,它们包括:

    • Binder: 进程间通讯(IPC)基础设施。Binder在Android系统中使用的地方非常多,几乎所有的Framework层的服务都是通过Binder的形式暴露出接口供外部使用的。
    • Ashmem 匿名共享内存。共享内存的作用是,当多个进程需要访问同一块数据时,可以避免数据拷贝。例如,经由ContentProvider接口获取数据的客户端和ContentProvider之间就是通过共享内存的方式来访问的。
    • lowmemorykiller 进程回收模块。在Framework层,所有的应用进程都是有ActivityManagerService来管理,它会根据进程的重要性设置一个优先级,这个优先级会被LMK读取。在系统内存较低时,LMK会根据进程的优先级排序,将优先级低的进程杀死,直到系统恢复到合适的内存状态。
    • logger 日志相关。开发人员经常会使用logcat读取日志来帮助分析问题。而无论是logcat工具,还是通过日志API写入日志,最终都是有底层的Logger驱动进行处理。
    • wakelock 电源管理相关。Android系统通常运行在以电池供电的移动设备上,因此专门增加了该模块来管理电源。
    • Alarm 闹钟相关,为AlarmManager服务。
  2. 硬件抽象层(HAL),该层为硬件厂商定义了一套标准的接口。这样可以在不影响上层的情况下,调整内部实现。

  3. Runtime和公共库层(Libraries & Android Runtime),这一层包含了虚拟机以及基本的运行环境。早期的Android的虚拟机是Dalvik,后来在Android 4.4 Google又引入了Android RunTime(ART)。

  4. Framework层,这一层包含了一系列重要的系统服务。对于App层的管理以及App 使用的API基本上都是在这一层提供的。这里面包含的服务很多,这里简单介绍一下最常见的几个服务:

    • ActivityManagerService:负责四大组件的管理(Activity,Service,ContentProvider,BroadcastReceiver)以及App进程管理
    • WindowManagerService:负责窗口管理
    • PackageManagerService:负责APK包的管理,包括安装,卸载,更新等
    • NotificationManagerService:负责通知管理
    • PowerManagerService:电源管理
    • LocationManagerService:定位相关
  5. 应用层(Applications),这是与用户直接接触的一层。大部分应用开发者都工作在这一层。

关于mipmap和drawable文件夹的区别

现在我们通过AS创建Android工程,会发现ic_launcher默认放在了mipmap文件夹下,而不是原来的drawable文件夹。那这个mipmap文件夹和drawable有啥区别呢?

关于mipmap

查了一下就是一种图形渲染技术

维基百科百科链接:Mipmap

两者的定义

首先查询google官方资料http://developer.android.com/intl/zh-cn/tools/projects/index.html#ApplicationModules,有如下这一段:

Android 6.0 运行时权限相关要点

2016.11.17更新:

如果已经了解运行时权限的基本使用,可以直接参考这篇文章:Android M 权限最佳实践


样例代码:https://github.com/kinneyyan/RuntimePermissionSample

1.新的权限机制

6.0开始将权限分为两类。

一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等。此类权限在应用安装时就被授予(同6.0之前)。

另一类是Dangerous Permission,一般是涉及到用户隐私的,在app使用时需要用户进行授权,比如读取sdcard、访问通讯录等。此类权限是分组的: