序言:html
上篇大概的講解了新建一個android的流程。今天爲你們帶來的是Activity詳解,由於本身在開發過程當中就遇到linux
好幾回坑,尷尬。android
生命週期app
和Java裏頭同樣同樣的,如圖ide
圖片來源於網上哈,本身畫不來。函數
1.啓動Activity:系統會先調用onCreate方法,而後調用onStart方法,最後調用onResume,Activity進入運行狀態。佈局
2.當前Activity被其餘Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。this
3.當前Activity由被覆蓋狀態回到前臺或解鎖屏:系統會調用onResume方法,再次進入運行狀態。spa
4.當前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居後臺:系統會先調用onPause方法,而後調用onStop方法,進入停滯狀態。3d
5.用戶後退回到此Activity:系統會先調用onRestart方法,而後調用onStart方法,最後調用onResume方法,再次進入運行狀態。
6.當前Activity處於被覆蓋狀態或者後臺不可見狀態,即第2步和第4步,系統內存不足,殺死當前Activity,然後用戶退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。
7.退出當前Activity時:系統先調用onPause方法,而後調用onStop方法,最後調用onDestory方法,結束當前Activity。
以上提到的函數皆能夠在Avtivity裏面重寫,如圖:
新建的Activity默認只有Oncreate函數。
using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using Android.Util; namespace FirstAndroidAPP { [Activity(Label = "FirstAndroidAPP", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity { int count = 1; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); // Get our button from the layout resource, // and attach an event to it Button button = FindViewById<Button>(Resource.Id.MyButton); button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); }; } protected override void OnStart() { Log.Debug("OnStart", "Activity從新回到前臺"); base.OnStart(); } protected override void OnResume() { Log.Debug("OnResume", "OnResume called"); base.OnResume(); } protected override void OnStop() { Log.Debug("OnStop", "OnStop called"); base.OnStop(); } protected override void OnDestroy() { Log.Debug("OnDestory", "系統被銷燬"); base.OnDestroy(); } protected override void OnRestart() { Log.Debug("OnRestart", "系統從新回到前臺"); base.OnRestart(); } } }
上述還有一種會觸發Activity的生命週期,屏幕旋轉的時候也會進入。並且會致使當前activity發生OnDestroy-> OnCreate,這樣會從新構造當前activity和界面佈局。若是當前Activity有加載數據的話,會致使重複加載。
生命週期仍是蠻好理解的,可是若是是Android小白的話,仍是本身親自寫下代碼,打上斷點本身調試下,這樣有助於本身方便理解。大概理了下生命週期,接下來了解一下Activity的啓動方式。
Activity四種啓動方式
這裏的話引用下園中博友的文章http://www.cnblogs.com/meizixiong/archive/2013/07/03/3170591.html 我以爲圖解的很清楚。
1、啓動模式介紹
啓動模式簡單地說就是Activity啓動時的策略,在AndroidManifest.xml中的標籤的android:launchMode屬性設置;在Xamarin中,在每一個Activity上加上一個Attribute
編譯後會在AndroidManifest.xml 生成相應的配置。
啓動模式有4種,分別爲standard、singleTop、singleTask、singleInstance;
講解啓動模式以前,有必要先講解一下「任務棧」的概念;
任務棧
每一個應用都有一個任務棧,是用來存放Activity的,功能相似於函數調用的棧,前後順序表明了Activity的出現順序;好比Activity1-->Activity2-->Activity3,則任務棧爲:
2、啓動模式
(1)standard:每次激活Activity時(startActivity),都建立Activity實例,並放入任務棧;
(2)singleTop:若是某個Activity本身激活本身,即任務棧棧頂就是該Activity,則不須要建立,其他狀況都要建立Activity實例;
(3)singleTask:若是要激活的那個Activity在任務棧中存在該實例,則不須要建立,只須要把此Activity放入棧頂,並把該Activity以上的Activity實例都pop;
(4)singleInstance:若是應用1的任務棧中建立了MainActivity實例,若是應用2也要激活MainActivity,則不須要建立,兩應用共享該Activity實例;
SingTask的應用:
能夠用來退出整個應用。
將主Activity設爲SingTask模式,而後在要退出的Activity中轉到主Activity,而後重寫主Activity的onNewIntent函數,並在函數中加上一句finish。
咱們能夠利用SingTask的特性來完成一些小功能,好比平時你們看到的」再按一次退出應用 」,其實就是監聽Back鍵,在短期內連續點擊的操做。
新建一個Activity,取名SecondActivity,內容很簡單
[Activity(Label = "SecondActivity")] public class SecondActivity : Activity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Second); // Create your application here } DateTime? lastBackKeyDownTime;//記錄上次按下Back的時間 public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e) { if (keyCode == Keycode.Back && e.Action == KeyEventActions.Down)//監聽Back鍵 { if (!lastBackKeyDownTime.HasValue || DateTime.Now - lastBackKeyDownTime.Value > new TimeSpan(0, 0, 2)) { Toast.MakeText(this, "再按一次退出程序", ToastLength.Short).Show(); lastBackKeyDownTime = DateTime.Now; } else { Intent intent = new Intent(); intent.SetClass(this, typeof(MainActivity)); StartActivity(intent); } return true; } return base.OnKeyDown(keyCode, e); } }
在MainActivity中點擊Button,跳轉到SecondActivity中
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); // Get our button from the layout resource, // and attach an event to it Button button = FindViewById<Button>(Resource.Id.MyButton); button.Click += delegate { Intent intent = new Intent(this, typeof(SecondActivity)); StartActivity(intent); }; } protected override void OnNewIntent(Intent intent) { Finish(); }
效果如圖:
在這裏補充一點兒SingTask的描述:
singleTask 若是在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時, 會讓該實例回到棧頂,所以在它上面的實例將會被移除棧。若是棧中不存在該實例,將會建立新的實例放入棧中。 爲了驗證會將MainActivity上的實例銷燬,咱們在SecondAvtivity中重寫OnDestory函數,打上日誌:
自此,能夠確認是被銷燬了,哈哈哈
Activity傳值
最後在稍微的描述下Activity傳值吧,在MainActivity中打開SecondActivity時加上以下代碼
Intent intent = new Intent(this, typeof(SecondActivity)); intent.PutExtra("name","hushuai"); StartActivity(intent);而後在SecondActivity的OnCreate函數中去接收它:
base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Second); string name = Intent.GetStringExtra ("name"); Toast.MakeText (this, "我是誰?我固然是" + name + "了啊!", ToastLength.Short).Show ();Finally,你會看到以下效果圖:
這是最簡單的方式,想要了解更多,本身去搜索。要動手寫過才知道。
最後
就寫到這兒吧,畢竟在公司仍是要上班。每晚上寫點兒,今天早上來公司補充了最後的一點兒。寫的都當心翼翼,怕被領導看見了。
文章寫的有點兒慢,白天工做也忙,晚上本身又要搞點兒外快,不容易啊。
再貼點兒我如今作的東西的界面圖吧,畢竟本身又不是美工,又是我一我的作,因此有點兒醜。
到時候再和你們分享一些遇到的問題,寫博速度有點兒慢,而後就是文章排版頭痛。
望你們支持,3Q。
吐槽一點兒,爲何博客園分類沒有Xamarin 系列?