版权声明:本文为博主徐松亮的原创作品,未经允许不得转载,多谢支持!QQ:5387603
推荐点击此链接:欢迎进入徐松亮博客一站式导航搜索(随时更新)
既然叫杂项笔记,就是说杂乱无章的笔记,此笔记的主要目的不是为了教学,而是用于本人学习过程中的点滴记录,之所以开放,就是希望能给新手及爱好者些许点滴概念性帮助。
目录
15,Android Studio的Project与Module概念
17,Android Studio的Project文件列表说明
19,Android 的静态分析工具Android StudioLint
20,Android Studio自动升级后项目卡在Gradle sync的解决方案
25,将原有的eclipse工程文件加载到Android studio
Thread/Looper/Handler/Message/Intent
1,开发环境搭建:
- Android Studio+JDK
- Android Studio下载
- http://www.android-studio.org/
- JDK下载:
- http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
- 版本管理
- GIT下载:https://git-scm.com/download/win,并注册
- 在Android配置GitHub:Android Studio---File---Settings---Version Control---GitHub
- 配置Git安装路径:Android Studio---File---Settings---Version Control---Git
- 上传项目:Android Studio---VCS---import into Version control---Share project on GitHub
- Android Studio下载
2,模拟器:Genymotion
- 下载地址 http://genymotion.en.softonic.com/
- 网站用户名密码:xxxxxxx@qq.com/xxxxxx
3,手机开启开发模式
- 设置---关于手机---版本号 连续点击即可使能显示开发者配置
- 设置---开发人员选项,使能下面项目
- 开发人员选项
- USB调试
- 监控ADB安装应用
- 通过USB验证应用
- 阳光下可读性提升
- 使用旧版DHCP客户端
4, APK
- 安装包,其实就是zip格式,解压后是Dex文件
- Dex:Dalive VM executes
5,反编译工具:
- AndroidKiller_v1.3.1
- 包含了apktool、dex2jar、jd-gui等工具
6,Android Studio编译C/C++
- 安装相关插件(SDK Manager---SDK Tools)
- NDK 能在Android上面使用C/C++代码工具集
- Cmake 外部构建工具
- LLDB Android Studio上面调试本地代码的工匠
7,官方文档:
- 需要翻墙访问:https://developer.android.com/index.html
8,SDK包说明:
9,Android尺寸
-
单位
- 建议: sp用于文字大小单位。dp用于其他元素
- px 像素
- in 英寸
- mm 毫米
- pt 磅 1/72英寸
- dp 基于density抽象单位,在160点/英寸屏幕,1dp=1px
- dip 等同于dp
- sp 同dp相似,但会根据字体大小缩放
-
手机分辨率
- 4:3
- VGA 640*480 (Video Graphics Array)
- QVGA 320*240 (Quarter VGA)
- HVGA 480*320 (Half-size VGA) mdpi
- SVGA 800*600 (Super VGA)
- 5:3
- WVGA 800*480 (Wide VGA) hdpi
- 16:9
- FWVGA 854*480 (Full Wide VGA) hdpi
- HD 1920*1080 High Definition
- QHD 960*540 hdpi
- 720p 1280*720 标清 xhdpi
- 1080p 1920*1080 高清 xxhdpi
- 4:3
10,Android体系结构:分为如下5层
11,Android studio主题(霸气黑主题)
- file---set---Appearance---Theme--→Darcula
12,Android Studio显示行号
- file---set---Editor---General--- Appearance---Show line numbers
13,Android studio常用快捷键
- Alt + Enter 自动纠错提示,如自动导入类等
- Ctrl + 左键 跳转到定义处
- shift + shift 查找
- Ctrl + N 快速打开类
- Ctrl+Shift+N 快速打开文件
- Ctrl + E 最近编辑的文档列表
- Shift + 单击 关闭文件
- Ctrl + [ ] 跳到大括号头尾
- Ctrl+Shift+ Backspace 跳到上次编辑
- Ctrl + F12 显示当前文件结构
- Ctrl + F7 当前元素在当前文件的引用 F3可选择
- Ctrl + / 注释 取消注释 //
- Ctrl+Shift+ / 注释 取消注释 /**/
- Ctrl + D 复制并粘贴当前行
- Ctrl+Alt+ L 格式化代码
- Ctrl+Alt+ Backspace 代码提示
- Ctrl+Shift+ F7 高亮显
- F3 跳转下一个高亮处
- ESC 取消高亮显示
- logt 生成TAG
- logd 打印log.d()
- loge 打印log.e()
14,Android studio配置SDK与JDK路径
- file---Other Settings---Default Project Structure
15,Android Studio的Project与Module概念
- Project 工作空间(可以含有多个Module)
- Module 具体项目
16, Android Studio的操作面板
- Project面板(浏览项目文件)
- Build Variants面板(设置当前项目编译参数:release/debug)
- Android Monitor面板(监控调试信息)
- 编辑区
- Gradle面板(自动构建工具,Gradle任务列表,双击即可执行)
17,Android Studio的Project文件列表说明
- Project有多种显示模式,我们以Android模式显示。
- Res文件夹介绍
- drawable 待用的图片文件
- layout 布局文件
- mipmap 图标文件
- values 存放多个*.xml文件,包括各种配置/数据文件。
- dimens.xml 用于定义尺寸常量值。
- strings.xml 用于定义字符串常量值。
- styles.xml 用于定义应用程序的style。
18,Android 的Activity模板
- 项目右键new---Activity里面包含众多模板。
19,Android 的静态分析工具Android StudioLint
- 菜单---Analyze---Inspect Code,能够检测潜在错误。
- 在Analyze中还有很多分析工具有待于发掘。
20,Android Studio自动升级后项目卡在Gradle sync的解决方案
- 打开android studio项目目
- gradle\wrapper\gradle-wrapper.properties这个文件
- 按文件中distributionUrl 对应的网址下载文件
- 将下载的zip文件放到如下路径,之后重启工程
- C:\Users\Administrator\.gradle\wrapper\dists\gradle-x.x-all\x\
21,常用文件类型
- 布局文件:activity_main.xml (res/layout) 界面
- 源码文件:MainActivity.java (java/…/) 实现界面交互
- 配置文件:AndroidManifest.xml (manifests/) 全局配置文件
- 样式定义:styles.xml (res/values/)
22,基本属性
- 尺寸
- match_parent 父控件匹配
- fill_parent 与match_parent完全相同,但建议只在Android2.2版本以下使用。
- wrap_content 全部内容扩展匹配
23,注释
- java 与C一样
- xml
- 单行注释 <!-- 注释 -->
- 多行注释 <![CDATA[ 多行注释 ]]>
24,控件的触发
- 可以在xml配置里面调用方法,但是因为不在java源码里,读取代码时不好找,所有部分程序员不这样操作。
- 在java中自己编写触发事件,这个比较常用。
25,将原有的eclipse工程文件加载到Android studio
- 加入页面 xml文件
- 更新宏定义 res-->values文件
- 更新图片 res-→drawable
- 编码统一 用BCompare将编码同意改为UTF-8
- 添加配置 更新 AndroidManifest.xml
26,Android屏幕元素层次结构
- android.view.View
- AnalogClock(小部件 时钟)
- ImageView(图片)
- ImageButton
- 1....1. ZoomButton
- QuickContactBadge
- ImageButton
- KeyboardView(键盘视图)
- ProgressBar(进度条)
- TextView(文本,可超链接)
- CheckedTextView
- Button(按钮)
- 1....1. CompoundButton
- 1....1.1. CheckBox
- 1....1.2. RadioButton
- 1....1.3. ToggleButton(有状态按钮)
- 1....1. CompoundButton
- Chronometer
- DigitalClock
- EditText(编辑文本,首写字母大写/数字/密码/...)
- 1....1. AutoComplete TextView(自动补全)
- 1....1.1. MultAutoCompletTextView
- 1....2. ExtractEditText
- 1....1. AutoComplete TextView(自动补全)
- SurfaceView(视频播放-游戏视频)
- ViewGroup(视图容器)
- AbsoluteLayout(绝对布局)
- 1....1. WebView
- KeyboardView
- 1....1. AbsListView
- 1....1.1. GridView
- 1....1.2. ListView
- 1....1.2.1. ExpandableListView
- 1....2. AbsSpinner
- 1....2.1. Gallery
- 1....2.2. Spinner
- 1....1. AbsListView
- UnearLayoue
- 1....1. RadioGroup
- 1....2. TabWidget
- 1....3. TableLayout
- 1....4. TableRow
- 1....5. ZoomControls
- RelativeLayout(相对布局)
- 1....1. DialerFilter
- 1....2. TwolineListltem
- SlidingDrawer(滑动式抽屉)
- FrameLayout(层布局)
- 1....1. DatePicker(日期控件)
- 1....2. TimePicker(时间控件)
- 1....3. GestureOverlayView
- 1....4. ViewAnimator
- 1....4.1. ViewFlipper
- 1....4.2. ViewSwitcher
- 1....4.2.1. ImageSwitcher
- 1....4.2.2. TextSwitcher
- 1....5. HorizontalScrollView
- 1....6. ScrollView
- 1....7. MediaController
- 1....8. TabHost
- AbsoluteLayout(绝对布局)
- ViewStub(指定一个布局,提高UI加载性能)
27,Android的主题
- 在AndroidManifest.xml中设置
- @android:style/Theme.Dialog 将一个Activity显示为能话框模式
- @android:style/Theme.NoTitleBar不显示应用程序标题栏
- @android:style/Theme.NoTitleBar.Fullscreen 不显示应用程序标题栏,并全屏
- Theme.Light 背景为白色
- Theme.Light.NoTitleBar 白色背景并无标题栏
- Theme.Light.NoTitleBar.Fullscreen 白色背景,无标题栏,全屏、
- Theme.Black 背景黑色
- Theme.Black.NoTitleBar 黑色背景并无标题栏
- Theme.Black.NoTitleBar.Fullscreen 黑色背景,无标题栏,全屏
- Theme.Wallpaper 用系统桌面为应用程序背景
- Theme.Wallpaper.NoTitleBar 用系统桌面为应用程序背景,且无标题栏
- Theme.Wallpaper.NoTitleBar.Fullscreen系统桌面为应用程序背景,无标题栏,全屏
- Translucent 半透明
- Theme.Translucent.NoTitleBar 半透明、无标题栏
- Theme.Translucent.NoTitleBar.Fullscreen 半透明、无标题栏、全屏
- android:theme="Theme.Panel"
- android:theme="Theme.Light.Panel"
28,Android创建UI的3种方式
- 在XML种创建
- 在Activity类种创建
- 混合使用动态创建和XML布局创建(XSL主选)
29,Android常用控件
- TextView
- EditText
- AutoCompleteTextView
- MultiAutoCompleteTextView
- Button
- ImageView
- ImageButton
- ToggleButton(有状态按钮)
- CheckBox
- RadioButton、RadioGroup
- DatePicker、TimePicker
- ProgressBar
- SeekBar(滑块)
- Spinner(下拉列表)
- ListView(列表容器)、Grid(网格)
30,关于R类
- 在编译时会自动生成R类,为/res文件夹所有资源创建索引项
- Java访问语法:[<package_name>.]R.<resource_type>.<resource_name>
- XML访问语法:
- @[<package_name>:]<resource_type>/<resource_name>
31,关于this
- 当前对象的引用
- 本类的成员变量
32,Android的两种事件处理机制
- 监听机制
- 回调机制
- 事件处理程序与事件侦听器
- onClick()
- OnClickListener()
- onLongClick()
- OnLongClickListener()
- onFocusChange()
- OnFocusChangeListener()
- onKey()
- OnKeyListener()
- onTouch()
- OnTouchListener()
- onMenuItemClick()
- OnMenuItemClickListener()
- onClick()
33,Android的4大组件
-
Activites
- 活动组件(对应窗体,用户交互)
- 显示指定控件 setContentView(View)
- 在AndroidManifest.xml中定义首先加载的组件
- 切换/激活
- 普通切换方法(有去无回)
- 1....1. startActivity(Intent)
- 应答模式切换(有来有回)
- 1....2. A1-->A2:startActivityForResult(intent,0)
- 1....3. A2-→A1:setResult(RESULT_OK,intent)
- 1....4. A1接受方法:onActivityResult()
- 普通切换方法(有去无回)
- 4种状态
- Runing 运行状态
- Paused 暂停状态
- Stoped 停止状态
- Killed 注销状态
- 程序员可以绝对Active的生,但是不能决定死,由Android栈自动管理。
- 生命周期方法
- onCreate() 创建
- onStart() 开始
- onResume() 恢复
- onPause() 暂停
- onStop() 停止
- onRestart() 重启动
- onStart() 开始
- onDestroy() 注销
- onCreate() 创建
-
Service
- 概念:
- 服务组件(后台工作)
- 生命周期
- 调用startService 启动:不随启动Activity的结束而停止。
- 调用bindService 启动:随解绑或Activity的结束而停止。
- 注册
- <service android:name=“.LocalService” />
- 两种启动方式
- Context.startService() --- Context.stopService()
- Context.bindService() --- Context.unbindService()
- 回掉方法
- onStartCommand()
- onBind()
- onCreate()
- onDestroy()
- 概念:
-
Broadcast Receivers
- 广播接收器
- 发送广播(发送Broadcast Intent)
- 普通广播 Context.sendBroadcast()
- 有序广播 Context.sendOrderBroadcast()
- Context.sendStickBroadcast()
- 生命周期:常驻/非常驻
- 方法
- onReceive() 不能处理耗时程序,几秒没执行完会出现ANR错误
- ANR:Application No Response
- onReceive() 不能处理耗时程序,几秒没执行完会出现ANR错误
- 流程
- 注册receiver
- 静态注册(常驻):在AndroidManifest.xml
- 动态注册(非常驻,跟随程序的生命):在Java中
- 在onStart()中注册
- 在onStop()中注销
- 调用sendBroadcast()发送广播
- 调用onReceive()处理广播
- 调用startService()方法启动服务
- 调用stopService()方法停止服务
- 注册receiver
-
ContentProviders
- 内容提供者(共享数据操作)
-
组件间通讯(Intents框架)
- 组件切换 Intent
- 组件间信息传递构成
- Action 动作
- Data 动作数据
- Category 一个类别字符串
- Type 类型
- component 目标组件类名称
- extras 其他(如:Bundle)
34,Activity与Fragment(碎片)
- Activity中融入Fragment是非常棒的。
35,Android调试信息打印---Log方法
- Log类位于android.util包中,继承自java.lang.Object类
- 方法
- Log.v 黑色 输出任何消息
- Log.d 蓝色 输出debug故障日志信息
- Log.i 绿色 输出一般提示性消息(Log.w + Log.e)
- Log.w 橙色 输出warning警告日志信息(+Log.e)
- Log.e 红色 输出错误信息
36,Android消息提示框---Toast
- 不会获得焦点,不能被单击。
- 根据设定时间自动消失
- 引入包
- import android.widget.Toast
- 显示提示内容:
- Toast.makeText(对象,内容,时长).show();
- 设置显示位置:
- toast.setGravity()
- toast.setMargin()
37,Android对话框---AlertDialog
- 创建:AlertDialog.Builder.create()
38,Android通知---Notofication
- 导入类
- import android.app.PendingIntent;
- import android.app.NotificationManager;
- import android.app.Notification;
- 步骤
- 获取NotificationManager 对象
- 初始化Notification对象
- 设置通知显示参数
- 发送通知
39,Android异常
- try{}catch(...){}
- 常见异常
- Exception 总异常(以下所有异常类的父类)
- ClassCastException 类型转换异常
- ClassNotFoundException 未找到相应类异常
- ArithmeticException 算术异常
- ArrayIndexOutOfBoundsException 数组下标越界异常
- ArrayStoreException 数组中包含不兼容的值的异常
- SQLException 操作数据库异常类
- NullPointerException 空指针异常
- NoSuchFieldException 字段未找到异常
- NoSuchMethodException 方法未找到异常
- NumberFormatException 字符串转换为数字异常
- NegativeArraySizeException 数组元素个数为负数异常
- StringIndexOutOfBoundsException 字符串索引超出范围异常
- IOException 输入输出异常
- IllegalAccessException 不允许访问某类异常
- InstantiationException 当应有程序使用Class类中的呢我Instance()方法创建一个类实例,而指定的类对象无法被实例化,抛出此异常。
- EOFException 文件已结束异常
- FileNotFoundException 文件未找到异常
- 运行时异常 (RuntimeException)
- NullPointerException 空指针异常
- ArrayIndexOutOfBoundsException 数组下标越界异常
- ArithmeticException 算术异常
- ArrayStoreException 数组中包含不兼容的值的异常
- IllegalArgumentException 非法参数异常
- SecurityException 安全性异常
- NegativeArraySizeException 数组元素个数为负数异常
40,Android的数据存储
-
SQLite
- 类型:NULL、Integer、Real、Text、Blob(大数据)
- 包android.database.sqlite的方法
- beginTransaction()
- close()
- delete()
- endTransaction()
- execSQL()
- insert()
- openOrCreateDatabase()
- query()
- rawQuery()
- update()
-
SharedPreference
- 本质是XML文件,常用于参数设置,无法条件查询
- 类型:boolean、int、float、long、String
- 步骤
- 根据Context获取SharedPreferences对象
- 利用edit()方法获取Editor对象
- 通过Editor对象存储key-value键值对数据
- 通过commit()方法提交数据
- 常用方法
- contains()
- edit()
- getAll()
- getXXX()
-
ContentProvider
- 所有应用程序共享的存储方式,音频视频图片通讯录等
- 提供URI对象,由“content://”、数据路径,标识ID组成
- 数据包装器,可以把SQLite包装起来,实现非路径访问
- 步骤:
- 在当前应用程序定义一个ContentProvider
- AndroidManifest.xml中注册此ContentProvider
- 其他程序通过ContentProvider和Uri获取数据
-
File
- 用于存储大数据量的数据
- 两种操作方式
- Java提供的IO流体(仅当前程序可见,卸载即删除)
- 1....1. openFileInput()
- 1....2. openFileOutput()
- Environment类(全局可操作)
- 1....1. getExternalStorageDirectory()
- Java提供的IO流体(仅当前程序可见,卸载即删除)
41,Android的回收
-
WeakReference
- 弱引用 只有它指向object,并且GC运行,则回收object
- 实例
import java.lang.ref.WeakReference;
public class WeakReferenceTest {
/**
* @param args
*/
public static void main(String[] args) {
A a = new A();
a.str = "Hello, reference";
WeakReference<A> weak = new WeakReference<A>(a);
a = null;
int i = 0;
while (weak.get() != null) {
System.out.println(String.format("Get str from object of WeakReference: %s, count: %d", weak.get().str, ++i));
if (i % 10 == 0) {
System.gc();
System.out.println("System.gc() was invoked!");
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
System.out.println("object a was cleared by JVM!");
}
}
- 结果
Get str from object of WeakReference: Hello, reference, count: 1
Get str from object of WeakReference: Hello, reference, count: 2
Get str from object of WeakReference: Hello, reference, count: 3
Get str from object of WeakReference: Hello, reference, count: 4
Get str from object of WeakReference: Hello, reference, count: 5
Get str from object of WeakReference: Hello, reference, count: 6
Get str from object of WeakReference: Hello, reference, count: 7
Get str from object of WeakReference: Hello, reference, count: 8
Get str from object of WeakReference: Hello, reference, count: 9
Get str from object of WeakReference: Hello, reference, count: 10
System.gc() was invoked!
object a was cleared by JVM!
-
SoftReference
- 强引用 当系统内存不足时才回收,并后续自动启动
- 实例
import java.lang.ref.SoftReference;
public class SoftReferenceTest {
/**
* @param args
*/
public static void main(String[] args) {
A a = new A();
a.str = "Hello, reference";
SoftReference<A> sr = new SoftReference<A>(a);
a = null;
int i = 0;
while (sr.get() != null) {
System.out.println(String.format("Get str from object of SoftReference: %s, count: %d", sr.get().str, ++i));
if (i % 10 == 0) {
System.gc();
System.out.println("System.gc() was invoked!");
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
System.out.println("object a was cleared by JVM!");
}
}
- 结果
Get str from object of SoftReference: Hello, reference, count: 1
Get str from object of SoftReference: Hello, reference, count: 2
Get str from object of SoftReference: Hello, reference, count: 3
Get str from object of SoftReference: Hello, reference, count: 4
Get str from object of SoftReference: Hello, reference, count: 5
Get str from object of SoftReference: Hello, reference, count: 6
Get str from object of SoftReference: Hello, reference, count: 7
Get str from object of SoftReference: Hello, reference, count: 8
Get str from object of SoftReference: Hello, reference, count: 9
Get str from object of SoftReference: Hello, reference, count: 10
System.gc() was invoked!
Get str from object of SoftReference: Hello, reference, count: 11
Get str from object of SoftReference: Hello, reference, count: 12
Get str from object of SoftReference: Hello, reference, count: 13
Get str from object of SoftReference: Hello, reference, count: 14
Get str from object of SoftReference: Hello, reference, count: 15
Get str from object of SoftReference: Hello, reference, count: 16
Get str from object of SoftReference: Hello, reference, count: 17
Get str from object of SoftReference: Hello, reference, count: 18
Get str from object of SoftReference: Hello, reference, count: 19
Get str from object of SoftReference: Hello, reference, count: 20
System.gc() was invoked!
Get str from object of SoftReference: Hello, reference, count: 21
Get str from object of SoftReference: Hello, reference, count: 22
Get str from object of SoftReference: Hello, reference, count: 23
Get str from object of SoftReference: Hello, reference, count: 24
Get str from object of SoftReference: Hello, reference, count: 25
Get str from object of SoftReference: Hello, reference, count: 26
Get str from object of SoftReference: Hello, reference, count: 27
Get str from object of SoftReference: Hello, reference, count: 28
42,网络通讯
-
使用HttpURLConnection访问网络
- 创建一个URL对象
- URL url=new URL(http://www.baidu.com);
- 利用HttpURLConnection对象从网络中获取数据
- HttpURLConnection conn=(HttpURLConnection)url.openConnection();
- 设置连接超时
- conn.setConnectionTimeout(6*1000);
- 对相应吗进行判断:
- if(conn.getResponseCode() !=200)throw new RuntimeException("请求url失败")
- 得到返回的数据流:
- InputStream is =conn.getInputStream();
- 输入流转为字符串
- String result=readData(is,"GBK");
- 关闭连接
- conn.disconnect();
- 创建一个URL对象
-
使用HttpClient访问网络
- 说明:增强版的HttpURLConnection,不执行JavaScript/不解析处理内容
- 创建HttpClient对象
- 创建请求方法的实例,并指定请求URL
- 发送请求参数
- 调用HttpClient对象的execute发送请求
- 调用HttpResponse的getAllHeaders()等方法获取响应
- 释放连接
43,更新UI
- Thread+Handler机制
- 由新线程发送消息,再由主线程Handler处理消息
- Handler对象发送消息方法
- postMessage()
- sendMessage()
- sendEmptyMessage()
- Handler对象接收消息方法
- handlerMessage()
- hasMessage()
- Handler消息机制的4个关键对象
- Handler 处理者
- Message 消息数据结构
- MessageQueue 消息队列
- Looper 每个线程中MessageQueue的管家
44,进入Shell
- 工具
- 路径:Android\sdk\platform-tools
- 工具:在终端中打入指令adb shell
- 注意
- 在360等各个软件助手开启时,命令出错,因为抢占端口。
45,问题解答(未完待续)
-
怎么能让程序持续运行
-
华为手机进入工厂设置(开启LOG)的神秘代码
- *#*#2846579#*#*
-
Thread/Looper/Handler/Message/Intent
- Handler 组件内用于线程间的通讯的消息队列
- Intent 组件间的通讯
- Looper 消息轮询器
- 发现新消息,调用handlemessage方法
- Message 消息
-
怎么能让程序持续运行
-
怎么能让程序持续运行
-
启动线程
-
怎么能让程序在各种屏幕都能运行
-
怎么设置开机自动启动
-
怎么设置程序升级
-
怎么把程序放到市场软件
-
源码被反编译后,怎么保证密码不泄漏
- 答:用不对称加密技术
- 答:用不对称加密技术