• 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 系列?

  • 相关阅读:
    【记中关村.西北食府.兰州拉面】诗一首
    【新发地寻柑桔收购商】 诗一首
    【糖葫芦】诗一首
    【板栗饼】诗一首
    【白云观寻道】诗一首
    Android开发常用网站汇总
    BZOJ 2281 消失之物
    BZOJ 2281 消失之物
    BZOJ 4033: [HAOI2015]树上染色
    BZOJ 4033: [HAOI2015]树上染色
  • 原文地址:https://www.cnblogs.com/CallMeUncle/p/5511093.html
Copyright © 2020-2023  润新知