序言:

上篇大概的讲解了新建一个android的流程。今天为大家带来的是Activity详解,因为自己在开发过程中就遇到

好几次坑,尴尬。

生命周期

和Java里头一样一样的,如图

图片来源于网上哈,自己画不来。

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里面重写,如图:

新建的Activity默认只有Oncreate函数。

  1. using System;
  2. using Android.App;
  3. using Android.Content;
  4. using Android.Runtime;
  5. using Android.Views;
  6. using Android.Widget;
  7. using Android.OS;
  8. using Android.Util;
  9.  
  10. namespace FirstAndroidAPP
  11. {
  12. [Activity(Label = "FirstAndroidAPP", MainLauncher = true, Icon = "@drawable/icon")]
  13. public class MainActivity : Activity
  14. {
  15. int count = ;
  16.  
  17. protected override void OnCreate(Bundle bundle)
  18. {
  19. base.OnCreate(bundle);
  20. // Set our view from the "main" layout resource
  21. SetContentView(Resource.Layout.Main);
  22. // Get our button from the layout resource,
  23. // and attach an event to it
  24. Button button = FindViewById<Button>(Resource.Id.MyButton);
  25. button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };
  26. }
  27.  
  28. protected override void OnStart()
  29. {
  30. Log.Debug("OnStart", "Activity重新回到前台");
  31. base.OnStart();
  32. }
  33.  
  34. protected override void OnResume()
  35. {
  36. Log.Debug("OnResume", "OnResume called");
  37. base.OnResume();
  38. }
  39.  
  40. protected override void OnStop()
  41. {
  42. Log.Debug("OnStop", "OnStop called");
  43. base.OnStop();
  44. }
  45.  
  46. protected override void OnDestroy()
  47. {
  48. Log.Debug("OnDestory", "系统被销毁");
  49. base.OnDestroy();
  50. }
  51.  
  52. protected override void OnRestart()
  53. {
  54. Log.Debug("OnRestart", "系统重新回到前台");
  55. base.OnRestart();
  56. }
  57.  
  58. }
  59. }

上述还有一种会触发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

编译后会在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,内容很简单

  1. [Activity(Label = "SecondActivity")]
  2. public class SecondActivity : Activity
  3. {
  4. protected override void OnCreate(Bundle savedInstanceState)
  5. {
  6. base.OnCreate(savedInstanceState);
  7. SetContentView(Resource.Layout.Second);
  8. // Create your application here
  9. }
  10.  
  11. DateTime? lastBackKeyDownTime;//记录上次按下Back的时间
  12. public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e)
  13. {
  14. if (keyCode == Keycode.Back && e.Action == KeyEventActions.Down)//监听Back键
  15. {
  16. if (!lastBackKeyDownTime.HasValue || DateTime.Now - lastBackKeyDownTime.Value > new TimeSpan(, , ))
  17. {
  18. Toast.MakeText(this, "再按一次退出程序", ToastLength.Short).Show();
  19. lastBackKeyDownTime = DateTime.Now;
  20. }
  21. else
  22. {
  23. Intent intent = new Intent();
  24. intent.SetClass(this, typeof(MainActivity));
  25. StartActivity(intent);
  26. }
  27. return true;
  28. }
  29. return base.OnKeyDown(keyCode, e);
  30. }
  31.  
  32. }

在MainActivity中点击Button,跳转到SecondActivity中

  1. protected override void OnCreate(Bundle bundle)
  2. {
  3. base.OnCreate(bundle);
  4. // Set our view from the "main" layout resource
  5. SetContentView(Resource.Layout.Main);
  6. // Get our button from the layout resource,
  7. // and attach an event to it
  8. Button button = FindViewById<Button>(Resource.Id.MyButton);
  9. button.Click += delegate
  10. {
  11. Intent intent = new Intent(this, typeof(SecondActivity));
  12. StartActivity(intent);
  13. };
  14. }
  15.  
  16. protected override void OnNewIntent(Intent intent)
  17. {
  18. Finish();
  19. }

效果如图:

在这里补充一点儿SingTask的描述:

singleTask 如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时, 会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。为了验证会将MainActivity上的实例销毁,我们在SecondAvtivity中重写OnDestory函数,打上日志:

  1.  

自此,可以确认是被销毁了,哈哈哈

  1.  

Activity传值

最后在稍微的描述下Activity传值吧,在MainActivity中打开SecondActivity时加上如下代码

  1. Intent intent = new Intent(this, typeof(SecondActivity));
  2. intent.PutExtra("name","hushuai");
  3. StartActivity(intent);

然后在SecondActivity的OnCreate函数中去接收它:

  1. base.OnCreate(savedInstanceState);
  2. SetContentView(Resource.Layout.Second);
  3. string name = Intent.GetStringExtra ("name");
  4. Toast.MakeText (this, "我是谁?我当然是" + name + "了啊!", ToastLength.Short).Show ();

Finally,你会看到如下效果图:

这是最简单的方式,想要了解更多,自己去搜索。要动手写过才知道。

最后

就写到这儿吧,毕竟在公司还是要上班。每晚上写点儿,今天早上来公司补充了最后的一点儿。写的都小心翼翼,怕被领导看见了。

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

再贴点儿我现在做的东西的界面图吧,毕竟自己又不是美工,又是我一个人做,所以有点儿丑。

到时候再和大家分享一些遇到的问题,写博速度有点儿慢,然后就是文章排版头痛。

望大家支持,3Q。

吐槽一点儿,为什么博客园分类没有Xamarin 系列?

Xamarin android 之Activity详解的更多相关文章

  1. 详解Android中的四大组件之一:Activity详解

    activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...

  2. Android之canvas详解

    首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...

  3. 【转】Android Canvas绘图详解(图文)

    转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文) 泡 ...

  4. Android GLSurfaceView用法详解(二)

    输入如何处理       若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件.下面有个例子: java代码: package eoe.ClearTes ...

  5. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

  6. Android Fragment用法详解(2)--动态添加Fragment

    在上一篇文章<Android Fragment用法详解(1)--静态使用Fragment>我们讲解了Fragment的最简单的用法.这次我们来说一说Fragment复杂一丢丢的用法.在代码 ...

  7. Android中Context详解 ---- 你所不知道的Context(转)

    Android中Context详解 ---- 你所不知道的Context(转)                                               本文出处 :http://b ...

  8. Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...

  9. android 四大组件详解

    这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重 ...

随机推荐

  1. 全新 Mac 安装指南(通用篇)(推荐设置、软件安装、推荐软件)

    注:本文将会不定期维护与更新,有需要的朋友请在 Github 上订阅该条 Issues:<全新 Mac 安装指南(通用篇)>. 在 Mac 电脑上只用 Windows 操作系统的同学请看到 ...

  2. 基于GIS的旅游辐射区人口统计

    在旅游规划中,考虑旅游景点周边的人口负载量是很重要的一个方面,这将直接影响资源的投入和配置,开发潜力和规模等.基于GIS可以将人口信息进行空间化的展示,还可以通过空间分析的方法计算出旅游景点辐射区的人 ...

  3. Worktile协同特色之一:无处不在的关注

    团队沟通中常见问题 在回答这个问题之前,我们不妨先来思考一下,团队成员之间互相配合沟通的几个问题:1. 任务的执行者在完成这个任务时,如何通知到此任务相关联的其他成员,比如该任务的后续任务执行者?2. ...

  4. Module Zero之Nuget包

    返回<Module Zero学习目录> ABP module-zero已经发布在了nuget上了.这里是所有的包列表. Abp.Zero module zero的核心包. Abp.Zero ...

  5. java spring 邮件发送

    开发中经常会遇到发送邮件进行用户验证,或者其它推送信息的情况,本文基于spring,完成邮件的发送,主要支持普通文本邮件的发送,html文本邮件的发送,带附件的邮件发送,没有实现群发.多个附件发送等需 ...

  6. spring快速入门(四)

    一.在spring快速入门(三)的基础上,我们来了解BeanFactory及配置. Client package com.murong.client; import org.springframewo ...

  7. 每天一个linux命令(45):free 命令

    free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer.在Linux系统监控的工具中,free命令是最经常使用的命令之一. 1.命令格式: free [参 ...

  8. hbase 1.1.7在centor6.5安装过程

    1.自己安装的最新版一直没成功,换成了1.1.7稳定版的.中间遇到的问题记录下 1) jdk 用的1.7版本的,安装过程省略. 2)下载hbase  zip包:https://mirrors.tuna ...

  9. Angular $watch

    如果想在某个属性发生变化的时候执行某些操作,那么scope.$watch是最佳选择 https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$w ...

  10. Java 的设计模式之一装饰者模式

    刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行 ...