Xamarin.Android开发实践(三)
2015-06-30 09:11
483 查看
一、前言
用过Android手机的人一定会发现一种现象,当你把一个应用置于后台后,一段时间之后在打开就会发现应用重新打开了,但是之前的相关的数据却没有丢失。可以看出app的“生命”是掌握在系统手上的,而不像Windows上开发的程序。二、活动的生命周期
这里我们借助一张图帮助我们理解:
1 protected override void OnCreate(Bundle bundle) 2 { 3 base.OnCreate(bundle); 4 5 string extraString; 6 bool extraBool; 7 8 if (bundle != null) 9 { 10 intentString = bundle.GetString("myString"); 11 intentBool = bundle.GetBoolean("myBool"); 12 } 13 SetContentView(Resource.Layout.Main); 14 }
当OnCreate结束后,紧接着执行OnStart方法。
2.OnStart
OnStart将在OnCreate后由系统调用,该方法一般只有在需要在视图出现之前执行特地的任务,比如更新视图中显示的值。在该方法完毕之后将执行OnResume方法。3.OnResume
当活动准备开始与用户交互时会触发该方法,一般只会在需要执行以下的操作时才重写该事件:l 开始动画
l 开始监听GPS更新
l 显示一些相关的提示和对话框
l 注册广播监听
作为演示,下面是初始化照相机的代码:
1 public void OnResume() 2 { 3 base.OnResume(); 4 5 if (_camera==null) 6 { 7 // 初始化 8 } 9 }
OnResume非常重要,特别是在触发OnPause后。用户又切回应用,那么就需要OnResume进行恢复。所以接着就是OnPause事件。
4.OnPause
当活动被切换到后台时将触发该方法,一般我们需要在该事件做如下的事情:l 保存用户未提交的数据
l 关闭或清除引用的资源
l 注销广播
l 如果存在正在显示的提示或者对话框,则必须利用.Dismiss()进行清除。
作为演示,下面的代码将把照相机资源进行释放:
1 public void OnPause() 2 { 3 base.OnPause(); 4 5 if (_camera != null) 6 { 7 _camera.Release(); 8 _camera = null; 9 } 10 }
5.OnStop
当该活动长时间没有在显示给用户下就会触发,一般会由以下原因触发:l 当一个新的活动打开,并覆盖该活动时
l 一个已存在的活动切换到前台时
l 活动被销毁时
OnStop不是每次都会被执行,如果内存低下时,系统将不会执行该事件,而是直接关闭该应用,所以大家在OnPause事件中就要保存好所以的参数等等。而不能依赖该事件。
6.OnDestroy
该事件是整个活动生命周期中最后一个,但是很多情况下并不会执行到这个事件,所以很少重写该方法。7.OnRestart
当用户通过Home按钮将该用户切换到后台,并在之后又打开该应用则会触发该事件。一般也很少重写该方法。小节:
通过上面的介绍,我们可以明白活动中不是所有的事件都是有用的,其中比较常用的是OnCreate,OnResume,OnPause当然下面还会介绍专门用来保存用户状态的事件。
三、生命周期中状态管理
首先我们先用一张图来形容:1 [Activity(Label = "Activity_Liftcycle", MainLauncher = true, Icon = "@drawable/icon")] 2 public class MainActivity : Activity 3 { 4 int count = 1; 5 6 private TextView tv; 7 8 protected override void OnCreate(Bundle bundle) 9 { 10 base.OnCreate(bundle); 11 SetContentView(Resource.Layout.Main); 12 13 tv = FindViewById<TextView>(Resource.Id.textView1); 14 tv.Text = count.ToString(); 15 Button btn = FindViewById<Button>(Resource.Id.button1); 16 btn.Click += (e, s) => 17 { 18 count++; 19 tv.Text = count.ToString(); 20 }; 21 } 22 }
这里不用解释,大家也知道,其实就是一个累加。现在我们F5运行,然后点击几次Add之后如下所示:
1 [Activity(Label = "Activity_Liftcycle", MainLauncher = true, Icon = "@drawable/icon")] 2 public class MainActivity : Activity 3 { 4 int count = 1; 5 6 private TextView tv; 7 8 protected override void OnCreate(Bundle bundle) 9 { 10 base.OnCreate(bundle); 11 SetContentView(Resource.Layout.Main); 12 13 //如果存在则恢复之前的状态 14 if (bundle != null) 15 { 16 count = bundle.GetInt("_count"); 17 } 18 19 tv = FindViewById<TextView>(Resource.Id.textView1); 20 tv.Text = count.ToString(); 21 Button btn = FindViewById<Button>(Resource.Id.button1); 22 btn.Click += (e, s) => 23 { 24 count++; 25 tv.Text = count.ToString(); 26 }; 27 } 28 29 protected override void OnSaveInstanceState(Bundle outState) 30 { 31 base.OnSaveInstanceState(outState); 32 //保存当前状态 33 outState.PutInt("_count", count); 34 } 35 }
我们接着点击add:
然后翻转:
还有一个OnRestoreInstanceState也可以用来恢复状态,只是它会在OnStart之后执行。意味着它是在所有初始化完成之后进行的,而该方法的参数与OnCreate中的参数是一致的,所以不是常用该方法来恢复状态。
相关文章推荐
- Android 性能测试初探(三)
- android资料
- Android 性能测试初探(二)
- Android 性能测试初探(一)
- android 随笔,代码片段
- Android学习笔记----ArcGIS在线地图服务(Android API)坐标纠偏
- Xamarin.Android开发实践(二)
- android edittext+listview进阶 实现搜索listview中的内容 定制自己的过滤器
- Android学习笔记----Java字符串MD5加密
- Android学习笔记----Java中的字符串比较
- Android IOS WebRTC 音视频开发总结(十九)- kurento
- Android IOS WebRTC 音视频开发总结(十九)- kurento
- Android Studio 添加注解模板,解决办法。
- Android_布局_文章列表
- Android Audio System
- [转]Android实战技术:理解Binder机制
- Android中的Audio播放:控制Audio输出通道切换
- 使用php作为桥梁让android客户端和mysql数据库进行通信
- android edittext + listview 实现搜索listview中的内容
- android searchView加ListView共同使用