Xamarin android 之Activity詳解


序言:

上篇大概的講解了新建一個android的流程。今天為大家帶來的是Activity詳解,因為自己在開發過程中就遇到

好幾次坑,尷尬。

生命周期

和Java里頭一樣一樣的,如圖

0_1314838777He6C

圖片來源於網上哈,自己畫不來。

 

1.啟動Activity:系統會先調用onCreate方法,然后調用onStart方法,最后調用onResume,Activity進入運行狀態。

2.當前Activity被其他Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。

3.當前Activity由被覆蓋狀態回到前台或解鎖屏:系統會調用onResume方法,再次進入運行狀態。

4.當前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居后台:系統會先調用onPause方法,然后調用onStop方法,進入停滯狀態。

5.用戶后退回到此Activity:系統會先調用onRestart方法,然后調用onStart方法,最后調用onResume方法,再次進入運行狀態。

6.當前Activity處於被覆蓋狀態或者后台不可見狀態,即第2步和第4步,系統內存不足,殺死當前Activity,而后用戶退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。

7.退出當前Activity時:系統先調用onPause方法,然后調用onStop方法,最后調用onDestory方法,結束當前Activity。

 

以上提到的函數皆可以在Avtivity里面重寫,如圖:

image

新建的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 我覺得圖解的很清楚。

一、啟動模式介紹

  啟動模式簡單地說就是Activity啟動時的策略,在AndroidManifest.xml中的標簽的android:launchMode屬性設置;在Xamarin中,在每個Activity上加上一個Attribute

image

編譯后會在AndroidManifest.xml 生成相應的配置。

  啟動模式有4種,分別為standard、singleTop、singleTask、singleInstance;

講解啟動模式之前,有必要先講解一下“任務棧”的概念;

任務棧

  每個應用都有一個任務棧,是用來存放Activity的,功能類似於函數調用的棧,先后順序代表了Activity的出現順序;比如Activity1-->Activity2-->Activity3,則任務棧為:

二、啟動模式

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

效果如圖:

image

 

在這里補充一點兒SingTask的描述:

singleTask 如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時, 會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。 為了驗證會將MainActivity上的實例銷毀,我們在SecondAvtivity中重寫OnDestory函數,打上日志:
image
 
image

自此,可以確認是被銷毀了,哈哈哈熱烈的笑臉

 

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,你會看到如下效果圖:

image

 

這是最簡單的方式,想要了解更多,自己去搜索。要動手寫過才知道。相愛

 

最后

就寫到這兒吧,畢竟在公司還是要上班。每晚上寫點兒,今天早上來公司補充了最后的一點兒。寫的都小心翼翼,怕被領導看見了。 尷尬

文章寫的有點兒慢,白天工作也忙,晚上自己又要搞點兒外快,不容易啊。

再貼點兒我現在做的東西的界面圖吧,畢竟自己又不是美工,又是我一個人做,所以有點兒丑。

image

image

到時候再和大家分享一些遇到的問題,寫博速度有點兒慢,然后就是文章排版頭痛。

望大家支持,3Q。

 

吐槽一點兒,為什么博客園分類沒有Xamarin 系列?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM