參考資料
Android Studio 下載
Android Studio官方文檔/教程
《第一行代碼》(一本安卓開發教材,適合僅有java基礎的新手入門)
快捷鍵
shift + F10 運行
Ctrl + O 重寫方法
logd , Tab 自動補全Log.d
在方法外logt ,Tab 會自動以當前類名生成TAG常量
Android四大組件
組件 | 說明 | |
---|---|---|
1 | 活動(Activity) | 所有Android應用程序的門面, 凡是在應用中你看得到的東西, 都是放在活動中的。 |
2 | 服務(Service) | 就比較低調了, 你無法看到它,但它會一直在后臺默默地運行, 即使用戶退出了應用, 服務仍然是可以繼續運行的。 |
3 | 廣播接收器(Broadcast Receiver) | 允許你的應用接收來自各處的廣播消息, 比如電話、 短信等, 當然你的應用同樣也可以向外發出廣播消息。 |
4 | 內容提供器(Content Provider) | 則為應用程序之間共享數據提供了可能, 比如你想要讀取系統電話簿中的聯系人, 就需要通過內容提供器來實現。 |
項目結構的不同模式
項目結構的模式有:
- Android(簡明快速,不適合新手)
-
Project (真實的目錄結構)
……
可選的項目結構模式
真機調試
安卓手機用usb連接電腦,在安卓手機上點:
設置-》關于手機/我的設備/。。。 -》連續點擊版本號,讓開發者選項顯示出來,在啟動usb調試。
點運行(shift+F10),選該手機,就可以了。instant run可以選上:
深入理解Android Instant Run運行機制
日志
logd , Tab 自動補全Log.d
在方法外logt ,Tab 會自動以當前類名生成TAG常量
變量或id:引用&定義
情況 | 用法 |
---|---|
XML中引用一個id | @id/id_name |
XML中定義一個id | @+id/id_name |
代碼中引用字符串 | R.string.app_name |
layout的一些屬性
屬性 | 意義 |
---|---|
match_parent | 跟父元素一樣 |
wrap_content | 剛好能包含里面的內容就行 |
活動的注冊&主活動設置
活動創建時,launcher activity 表示是主活動
-
所有活動要在AndroidManifest.xml 中注冊才能生效
活動注冊
在最外層的<manifest> 標簽中通過package 屬性指定程序的包名如:com.example.activitytest
在<activity> 標簽中我們使用了android:name 來指定具體注冊哪一個活動, 填入”.activityName “。
- 主活動設置
在<activity> 標簽的內部加入<intent-filter> 標簽, 并
在這個標簽里添加<action android:name="android.intent.action.MAIN"/> 和<category android: name="android.intent.category.LAUNCHER" /> 這兩句聲明即可。
- 示例代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="This is FirstActivity" //這里的內容會顯示在標題上
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
效果如下:
更多活動
- 在AndroidManifest.xml 中,注冊了所有活動,同時用intent-filter標簽指定了他們能響應的action, category, data
- 在一個活動中,要想打開另一個活動,有兩種方法:
- 顯式intent:指定具體打開哪個活動
- 隱式intent:指定action, category, data 中的一些。
- 每個intent可以制定一個action和多個category。
注釋技巧
在想注釋的地方輸入/**并回車,會自動出現注釋
活動的4種狀態
每個活動在其生命周期中最多可能會有四種狀態:
狀態 | 在返回棧中的位置 | 是否可見 | |
---|---|---|---|
1 | 運行狀態 | 棧頂 | |
2 | 暫停狀態 | 不再棧頂 | 可見 |
3 | 停止狀態 | 不再棧頂 | 不可見 |
4 | 銷毀狀態 | 不再棧中 |
活動的7個回調方法
Activity類中定義了7個回調方法, 覆蓋了活動生命周期的每一個環節:
回調方法 | 說明 | |
---|---|---|
1 | onCreate() | 每個活動中我們都重寫了這個方法, 它會在活動第一次被創建的時候調用。 你應該在這個方法中完成活動的初始化操作, 比如說加載布局、 綁定事件等。 |
2 | onStart() | 這個方法在活動由不可見變為可見的時候調用。 |
3 | onResume() | 這個方法在活動準備好和用戶進行交互的時候調用。 此時的活動一定位于返回棧的棧頂, 并且處于運行狀態。 |
4 | onPause() | 這個方法在系統準備去啟動或者恢復另一個活動的時候調用。 我們通常會在這個方法中將一些消耗CPU的資源釋放掉, 以及保存一些關鍵數據, 但這個方法的執行速度一定要快, 不然會影響到新的棧頂活動的使用。 |
5 | onStop() | 這個方法在活動完全不可見的時候調用。 它和onPause() 方法的主要區別在于, 如果啟動的新活動是一個對話框式的活動, 那onPause() 方法會得到執行,而onStop() 方法并不會執行。 |
6 | onDestroy() | 這個方法在活動被銷毀之前調用, 之后活動的狀態將變為銷毀狀態。 |
7 | onRestart() | 這個方法在活動由停止狀態變為運行狀態之前調用, 也就是活動被重新啟動了。 |
以上7個方法中除了onRestart() 方法, 其他都是兩兩相對的, 從而又可以將活動分為3種生存期。
- 完整生存期
活動在onCreate() 方法和onDestroy() 方法之間所經歷的, 就是完整生存期。 一般情況下, 一個活動會在onCreate() 方法中完成各種初始化操作, 而在onDestroy() 方法中完成釋放內存的操作。
- 可見生存期
活動在onStart() 方法和onStop() 方法之間所經歷的, 就是可見生存期。 在可見生存期內, 活動對于用戶總是可見的, 即便有可能無法和用戶進行交互。 我們可以通過這兩個方法, 合理地管理那些對用戶可見的資源。 比如在onStart() 方法中對資源進行加載, 而在onStop() 方法中對資源進行釋放, 從而保證處于停止狀態的活動不會占用過多內存。
- 前臺生存期
活動在onResume() 方法和onPause() 方法之間所經歷的就是前臺生存期。 在前臺生存期內, 活動總是處于運行狀態的, 此時的活動是可以和用戶進行交互的,我們平時看到和接觸最多的也就是這個狀態下的活動。
防止活動被回收時損失臨時數據
- onSaveInstanceState() 回調方法, 在活動被回收之前一定會被調用
- onSaveInstanceState() 方法會攜帶一個Bundle 類型的參數
- Bundle 提供了一系列的方法用于保存數據:putString() 方法,putInt() 方法……
- 每個保存方法需要傳入兩個參數, 第一個參數是鍵, 用于后面從Bundle
中取值, 第二個參數是真正要保存的內容。 - onCreate() 方法其實也有一個Bundle 類型的參數,在一般情況下都是null.但是如果在活動被系統回收之前有通過onSaveInstanceState() 方法來保存數據的話,這個參數就會帶有之前所保存的全部數據, 我們只需要再通過相應的取值方法將數據取出即可。
- Intent還可以結合Bundle 一起用于傳遞數據, 首先可以把需要傳遞的數據都保存在Bundle 對象中, 然后再將Bundle 對象存放在Intent里。 到了目標活動之后先從Intent中取出Bundle , 再從Bundle 中一一取出數據。
具體方法是:
- 在可能被回收,但需要保存臨時數據的activity里加:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
}
- 在該activity的onCreate()中,加上:
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}
活動的啟動模式
standard | 啟動一個活動時(startActivity),不管它是否已經在返回棧里,都新建一個該活動的實例(調用onCreate) |
singleTop | 啟動一個活動時,如果它已經在返回棧頂,就直接使用它,不新建實例;若在棧中,不再棧頂,還是要新建 |
singleTask | 每次啟動該活動時,如果發現在棧中,則直接使用該實例, 并把在這個活動之上的所有活動統統出棧, 如果沒有發現就會創建一個新的活動實例。 |
singleInstance | 啟動該活動時,新建一個返回棧,該返回棧里只有這一個活動 |
修改啟動模式
修改AndroidManifest.xml中FirstActivity的launchMode 屬性:
<activity
android:name=".FirstActivity"
android:launchMode="singleTop"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>