徐鬆亮android教學-雜項筆記
阿新 • • 發佈:2018-12-17
既然叫雜項筆記,就是說雜亂無章的筆記,此筆記的主要目的不是為了教學,而是用於本人學習過程中的點滴記錄,之所以開放,就是希望能給新手及愛好者些許點滴概念性幫助。
目錄
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/
- 網站使用者名稱密碼:[email protected]/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 訊息
-
怎麼能讓程式持續執行
-
怎麼能讓程式持續執行
-
啟動執行緒
-
怎麼能讓程式在各種螢幕都能執行
-
怎麼設定開機自動啟動
-
怎麼設定程序升級
-
怎麼把程式放到市場軟體
-
原始碼被反編譯後,怎麼保證密碼不洩漏
- 答:用不對稱加密技術