聽說本書既是Android初學者的入門必備粥谬,也是Android開發(fā)者的進階首選。那么就做一個讀書筆記吧衡创。
第1章:開始啟程——你的第一行Android代碼
1.全貌
1.1Android系統(tǒng)架構(gòu)
Linux內(nèi)核層:顯示驅(qū)動帝嗡、音頻驅(qū)動、照相機驅(qū)動璃氢、藍牙驅(qū)動哟玷、WI-FI驅(qū)動、電源管理等一也。
系統(tǒng)運行庫層:SQLite數(shù)據(jù)庫巢寡、3D繪圖支持、Dalvik虛擬機(5.0之后改為ART運行環(huán)境)
應用框架層:各種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的各個系統(tǒng)版本中增加的特性和功能最低兼容到Android2.1系統(tǒng)层皱。
第一行應用了一個插件,一般有兩種值可選:com.android.application 表示這是一個應用程序模塊赠潦,com.android.library 表示這個是一個庫模塊.
android 閉包:compileSdkVersion 指定編譯版本叫胖、buildToolVersion用于指定項目構(gòu)建工具的版本
android 閉包下 defaultConfig 閉包:applicationId 用于指定包名(以后修改可以在這里修改)、minSdkVersion 用于指定項目最低兼容的Android系統(tǒng)版本她奥、targetSdkVersion 指定的值表示你在該目標版本上已經(jīng)做過充分測試瓮增、versionCode 用于指定版本號怎棱、versionName 用于指定版本名
android 閉包下 buildTypes 閉包 :一般用于指定生成安裝文件的相關配置,通常只會有兩個閉包绷跑,一個是debug另一個是release.debug閉包用于指定生成測試版安裝文件的配置拳恋,可以忽略不寫。release閉包用于指定生成正式版本安裝文件的配置你踩。minifyEnabled 用于指定是否對項目代碼進行混淆诅岩,true 表是混淆,false表示不混淆带膜。proguardFiles 用于指定混淆時使用的規(guī)則文件吩谦,指定了兩個文件,第一個是 proguard-android.txt 為通用規(guī)則膝藕,第二個是 proguard-rules.pro 特有的混淆規(guī)則式廷。
dependencies 閉包:指定當前項目所有的依賴關系,本地依賴compile fileTree芭挽、庫依賴滑废、遠程依賴compile。testCompile 是用于聲明測試用例庫的袜爪,暫時忽略它蠕趁。
1.3日志工具
log.v log.d log.i log.w log.e
傳入2個參數(shù) 第一個參數(shù)是tag 用于過濾,第二個是msg 是具體內(nèi)容辛馆。
Show only selected application 表示只顯示當前過濾俺陋。No Filters 表示沒有。
第2章 先從看得到的入手——探究活動
1.活動Activity
所有的活動要在AndroidManifest.xml中進行注冊才能生效昙篙。
在活動中使用Menu:右擊res目錄->New->Directory->輸入文件夾名字menu,點擊ok->接著在整個文件夾下新建一個名叫main的菜單文件->創(chuàng)建兩個菜單項<item>->回到activity中重寫onCreateOptionsMenu()方法->創(chuàng)建菜單響應事件重寫onOptionsItemSelected()方法腊状,在這個方法中通過item.getItemId判斷點擊的是哪個選項->重新運行程序就會發(fā)現(xiàn)標題欄右側(cè)多了一個三點的符號,點擊后顯示內(nèi)容苔可。
銷毀活動:finish();
2.Intent
一般用于啟動活動缴挖,啟動服務,發(fā)送廣播等焚辅,傳遞數(shù)據(jù)時將putExtra();重載即可映屋。
startActivityForResult()啟動Activity,要在當前activity中運行onActivityResult()方法同蜻,根據(jù)第一個參數(shù)requestCode來判斷消息來源秧荆。如果在第二個活動中通過back鍵回到第一個活動,要重寫onBackPressed()方法解決這個問題埃仪。
3.活動的生命周期
Task任務,BackStack返回棧陕赃,棧是一種后進先出的數(shù)據(jù)結(jié)構(gòu)卵蛉。
活動狀態(tài)分為 運行狀態(tài)(位于棧頂)颁股、暫停狀態(tài)(不全屏)、停止狀態(tài)(完全不可見)傻丝、銷毀狀態(tài)(移除)
生存期:
onCreate() 加載布局甘有,綁定事件
onStart() 活動由不可見變?yōu)榭梢姷臅r候調(diào)用
onResume() 在活動準備好和用戶進行交互的時候調(diào)用,此時活動一定位于返回棧的棧頂
onPause() 在系統(tǒng)準備去啟動或者恢復另一個活動的時候調(diào)用
onStop() 在活動完全不可見時調(diào)用葡缰,啟動新的對話框活動亏掀,onPause() 會執(zhí)行,這個不會執(zhí)行
onDestroy() 在活動銷毀之前調(diào)用
onRestart() 在活動由停止狀態(tài)變?yōu)檫\行狀態(tài)之前調(diào)用泛释,活動被重新啟動
4.活動回收
onSaveInstanceState() 會攜帶一個Bundle 類型的參數(shù)滤愕,Bundle 提供了一系列的putxxx方法用于保存數(shù)據(jù),如果在活動A中重寫這個方法怜校,再打開活動B系統(tǒng)回收了A间影,要在活動A的onCreate()方法 對 saveInstanceState 進行判斷 ,如果不等于空調(diào)用getxxx方法傳入鍵便可獲得保存的數(shù)據(jù)茄茁。也可以用Intent結(jié)合Bundle存儲數(shù)據(jù)魂贬。
5.啟動模式
standard 默認啟動模式 創(chuàng)建實例添加到棧頂
singleTop 如果返回棧的棧頂已經(jīng)是該活動 就不創(chuàng)建新實例 如果不是 就創(chuàng)建
singleTask 每次啟動檢查返回棧中是否有實例,如果有則直接使用裙顽,并把這個活動之上的所有活動統(tǒng)統(tǒng)出棧付燥,如果沒有就創(chuàng)建新實例。
singleInstance 回啟動一個新的返回棧愈犹,允許其他程序調(diào)用键科,共享活動實例
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中調(diào)用add方法,在onDestroy中調(diào)用remove方法入挣,從此想在任何地方退出程序亿乳,直接調(diào)用finish方法便可。當然還可以在銷毀所有活動后面殺掉當前的進程,android.os.Process.killProcess(android.os.Process.myPid());
啟動活動的最佳方法:在目標Activity中編寫actionStart方法葛假,在這個方法中完成Intent的構(gòu)建障陶,所有需要的數(shù)據(jù)都從方法參數(shù)傳遞過來,然后儲存到intent中聊训,在調(diào)用startActivity(intent);這樣讓啟動變得簡單抱究。
第3章:軟件也要拼臉蛋——UI開發(fā)的點點滴滴
1.如何編寫程序界面
Textview 字體大小使用sp
gravity:center 等于 center_vertical|center_horizontal 表示文字在垂直和水平方向都居中對齊。
Button 系統(tǒng)會對button中所有英文字母進行大寫轉(zhuǎn)換 可通過 textAllCaps="false" 轉(zhuǎn)換
EditText maxLines="2" 最大行數(shù)為2行
ProgressBar 默認圓形 水平進度條是 style="?android:attr/progressBarStyleHorizontal" max="100"
//設置最大值
AlertDialog 對話框
ProgressDialog 如果在setCancelable() 傳入false 不能通過back鍵取消掉
2.布局
線性布局
layout_gravity 用于指定控件在布局中的對齊方式带斑。當橫向排列時鼓寺,垂直方向?qū)ζ洳艜А.斬Q向排列的時候勋磕,水平方向?qū)ζ洳艜А?br>
相對布局
在妈候。。朋凉。之上下左右州丹,在父布局上下左右。杂彭。墓毒。
幀布局
所有控件都默認擺放在左上角
百分比布局
添加依賴: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
動態(tài)添加Fragment所计、
碎片模擬返回棧 在提交事務前調(diào)用 addToBackStack()方法、
onAttach() 當碎片和活動建立關聯(lián)時候調(diào)用的
onCreateView() 為碎片創(chuàng)建視圖(加載布局)時調(diào)用
onActivityCreate() 確保與碎片相關聯(lián)的活動一定已經(jīng)完成創(chuàng)建完畢的時候調(diào)用的
onDestoryView() 當與碎片關聯(lián)的視圖被移除的時候調(diào)用
onDetach() 當碎片和活動解除關聯(lián)的時候調(diào)用
在res目錄下新建layout-sw600dp文件夾团秽,在這個文件夾下新建activity_main.xml 布局主胧,這就意味著當程序運行在屏幕寬度大于600dp的設備上時,會加載這個布局习勤。
2.簡易的新聞應用
第5章:全局大喇叭——詳解廣播機制
1.有序廣播踪栋、無序廣播
2.接收廣播
動態(tài):新建一個類繼承Broadcast-Receiver 重寫 onReceive() 方法。
網(wǎng)絡發(fā)生變化時系統(tǒng)會發(fā)出 "android.net.conn.CONNECTIVITY_CHANGE" 這個廣播
靜態(tài):靜態(tài)的廣播接收器一定要在AndroidManifest.xml文件中注冊
3.發(fā)送自定義廣播
標準廣播:清單文件中注冊廣播图毕,Intent 中傳入廣播的具體消息夷都,通過sendBroadcast(intent)發(fā)送。
發(fā)送有序廣播:sendOrderedBroadcast(intent,null); 可以在配置文件中通過 Android:priority 屬性設置優(yōu)先級 予颤,如果在廣播中 調(diào)用abortBroadcast() 就可以攔截廣播囤官,后面無法再接收到
4.使用本地廣播 ?
通過LocalBroadcastManager的getInstance()方法得到實例的蛤虐。
無法通過靜態(tài)注冊方式接收
第6章:數(shù)據(jù)存儲全方案——詳解持久化技術
1.持久化技術
文件存儲党饮、SharedPreference、數(shù)據(jù)庫存儲
文件存儲:FileOutputStream驳庭、FileInputStream
TextUtils.isEmpty() 可進行兩種空值的判斷 包括null 和 "".
SQLite 輕量級的關系型數(shù)據(jù)庫 不僅支持SQL語法 還支持ACID事務
SQLiteOpenHelper.getReadableDatabase();
LitePal 增刪改查數(shù)據(jù)庫
第7章:跨程序共享數(shù)據(jù)——探究內(nèi)容提供者
1.內(nèi)容提供者
2.運行時權限
危險權限 一共9組24個刑顺、權限組名為:CALENDAR、CAMERA、CONTACTS捏检、LOCATION荞驴、MICROPHONE、PHONE贯城、SENSORS、SMS霹娄、STORAGE能犯、
先判斷用戶是否給我們授權了用ContextCompat.checkSelfPermission()方法,第二個參數(shù)是權限名犬耻。如果未授權調(diào)用ActivityCompat.requestPermissions()方法向用戶申請授權踩晶,第二個參數(shù)是String數(shù)組,將權限名放在數(shù)組中枕磁,第三個參數(shù)是請求碼渡蜻。系統(tǒng)會彈出一個對話框,無論選擇哪個都會調(diào)用onRequest-permissionsResult()方法计济,可以在這個回調(diào)中處理業(yè)務茸苇。
3.訪問其他應用的數(shù)據(jù)
getContentResolver()后 調(diào)用增刪改查的方法,接收URI沦寂。查詢后返回一個Cursor對象遍歷后得到數(shù)據(jù)
4.創(chuàng)建自己的內(nèi)容提供器
寫一個類繼承ContentProvider重寫6個方法学密,onCreate() 返回true 表示初始化成功。query() 查詢传藏、insert() 添加腻暮、update() 升級、delete() 刪除毯侦、getType() 根據(jù)傳入的內(nèi)容URI返回MIME類型哭靖。
第8章:豐富你的程序——運用手機多媒體
1.通知 Notification
使用V4庫中提供NotificationCompat類,new NotificationCompat.Builder(content).build();當點擊通知的時候就會啟動延時意圖PendingIntent 傳入intent 打開界面侈离。通過創(chuàng)建通知時調(diào)用 setContentIntent(pi)添加進去试幽,如果要點擊取消 連綴一個 setAutoCancel()方法 傳入true 點擊后就會取消。如果連綴 setSound()方法并傳入一個Uri參數(shù)霍狰,那么就可以接到通知的時候播放一段音頻抡草。如果連綴setVibrate()傳入長整型的數(shù)據(jù) 用于設置手機震動的時長,單位是毫秒蔗坯,如果使用要添加震動的權限康震。如果連綴setLights()傳入 顏色和兩個時長 就會啟動手機led燈,如果想直接使用默認的鈴聲和震動 那么調(diào)用setDefault()方法宾濒,傳入DEFAULT_ALL即可腿短。
如果構(gòu)建出富文本的 通知內(nèi)容調(diào)用setStyle()方法。設置通知最高級別調(diào)用setPriority()方法。
2.調(diào)用攝像頭和相冊
Demo1攝像頭拍照后顯示圖片.
Demo2選擇相冊中的圖片
3.播放多媒體文件
播放音頻橘忱、播放視頻
第9章:看看精彩的世界——使用網(wǎng)絡技術
1.WebView用法
2.使用HTTP協(xié)議訪問網(wǎng)絡
HttpURLConnection connection=(httpurlconnection)url.openConnection();就得到了實例赴魁,設置setRequestMethod("GET") 表示希望從服務器那里獲取數(shù)據(jù),而post則表示希望提交數(shù)據(jù)給服務器钝诚。setConnectTimeout(8000)設置連接超時颖御,setReadTimeout(8000)設置讀取超時。調(diào)用getInputStream()讀取輸入流凝颇,最后調(diào)用disconnect()將http連接關閉掉潘拱。
使用okhttp訪問網(wǎng)絡。
3.解析數(shù)據(jù)
XML格式是數(shù)據(jù)
Pull 解析拧略、SAX 解析芦岂、
JSON格式數(shù)據(jù)
JSONObject 解析、GSON解析垫蛆、
第10章:后臺默默的勞動者——探究服務
1.服務Service
2.Android多線程編程
@Override
public void run(){
//具體的邏輯
}
}).start();
使用AsyncTask 里邊有4個方法禽最,onPreExecute() 方法會在后臺任務開始執(zhí)行前調(diào)用、deInBackground(Params...) 方法都會在子線程執(zhí)行袱饭、onProgressUpdate(Progress...) 在這個方法可以對UI進行操作川无、onPostExcute(Result) 當后臺執(zhí)行完畢后調(diào)用。
3.服務的基本用法
寫一個類繼承Service 重寫onBind()宁赤、 onCreate()舀透、onStartCommand 和 onDestroy() 其中 onStartCommand 方法每次服務啟動的時候都會調(diào)用,每個服務都需要在清單文件中注冊决左。
啟動服務 startService(intent),stopService(intent)停止服務愕够。
活動和服務通信:在服務的onBind()中 return mBinder; 在Activity中 new ServiceConnection(){}重寫 onServiceConnected()方法,通過向下轉(zhuǎn)型得到binder實例調(diào)用 Binder類中的任何public方法佛猛,當綁定服務時調(diào)用 bindService()方法綁定Activity和Service惑芭,傳入 3個參數(shù) 第一個是intent 第二個是ServiceConnection的實例,第三個是標志位傳入 BIND_AUTO_CREATE 表示活動和服務綁定后會自動創(chuàng)建服務继找,使服務的onCreate()方法得到執(zhí)行遂跟,但是onstartCommand()方法不會執(zhí)行。解除綁定調(diào)用unbindService()方法婴渡。
4.服務的生命周期
startForeground()方法 傳入id和Notification對象幻锁,可以讓服務變?yōu)榍芭_服務。
IntentService 寫一個類繼承IntentService實現(xiàn)onHandleIntent()方法边臼,這個方法在子線程運行哄尔,可以處理一些具體邏輯。
第11章:Android特色開發(fā)——基于位置的服務
1.百度地圖
第12章:最佳的UI體驗——Material Design實戰(zhàn)
1.material design
ToolBar柠并、DrawerLayout岭接、NavigationView富拗、FloatingActionButton、Snackbar鸣戴、CoordinatorLayout啃沪、CardView、AppBarLayout窄锅、SwipeRefreshLayout创千、CollapsingToolbarLayout(可折疊的標題欄)、
第13章:繼續(xù)進階——你還應該掌握的高級技巧
1.全局獲取Context
2.使用Intent傳遞對象
實現(xiàn)Serializable入偷、實現(xiàn)Parcelable签餐、
3.定制自己的日志工具
4.調(diào)試Android程序
5.創(chuàng)建定時任務
Alarm機制、Doze模式盯串、
6、多窗口模式編程
7戒良、Lambda表達式
第14章:開發(fā)酷歐天氣
第15章:最后一步——將應用發(fā)布到360應用商店
1.生成正式簽名和APK
2.多渠道打包
3.注冊360發(fā)布程序
4.嵌入廣告進行盈利