Getting Started
1.Build your first app
1.給DisplayMessageActivity新增點擊返回MainActivity
<activity android:name=".DisplayMessageActivity"
android:parentActivityName=".MainActivity" >
<!-- The meta-data tag is required if you support API level 15 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
2.Autoconnect會幫你添加約束
3.使用Pixel XL作為Preview
4.Default Margins設(shè)為16
5. Chain > Create Horizontal Chain
A chain is a bidirectional constraint between two or more views that allows you to lay out the chained views in unison
6.Match constraints:意味著寬度擴展以滿足水平約束和邊界的定義(類似LinearLayout weight)

image.png
2.Supporting Different Devices
1.Arabic or Hebrew 阿拉伯語或希伯來語使用RTL
2.適配多語言:<resource type>-b+<language code>[+<country code>] eg:
values/
strings.xml//默認英文語言
values-b+es/
strings.xml//西班牙的語言
3.適配橫屏:layout-land 適配大屏:layout-land 適配橫屏和大屏:layout-large-land
4.兼容不同Android版本:Build.VERSION.SDK_INT運行時獲得當前的版本
在xml中如果當前手機不支持某個屬性的話會自動忽略
3.Building a Dynamic UI with Fragments
1.FragmentActivity 是為了解決Android11以前使用Fragment的
2.AppCompatActivity是FragmentActivity的子類
3.當FragmentTransaction.commit之前調(diào)用了addToBackStack(),F(xiàn)ragment被remove的時候不會destroy而是stop,按back鍵回退的時候,restart
4.Interacting with Other Apps
1.隱式意圖要么使用Uri,要么setType設(shè)置MIME決定哪些app能接受這個intent
2.使用隱式意圖時,如果手機里面沒有app可以接收,那么會crash,所以發(fā)送之前需要驗證:
PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;
intent.resolveActivity(getPackageManager()) != null//驗證這個intent會有至少有一個app能接收
3.使用隱式意圖時,如果手機里有多個app可以接收,那么系統(tǒng)會彈出一個彈窗讓用戶選擇,但是下次會默認使用選擇的app來接受同樣的intent
使用Intent.createChooser(intent, title),可以讓用戶每次都會選擇可以接收intent的app
4.Android 2.3以前讀取聯(lián)系人必須獲取READ_CONTACTS權(quán)限、但是2.3以后聯(lián)系人app會給你一個臨時權(quán)限去查詢指定的聯(lián)系人(通過Intent.Uri)
,如果想要查詢除了指定聯(lián)系人以外其他聯(lián)系人的信息,那就必須要獲取READ_CONTACTS權(quán)限
Data標簽可以指定MIME、URI prefix、URI scheme或者這些組合
5.為了能讓Activity 接受隱式意圖,必須設(shè)置category 標簽為ca'tegory_default
6.在外部存儲中,為了讓系統(tǒng)能夠識別你的文件,你需要使用API constants eg:DIRECTORY_PICTURES,系統(tǒng)就會掃描到這個文件夾里的文件為照片
7.getFreeSpace() 返回剩余空間容量,但是你不能寫剛好那么多容量的文件。會報錯
8.app卸載時,外部存儲的getExternalFilesDir()和所有的內(nèi)部存儲都會被刪掉
Saving App Data
1.commit()是同步的,apply()先把改變保存到內(nèi)存中的SharePreferences然后異步的保存到磁盤,就算保存失敗也不會有通知。
2.如果apply()在異步保存的同時,又調(diào)用了editor的commit(),那么commit()會被阻塞,直到所有的apply()執(zhí)行完成!
3.Framework層會確保apply()在切換聲明周期時之前調(diào)用完
4.manifest中使用android:installLocation 來指定app安裝的位置(默認內(nèi)部存儲)
5.目前而言所有app都有read外部存儲的權(quán)限(不用聲明都行、但是在將來的版本會改變)