一.概述
通过学习本篇文章,你将学会:
1.Activity的生命周期
2.Activity生命周期的交互设计思想
3.onSaveInstanceState方法和onRestoreInstanceState方法作用和调用时机
4.Activity的启动模式
5.Activity之间的数据交互
6.启动系统中常见的Activity
二.Activity的生命周期
Activity是Android提供的四大组件之一,是进行Android开发必不可少的组件。我们可以把它理解为可以和用户直接直接进行交互的载体,就是能实实在在看得见的界面。学习Activity,我们首先需要了解它的一个生命周期,Android官方文档给出的生命周期:
![](https://img.haomeiwen.com/i10074373/d635fdd3800d6541.png)
从上图可以看到,Activity的基本生命周期是:onCreate--->onStart--->onResume--->onPause--->onStop--->onDestory,可以记忆成“创始人,盘丝洞”。下面讲一下每个函数的作用:
onCreate:当Activity第一次被创建的时候调用此方法,一般在此方法中进行控件的声明,添加事件等初始化工作。
onStart:当Activity被显示到屏幕上的时候调用此方法,但是还没出现在前台,我们还看不到,无法与Activity交互。
onResume:当Activity能够被操作之前,也就是能够获得用户的焦点之前调用此方法.
onRestart:当Activity被停止后又被再次启动之前调用此方法.接着将调用onStart()方法
onPause:当Activity失去焦点,去重新开启另外一个活动的时候调用,可以在这里做一些数据的的保存和资源的释放,但是不能做耗时操作
onStop:此Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。
onDestory:此Activity被销毁,不可见,我们可以将还没释放的资源释放,以及进行一些回收工作
三.Activity生命周期的交互设计思想
1.A启动B,然后从B返回A生命周期会怎么调用:
onPause(A)--->onCreat(B)--->onStart(B)--->onResume(B)--->onStop(A)
思考:
1.为什么先调用第一个Activity的onPause()方法,然后再调用第二个Activity的onCreate()
2.为什么不是先调用A的onStop方法结束了再去调用B的onCreate
解答:
1.假如有这样一个情况,你正在使用APP听音乐,突然来了一个电话,那么当然需要先暂停音乐,然后进行电话的处理。所以这就是onPause()方法的作用,可以用来保存当前的各种信息.可以在这个APP的onPause()方法中实现暂停音乐的逻辑,然后再处理电话的业务处理,这就是这个方法的设计之初
2.根据上面生命周期相关方法的作用我们知道,只有当A完全不可见的时候activity才会调用onStop方法,而B只有在调用onResume的时候才是可见获取到焦点可操作的,因此需要等到B调用完onResume才会调用A的onStop。同时,也是谷歌对安全性的考虑,假如先调用第一个Activity的onStop()方法,那么此时第一个Activity将不可见,如果接下来调用第二个Activity的一系列创建方法失败了,那么就会导致这两个Activity都没显示在屏幕上,就会出现黑屏等不友好界面.如果是调用完第二个Activity一系列创建方法后,再调用第一个Activity的onStop()方法,就会避免这种情况的发生。
2.A启动B(Dialog风格的Activity),生命周期会怎么调用:
onPause(A)--->onCreate(B)--->onStart(B)--->onResume(B)
注意:如果A只是弹出dialog对话框的时候,A不会回调onPause。
四.onSaveInstanceState方法和onRestoreInstanceState方法作用和调用时机
Activity的onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况时由系统去销毁一个activity的时候比如因系统资源配置发生改变或者内存不足导致的activity的销毁。我们看下面这张图:
![](https://img.haomeiwen.com/i10074373/c5dba8c21681ea7f.png)
我们可以看到:由于activity是在异常情况下终止的,系统会调用onSaveInstance来保存当前activity状态,这个方法的调用时机是在onStop之前。当activity重新创建后,系统会调用onRestoreInstanceState,并且把activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,onRestoreInstanceState会在onCreate之后,onResume之前调用。
注意: 通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
五.Activity的启动模式
Activity有四种启动模式:standard,singleTop,singleTask,singleInstance
1.standard:标准模式,也是默认的启动模式,启动activity时直接创建新的实例并压入启动它的任务栈顶。
2.singleTop:单顶模式,栈顶复用模式,该模式唯一与standard不同的就是,如果启动singleTop模式的activity时发现当前任务的栈顶已经存在着这个activity的实例,那么就不会创建新的实例,其他的跟标准模式一样。
3.singleTask:单任务模式,栈内复用模式,当我们将要启动该模式的activity时,系统会判断当前是否有它想要的任务栈:没有它要的任务栈 系统会新创建一个任务,并将该activity实例化作为该任务的根activity。有它要的任务栈 这时候系统会找到该任务栈,如果任务栈里只有它自己则直接调用该activity实例的onNewIntent()方法。如果任务栈中它的上方还存在别的activity,那么这些activity会被全部弹出栈。
4.singleInstance:单例模式,会为activity单独创建一个任务并能够复用。但是该模式的activity不允许其他activity跟自己存在于同一个任务中,由此 activity 启动的任何 activity 均会被在其他的任务中打开。
六.Activity之间的数据交互
1.通过Intent的putExtra方法传递JAVA八大基本类型及其数组类型等:
intent.putExtra("name","zhangsan");//发送
getIntent().getStringExtra("name");//接收
2.通过Bundle将数据达成一捆进行传递 //发送 Bundle bundle =new Bundle(); bundle.putString("name","zhangsan"); bundle.putInt("age",23); intent.putExtras(bundle);
//接收
intent.getStringExtra("name")
3.使用Bundle对象的putSerializable()方法
新建一个Person实现Serializable,通过bundle的putSerializable("person",person); intent.putExtras(bundle);
Person person = (Person) intent.getSerializableExtra("person");
七.启动系统中常见的Activity
1.打开浏览器网页:
Intent intent =new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
2.打开相册:
Intent intent =new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivity(intent);
3.打开发送短信界面:
Intent intent =new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"Hello World !");
startActivity(intent);
4.打开拨号界面:
Intent intent =new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("tel:110"));
startActivity(intent);
八.总结
以上就是关于activity的知识点,如有不足或者错误的地方,请指正。不管怎样,代码的东西不只是需要多看,更需要通过自己动手去写去熟悉代码才能有更深的印象,更好更全面的了解。这是在简书上的第一篇文章,用的不是很熟练。
网友评论