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);