Xamarin android 之Activity详解
序言:
上篇大概的讲解了新建一个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函数。
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 = ; 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
编译后会在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(, , ))
{
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 系列?
Xamarin android 之Activity详解的更多相关文章
- 详解Android中的四大组件之一:Activity详解
activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...
- Android之canvas详解
首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...
- 【转】Android Canvas绘图详解(图文)
转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文) 泡 ...
- Android GLSurfaceView用法详解(二)
输入如何处理 若是开发一个交互型的应用(如游戏),通常需要子类化 GLSurfaceView,由此可以获取输入事件.下面有个例子: java代码: package eoe.ClearTes ...
- android屏幕适配详解
android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...
- Android Fragment用法详解(2)--动态添加Fragment
在上一篇文章<Android Fragment用法详解(1)--静态使用Fragment>我们讲解了Fragment的最简单的用法.这次我们来说一说Fragment复杂一丢丢的用法.在代码 ...
- Android中Context详解 ---- 你所不知道的Context(转)
Android中Context详解 ---- 你所不知道的Context(转) 本文出处 :http://b ...
- Android USB 开发详解
Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...
- android 四大组件详解
这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重 ...
随机推荐
- 《代码的未来》读书笔记:内存管理与GC那点事儿
一.内存是有限的 近年来,我们的电脑内存都有好几个GB,也许你的电脑是4G,他的电脑是8G,公司服务器内存是32G或者64G.但是,无论内存容量有多大,总归不是无限的.实际上,随着内存容量的增加,软件 ...
- HappyAA服务器部署笔记2(nginx的静态资源缓存配置)
我近期对服务器进行了少量改进,虽然之前使用了nginx反向代理之后性能有所提高,但仍然不够,需要使用缓存来大幅度提高静态资源的访问速度. 服务器上的静态资源主要有这些:png, jpg, svg, j ...
- mysql定义和调用存储过程
/*定义delimiter为 // */ delimiter // CREATE procedure sp_add3(a int, b int,out c int) begin set c=a+ b; ...
- 同一AppDomain内的SharpGL的FrameBuffer会相互影响?
同一AppDomain内的SharpGL的FrameBuffer会相互影响? 今天做一个试验时,偶然发现了这样一个问题. 以SharpGL的示例项目SimpleDrawingSample为例. 给Fo ...
- Pointer's NULL And 0
问题起源 在使用Qt框架的时候, 经常发现一些构造函数 *parent = 0 这样的代码. 时间长了, 就觉的疑惑了. 一个指针不是等于NULL吗? 这样写, 行得通吗? 自己测试一下就可以了. 测 ...
- 调试的时候 line not available!
手贱, 不小心修改了一个地方,后面调试代码的时候,总感觉不对.出现: line not available, 总是到不了源码里面,反复部署了N次还是一样, 非常郁闷,... 搞了一两个小时后,后面醒悟 ...
- Java邮件发送与接收原理
一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...
- 借助node实战WebSocket
一.WebSocket概述 WebSocket协议,是建立在TCP协议上的,而非HTTP协议. 如下: ws://127.0.0.1或wss://127.0.0.1就是WebSocket请求. 注:w ...
- 编写atoi库函数
看到很多面试书和博客都提到编写atoi函数,在很多面试中面试官都会要求应聘者当场写出atoi函数的实现代码,但基本很少人能写的完全正确,倒不是这道题有多么高深的算法,有多么复杂的数据结构,只因为这道题 ...
- linux中断与异常
看了<深入理解linux内核>的中断与异常,简单总结了下,如果有错误,望指正! 一 什么是中断和异常 异常又叫同步中断,是当指令执行时由cpu控制单元产生的,之所以称之为异常,是因为只有在 ...