序言: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 系列?