Android入門&活動

參考資料

Android Studio 下載
Android Studio官方文檔/教程
《第一行代碼》(一本安卓開發教材,適合僅有java基礎的新手入門)

小米手機Toast含有應用名前綴問題

快捷鍵

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 剛好能包含里面的內容就行

活動的注冊&主活動設置

  1. 活動創建時,launcher activity 表示是主活動

  2. 所有活動要在AndroidManifest.xml 中注冊才能生效


  3. 活動注冊

在最外層的<manifest> 標簽中通過package 屬性指定程序的包名如:com.example.activitytest
在<activity> 標簽中我們使用了android:name 來指定具體注冊哪一個活動, 填入”.activityName “。

  1. 主活動設置

在<activity> 標簽的內部加入<intent-filter> 標簽, 并
在這個標簽里添加<action android:name="android.intent.action.MAIN"/> 和<category android: name="android.intent.category.LAUNCHER" /> 這兩句聲明即可。

  1. 示例代碼如下:
<?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
  • 在一個活動中,要想打開另一個活動,有兩種方法:
    1. 顯式intent:指定具體打開哪個活動
    2. 隱式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 中一一取出數據。

具體方法是:

  1. 在可能被回收,但需要保存臨時數據的activity里加:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
}
  1. 在該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>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容