Android開發之Activity初識

認識Activity

        活動Activity的介紹在Android界已經屬於老生常談了,基本上每個Android開發人員對Android四大組件都有着深刻的印象和自己或多或少的認知。Activity間接或直接地繼承了Context、ContextWrapper、ContextThemeWrapper等基類,因此Activity可以直接調用它們的方法。
        Android的四大組件分別是Activity(活動)、Service(服務)、BroadcastReceiver(廣播)和Content Provider(內容提供者)。無論是對Android開發者還是對用戶來說,Activity一定是我們使用最頻繁,最基礎,也是關係最密切的組件。那麼Activity是什麼呢?
        Activity是Android的四大組件之一,是活動,是應用中擔任着展示界面和與用戶進行交互的一個角色。Activity會加載指定的佈局文件來顯示各種UI元素,並且爲這些UI元素設置事件處理函數,使得用戶可以與這些UI進行交互。
        Activity還可以在不同的Activity之間跳轉,將不同的頁面串聯在一起,共同完成特定的操作流程。每個應用都是由一個或者多個Activity組成,它是Android應用程序中不可缺少的一部分。



Activity的構成

        Activity視圖會被設置給一個Window類,這個Window中含有一個DecorView,DecorView是整個窗口的頂級視圖。
        開發人員設置的佈局會被設置到DecorView的mContentParent佈局中。Android中實際內置了一些系統佈局文件XML,我們在XML中定義的視圖最終會被放置到這些系統佈局的特定節點之下,這樣就形成了整個DecorView。

        Activity之下有一個PhoneWindow,這個PhonWindow是Window的實現類,然後Window之下包含一個DecorView,DecorView實際上是頁面的頂級視圖,它從一些系統佈局中加載,並且在運行時將開發人員設置給Activity的佈局資源添加到系統佈局的mContentParent中。



如何創建使用Activity

1.創建Activity

        創建Activity首先我們要創建一個類(class),這個類需要繼承Android的Activity類或者其子類;

public class MainActivity extends AppCompatActivity

        然後我們要重寫它的onCreate方法,在onCreate()方法中我們給它設置顯示的UI佈局,通過setContentView()方法,這樣一個Activity就創建出來了。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

        在使用這個Activity之前我們需要去清單文件AndroidManifest.xml文件中爲這個Activity註冊,如果一個Activity沒有在清單文件註冊直接運行會導致App Crash。

2.清單文件配置

        在AndroidManifest.xml中我們要創建個標籤,這個標籤中有個android:name,name是當前activity的標識。這個標識的組成前半部分是該activity的包,後半部分是這個activity的名字。所以這個name是該activity的包和名字組成的。

<activity android:name="com.ms.awe.studydemo.MainActivity">

        當Activity是主入口的Activity,那麼我們需要給這個activity在AndroidManifest中設置action和category。

設置
設置
action
android.intent.action.MAIN
category
android.intent.category.LAUNCHER

這樣設置之後該activity就成爲了應用程序的主入口了。

<intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>



啓動 & 關閉Activity

        啓動Activity可以通過startActivity(Intent intent)、startActivityForResult(Intent intent,int requestCode)方法實現;

//啓動其他Activity
startActivity(Intent intent);
//以指定的請求碼啓動Activity,而且程序將會獲取新啓動的Activity返回的結果
startActivityForResult(Intent intent,int requestCode);

        關閉當前Activity只需按下Back鍵或者調用方法finish()即可;

finish()



啓動其他Activity並返回結果

        startActivityForResult(Intent intent,int requestCode)方法啓動指定Activity,期望獲取指定Activity返回的結果。爲了獲取被啓動的Activity所返回的結果;
        1.當前Activity需要重寫onActivityResult(int requestCode,int rusultCode,Intent intent);當被啓動的Activity返回結果時,該方法將會被觸發,其中requestCode代表請求碼,resultCode代表Activity返回的結果碼,這個結果碼也是由開發者根據業務自行設定的。
        2.被啓動的Activity需要調用setResult()方法設置處理結果;



Activity啓動的方式

1.直接啓動

        我們在項目當中去啓動我們自己的Activity,一般都是通過直接啓動的方式去啓動,根據Activity名字就可以拿到我們要啓動的Activity,這種方式也叫做Activity的顯式啓動;

Intent intent = new Intent(MainActivity.this,MsActivity.class);
startActivity(intent);

        通過一個Intent顯式去指定一個類的名字去啓動一個Activity,顯式啓動還有另外一種方式;

Intent intent = new Intent();
ComponentName component = new ComponentName(MainActivity.this,MsActivity.class);
intent.setComponent(component);
startActivity(intent);

2.匿名啓動

        假如我們要啓動某個應用的某個界面activity,這個時候我們不知道這個activity的具體名字,這個時候我們只能通過action去啓動Activity。這兩種方式使用的場景不同。
        Category屬性用於指定當前動作(Action)被執行的環境;

<activity android:name=".MsActivity">
    <intent-filter>
        <action android:name="www.Musijun.com">
        <category android:name="android.intent.category.DEFAULT"
    </intent-filter>
</activity>

        配置隱式Intent最關鍵的是在AndroidManifest清單文件中去根據action的名字配置相同一個category,category默認情況下用DEFAULT這種category,action可以配多個也可以配一個。

Intent intent = new Intent();
intent.setAction("www.Musijun.com");
startActivity(intent);



Activity的狀態保存

        在Activity可能被回收之前調用onSavedInstanceState()方法來保存自己的狀態和信息以便被系統回收重建的時候恢復數據;
        系統會靈活決定調不調用onSavedInstanceState()方法,如果要調用就一定在onStop()方法之前調用,不能保證是發生在onPause()方法之前還是之後;
        數據恢復可以在onCreate()或onRestoreInstanceState()方法中進行;
        onRestoreInstanceState()方法在onStart()和onPostCreate()方法之間調用,在onCreate()方法中也可以恢復狀態,但有時候需要所有佈局初始化完成後再恢復狀態。

//狀態保存
onSavedInstanceState(Bundle);
//狀態恢復
onCreate(Bundle);
onRestoreInstanceState();



Activity設置成窗口樣式

        如果想將Activity樣式設置成Dialog樣式的,需要在清單文件AndroidManifest.xml文件中將Activity標籤下的theme屬性設置成Theme.Dialog即可。

android:theme="@android:style/Theme.Dialog"



安全退出調用多個Activity的Application

        如果一個Application中已經開啓了多個Activity,此時我們想在當前Activity中安全關閉Application中已經開啓的所有Activity,我們有如下方案可供選擇:
        1.可以記錄打開的Activity,每打開一個Activity就記錄下來在需要退出的時候關閉每一個Activity;
        2.發送特定廣播,在需要結束應用時發送一個特定的廣播,每個Activity接收到廣播後關閉即可;
        3.遞歸退出,在打開新的Activity使用startActivityForResult(),然後自己添加標誌,在onActivityResult()中處理遞歸關閉;
        4.通過intent的flag實現intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個新的Activity,此時如果該Back Stack中已經有該Activity,那麼系統會把這個Activity上面的所有Activity清理掉,相當於Activity的SingleTop啓動模式;



Activity橫豎屏切換

        Activity橫豎屏切換時候的生命週期是跟清單文件的配置相關;
        1.不做任何設置的情況下Activity進行橫豎屏切換會重新調用各個生命週期,默認首先銷燬當前Activity然後再重新加載;
        2.設置Activity的android:configChanges="orientation"時切屏還是會重新調用各個生命週期,切橫、豎屏都只會執行一次;
        3.設置Activity的android:configChanges="orientation|keyboardHidden|screenSize"的時候切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法。切記要加上screenSize,否則4.0以上版本不生效;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章