《第一行代码:Android(第2版)》,作者郭霖

听说本书既是Android初学者的入门必备,也是Android开发者的进阶首选。那么就做一个读书笔记吧。

第1章:开始启程——你的第一行Android代码

1.全貌
1.1Android系统架构
Linux内核层:显示驱动、音频驱动、照相机驱动、蓝牙驱动、WI-FI驱动、电源管理等。
系统运行库层:SQLite数据库、3D绘图支持、Dalvik虚拟机(5.0之后改为ART运行环境)
应用框架层:各种API
应用层:应用程序均属于这一层

1.2安卓版本
API 19=4.4 版本、21为5.0、22为5.1、23为6.0、24为7.0
所需软件:JDK、Android Studio、Android Studio SDK
AppCompatActivity 是一种向下兼容的Activity,可以将Activity的各个系统版本中增加的特性和功能最低兼容到Android2.1系统。

build.gradle

第一行应用了一个插件,一般有两种值可选:com.android.application 表示这是一个应用程序模块,com.android.library 表示这个是一个库模块.
android 闭包:compileSdkVersion 指定编译版本、buildToolVersion用于指定项目构建工具的版本

android 闭包下 defaultConfig 闭包:applicationId 用于指定包名(以后修改可以在这里修改)、minSdkVersion 用于指定项目最低兼容的Android系统版本、targetSdkVersion 指定的值表示你在该目标版本上已经做过充分测试、versionCode 用于指定版本号、versionName 用于指定版本名

android 闭包下 buildTypes 闭包 :一般用于指定生成安装文件的相关配置,通常只会有两个闭包,一个是debug另一个是release.debug闭包用于指定生成测试版安装文件的配置,可以忽略不写。release闭包用于指定生成正式版本安装文件的配置。minifyEnabled 用于指定是否对项目代码进行混淆,true 表是混淆,false表示不混淆。proguardFiles 用于指定混淆时使用的规则文件,指定了两个文件,第一个是 proguard-android.txt 为通用规则,第二个是 proguard-rules.pro 特有的混淆规则。

dependencies 闭包:指定当前项目所有的依赖关系,本地依赖compile fileTree、库依赖、远程依赖compile。testCompile 是用于声明测试用例库的,暂时忽略它。

1.3日志工具
log.v log.d log.i log.w log.e
传入2个参数 第一个参数是tag 用于过滤,第二个是msg 是具体内容。
Show only selected application 表示只显示当前过滤。No Filters 表示没有。

第2章 先从看得到的入手——探究活动

1.活动Activity
所有的活动要在AndroidManifest.xml中进行注册才能生效。
在活动中使用Menu:右击res目录->New->Directory->输入文件夹名字menu,点击ok->接着在整个文件夹下新建一个名叫main的菜单文件->创建两个菜单项<item>->回到activity中重写onCreateOptionsMenu()方法->创建菜单响应事件重写onOptionsItemSelected()方法,在这个方法中通过item.getItemId判断点击的是哪个选项->重新运行程序就会发现标题栏右侧多了一个三点的符号,点击后显示内容。
销毁活动:finish();

2.Intent
一般用于启动活动,启动服务,发送广播等,传递数据时将putExtra();重载即可。
startActivityForResult()启动Activity,要在当前activity中运行onActivityResult()方法,根据第一个参数requestCode来判断消息来源。如果在第二个活动中通过back键回到第一个活动,要重写onBackPressed()方法解决这个问题。

3.活动的生命周期
Task任务,BackStack返回栈,栈是一种后进先出的数据结构。
活动状态分为 运行状态(位于栈顶)、暂停状态(不全屏)、停止状态(完全不可见)、销毁状态(移除)

生存期:
onCreate() 加载布局,绑定事件
onStart() 活动由不可见变为可见的时候调用
onResume() 在活动准备好和用户进行交互的时候调用,此时活动一定位于返回栈的栈顶
onPause() 在系统准备去启动或者恢复另一个活动的时候调用
onStop() 在活动完全不可见时调用,启动新的对话框活动,onPause() 会执行,这个不会执行
onDestroy() 在活动销毁之前调用
onRestart() 在活动由停止状态变为运行状态之前调用,活动被重新启动

活动的生命周期

4.活动回收
onSaveInstanceState() 会携带一个Bundle 类型的参数,Bundle 提供了一系列的putxxx方法用于保存数据,如果在活动A中重写这个方法,再打开活动B系统回收了A,要在活动A的onCreate()方法 对 saveInstanceState 进行判断 ,如果不等于空调用getxxx方法传入键便可获得保存的数据。也可以用Intent结合Bundle存储数据。

5.启动模式
standard 默认启动模式 创建实例添加到栈顶
singleTop 如果返回栈的栈顶已经是该活动 就不创建新实例 如果不是 就创建
singleTask 每次启动检查返回栈中是否有实例,如果有则直接使用,并把这个活动之上的所有活动统统出栈,如果没有就创建新实例。
singleInstance 回启动一个新的返回栈,允许其他程序调用,共享活动实例

6.实践
如何知晓当前是哪一个活动:新建一个BaseActivity普通java类,继承AppCompatActivity 重写onCreate 方法,在方法中 Log.d("BaseActivity",getClass().getSimpleName); 然后让其他activity继承Baseactivity 后观察log信息,进入哪个活动界面,该活动的类就会被打印出来。

随时随地退出程序:新建一个ActivityCollector类作为活动管理器,new 一个泛型为Activity的集合,编写add、remove、finish的方法(遍历集合如果!activity.isFinishing() 就activity.finish();)。修改BaseActivity的方法,在onCreate中调用add方法,在onDestroy中调用remove方法,从此想在任何地方退出程序,直接调用finish方法便可。当然还可以在销毁所有活动后面杀掉当前的进程,android.os.Process.killProcess(android.os.Process.myPid());

启动活动的最佳方法:在目标Activity中编写actionStart方法,在这个方法中完成Intent的构建,所有需要的数据都从方法参数传递过来,然后储存到intent中,在调用startActivity(intent);这样让启动变得简单。

第3章:软件也要拼脸蛋——UI开发的点点滴滴

1.如何编写程序界面
Textview 字体大小使用sp
gravity:center 等于 center_vertical|center_horizontal 表示文字在垂直和水平方向都居中对齐。
Button 系统会对button中所有英文字母进行大写转换 可通过 textAllCaps="false" 转换
EditText maxLines="2" 最大行数为2行
ProgressBar 默认圆形 水平进度条是 style="?android:attr/progressBarStyleHorizontal" max="100"
//设置最大值
AlertDialog 对话框
ProgressDialog 如果在setCancelable() 传入false 不能通过back键取消掉

2.布局
线性布局
layout_gravity 用于指定控件在布局中的对齐方式。当横向排列时,垂直方向对其才会生效。当竖向排列的时候,水平方向对其才会生效。
相对布局
在。。。之上下左右,在父布局上下左右。。。
帧布局
所有控件都默认摆放在左上角
百分比布局
添加依赖:compile 'com.android.support:percent:24.2.1'
.xml 文件中 最外层为<android.support.percent.PercentFrameLayout> 还必须定义一个app命名空间 才能使用百分比布局的自定义属性。

3.自定义控件
listview
RecyclerView 条目点击事件 可以 在adapter 的onCreateViewHolder 中 由 holder.xxx.setonClickListener 分别设置文字与图片的 点击事件。
制作.9图片

第4章:手机平板要兼顾——探究碎片

1.碎片 Fragment
动态添加Fragment、
碎片模拟返回栈 在提交事务前调用 addToBackStack()方法、
onAttach() 当碎片和活动建立关联时候调用的
onCreateView() 为碎片创建视图(加载布局)时调用
onActivityCreate() 确保与碎片相关联的活动一定已经完成创建完毕的时候调用的
onDestoryView() 当与碎片关联的视图被移除的时候调用
onDetach() 当碎片和活动解除关联的时候调用
在res目录下新建layout-sw600dp文件夹,在这个文件夹下新建activity_main.xml 布局,这就意味着当程序运行在屏幕宽度大于600dp的设备上时,会加载这个布局。
2.简易的新闻应用

第5章:全局大喇叭——详解广播机制

1.有序广播、无序广播

2.接收广播
动态:新建一个类继承Broadcast-Receiver 重写 onReceive() 方法。
网络发生变化时系统会发出 "android.net.conn.CONNECTIVITY_CHANGE" 这个广播
静态:静态的广播接收器一定要在AndroidManifest.xml文件中注册

3.发送自定义广播
标准广播:清单文件中注册广播,Intent 中传入广播的具体消息,通过sendBroadcast(intent)发送。
发送有序广播:sendOrderedBroadcast(intent,null); 可以在配置文件中通过 Android:priority 属性设置优先级 ,如果在广播中 调用abortBroadcast() 就可以拦截广播,后面无法再接收到

4.使用本地广播 ?
通过LocalBroadcastManager的getInstance()方法得到实例的。
无法通过静态注册方式接收

第6章:数据存储全方案——详解持久化技术

1.持久化技术
文件存储、SharedPreference、数据库存储

文件存储:FileOutputStream、FileInputStream
TextUtils.isEmpty() 可进行两种空值的判断 包括null 和 "".

SQLite 轻量级的关系型数据库 不仅支持SQL语法 还支持ACID事务
SQLiteOpenHelper.getReadableDatabase();
LitePal 增删改查数据库

第7章:跨程序共享数据——探究内容提供者

1.内容提供者

2.运行时权限
危险权限 一共9组24个、权限组名为:CALENDAR、CAMERA、CONTACTS、LOCATION、MICROPHONE、PHONE、SENSORS、SMS、STORAGE、
先判断用户是否给我们授权了用ContextCompat.checkSelfPermission()方法,第二个参数是权限名。如果未授权调用ActivityCompat.requestPermissions()方法向用户申请授权,第二个参数是String数组,将权限名放在数组中,第三个参数是请求码。系统会弹出一个对话框,无论选择哪个都会调用onRequest-permissionsResult()方法,可以在这个回调中处理业务。

3.访问其他应用的数据
getContentResolver()后 调用增删改查的方法,接收URI。查询后返回一个Cursor对象遍历后得到数据

4.创建自己的内容提供器
写一个类继承ContentProvider重写6个方法,onCreate() 返回true 表示初始化成功。query() 查询、insert() 添加、update() 升级、delete() 删除、getType() 根据传入的内容URI返回MIME类型。

第8章:丰富你的程序——运用手机多媒体

1.通知 Notification
使用V4库中提供NotificationCompat类,new NotificationCompat.Builder(content).build();当点击通知的时候就会启动延时意图PendingIntent 传入intent 打开界面。通过创建通知时调用 setContentIntent(pi)添加进去,如果要点击取消 连缀一个 setAutoCancel()方法 传入true 点击后就会取消。如果连缀 setSound()方法并传入一个Uri参数,那么就可以接到通知的时候播放一段音频。如果连缀setVibrate()传入长整型的数据 用于设置手机震动的时长,单位是毫秒,如果使用要添加震动的权限。如果连缀setLights()传入 颜色和两个时长 就会启动手机led灯,如果想直接使用默认的铃声和震动 那么调用setDefault()方法,传入DEFAULT_ALL即可。
如果构建出富文本的 通知内容调用setStyle()方法。设置通知最高级别调用setPriority()方法。

2.调用摄像头和相册
Demo1摄像头拍照后显示图片.
Demo2选择相册中的图片

3.播放多媒体文件
播放音频、播放视频

第9章:看看精彩的世界——使用网络技术

1.WebView用法

2.使用HTTP协议访问网络
HttpURLConnection connection=(httpurlconnection)url.openConnection();就得到了实例,设置setRequestMethod("GET") 表示希望从服务器那里获取数据,而post则表示希望提交数据给服务器。setConnectTimeout(8000)设置连接超时,setReadTimeout(8000)设置读取超时。调用getInputStream()读取输入流,最后调用disconnect()将http连接关闭掉。

使用okhttp访问网络。

3.解析数据
XML格式是数据
Pull 解析、SAX 解析、
JSON格式数据
JSONObject 解析、GSON解析、

第10章:后台默默的劳动者——探究服务

1.服务Service
2.Android多线程编程

@Override
public void run(){
//具体的逻辑
  }
}).start();

使用AsyncTask 里边有4个方法,onPreExecute() 方法会在后台任务开始执行前调用、deInBackground(Params...) 方法都会在子线程执行、onProgressUpdate(Progress...) 在这个方法可以对UI进行操作、onPostExcute(Result) 当后台执行完毕后调用。

3.服务的基本用法
写一个类继承Service 重写onBind()、 onCreate()、onStartCommand 和 onDestroy() 其中 onStartCommand 方法每次服务启动的时候都会调用,每个服务都需要在清单文件中注册。
启动服务 startService(intent),stopService(intent)停止服务。

活动和服务通信:在服务的onBind()中 return mBinder; 在Activity中 new ServiceConnection(){}重写 onServiceConnected()方法,通过向下转型得到binder实例调用 Binder类中的任何public方法,当绑定服务时调用 bindService()方法绑定Activity和Service,传入 3个参数 第一个是intent 第二个是ServiceConnection的实例,第三个是标志位传入 BIND_AUTO_CREATE 表示活动和服务绑定后会自动创建服务,使服务的onCreate()方法得到执行,但是onstartCommand()方法不会执行。解除绑定调用unbindService()方法。

4.服务的生命周期
startForeground()方法 传入id和Notification对象,可以让服务变为前台服务。
IntentService 写一个类继承IntentService实现onHandleIntent()方法,这个方法在子线程运行,可以处理一些具体逻辑。

第11章:Android特色开发——基于位置的服务

1.百度地图

第12章:最佳的UI体验——Material Design实战

1.material design
ToolBar、DrawerLayout、NavigationView、FloatingActionButton、Snackbar、CoordinatorLayout、CardView、AppBarLayout、SwipeRefreshLayout、CollapsingToolbarLayout(可折叠的标题栏)、

第13章:继续进阶——你还应该掌握的高级技巧

1.全局获取Context
2.使用Intent传递对象
实现Serializable、实现Parcelable、
3.定制自己的日志工具
4.调试Android程序
5.创建定时任务
Alarm机制、Doze模式、
6、多窗口模式编程
7、Lambda表达式

第14章:开发酷欧天气

第15章:最后一步——将应用发布到360应用商店

1.生成正式签名和APK
2.多渠道打包
3.注册360发布程序
4.嵌入广告进行盈利

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,881评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,052评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,598评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,407评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,823评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,872评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,037评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,778评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,505评论 1 247
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,745评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,233评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,231评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,141评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,939评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,954评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,784评论 2 275

推荐阅读更多精彩内容