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章读书笔记

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、访问通讯录等。此类权限是分组的:

Android中分割线的常见做法

背景

平时我们在开发中做分割线是非常频繁的事情,这里总结一下水平、垂直的实线、虚线的常见做法。对于垂直虚线给出了比较靠谱的解决方法。

水平、垂直实线

1 若是在LineayLayout中需要添加分割线,可以在布局文件中使用如下两个属性:

1
2
android:divider="@drawable"
android:showDividers = "middle|end|beginning|none"
  • android:divider:可以是图片文件,也可以是xml绘制的shape。
  • android:showDividers:
    • middle 在每一项中间添加分割线
    • end 在整体的最后一项添加分割线
    • beginning 在整体的最上方添加分割线
    • none 无

ActionBar&Toolbar自定义样式总结(使用Theme.AppCompat)

以下所有的配置都在style.xml中,使用Theme.AppCompat

  • 自定义ActionBar背景、标题字体样式(背景的自定义如果配合使用Toolbar完全可以设置colorPrimary属性,没必要用以下的方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<style name="CustomActionBarTheme" parent="@style/Theme.AppCompat">
<item name="android:actionBarStyle">@style/MyActionBar</item>
<item name="actionBarStyle">@style/MyActionBar</item>

<style name="MyActionBar" parent="@style/Widget.AppCompat.ActionBar">
<item name="android:background">#33B5E5</item>
<item name="background">@drawable/actionbar_bk</item>
<item name="android:titleTextStyle">@style/MyActionBarTitleText</item>
<item name="titleTextStyle">@style/MyActionBarTitleText</item>
</style>

<style name="MyActionBarTitleText" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textColor">#00FF00</item>
</style>
</style>
  • 自定义action button、overflow menu样式(overflow menu也就是我们通常在ActionBar右侧点击三个点出现的PopupMenu)