天天看點

Android開發之Activity初識認識ActivityActivity的構成如何建立使用Activity啟動 & 關閉Activity啟動其他Activity并傳回結果Activity啟動的方式Activity的狀态儲存Activity設定成視窗樣式安全退出調用多個Activity的ApplicationActivity橫豎屏切換如何修改Activity進入和退出的動畫

Android開發之Activity初識

  • 認識Activity
  • Activity的構成
  • 如何建立使用Activity
    • 1.建立Activity
    • 2.清單檔案配置
  • 啟動 & 關閉Activity
  • 啟動其他Activity并傳回結果
  • Activity啟動的方式
    • 1.直接啟動
    • 2.匿名啟動
  • Activity的狀态儲存
  • Activity設定成視窗樣式
  • 安全退出調用多個Activity的Application
  • Activity橫豎屏切換
  • 如何修改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。

這樣設定之後該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橫豎屏切換

        Activity橫豎屏切換時候的生命周期是跟清單檔案的配置相關;

        1.不做任何設定的情況下Activity進行橫豎屏切換會重新調用各個生命周期,預設首先銷毀目前Activity然後再重新加載;

        2.設定Activity的android:configChanges="orientation"時切屏還是會重新調用各個生命周期,切橫、豎屏都隻會執行一次;

        3.設定Activity的android:configChanges="orientation|keyboardHidden|screenSize"的時候切屏不會重新調用各個生命周期,隻會執行onConfigurationChanged方法。切記要加上screenSize,否則4.0以上版本不生效;

如何修改Activity進入和退出的動畫

        1.通過定義Activity的主題,在style.xml中編碼,在AndroidManifest.xml中給指定的Activity指定theme;

<style name="AnimationActivity" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_left</item> 
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item> 
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item> 
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item> 
</style>

<style name="ThemeActivity"> 
    <item name="android:windowAnimationStyle">@style/AnimationActivity</item> 
    <item name="android:windowNoTitle">true</item> 
</style>
           

        2.第二種方法是通過重寫Activity的overridePendingTransition方法;

overridePendingTransition(R.anim.fade, R.anim.hold);