据说本书既是Android初学者的入门必备,也是Android开发者的进阶首选。那么就作一个读书笔记吧。 ###第1章:开始启程——你的第一行Android代码java
1.全貌 1.1Android系统架构 Linux内核层:显示驱动、音频驱动、照相机驱动、蓝牙驱动、WI-FI驱动、电源管理等。 系统运行库层:SQLite数据库、3D绘图支持、Dalvik虚拟机(5.0以后改成ART运行环境) 应用框架层:各类API 应用层:应用程序均属于这一层android
1.2安卓版本 API 19=4.4 版本、21为5.0、22为5.一、23为6.0、24为7.0 所需软件:JDK、Android Studio、Android Studio SDK AppCompatActivity 是一种向下兼容的Activity,能够将Activity的各个系统版本中增长的特性和功能最低兼容到Android2.1系统。数据库
第一行应用了一个插件,通常有两种值可选: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的菜单文件->建立两个菜单项->回到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模式、 六、多窗口模式编程 七、Lambda表达式
###第14章:开发酷欧天气 ###第15章:最后一步——将应用发布到360应用商店 1.生成正式签名和APK 2.多渠道打包 3.注册360发布程序 4.嵌入广告进行盈利