四大组件之Activity

转载请注明出处:http://blog.csdn.net/f123210f/article/details/78234060

Android中我们常见的组件Activity敢说第二,估计没有人敢说第一了。它也是用户最主要的感知来源。下面我们来详细的解剖一下Activity。

大家喜欢的话,记得收藏点赞哦!

一、Activity是什么

Activity的翻译是活动,它被定义为与用户交互直接的组件,我们打开一个软件看到的,以及点击到的,都是在Activity上。一个应用可以有多个Activity。

二、Activity的生命周期

首先大家来看一张生命周期图(此图来自于网络)

Activity生命周期

我们注意到,其中主要有七个生命周期方法。下面一一介绍:

一、onCreate():
这是Activity开始时的第一个声明周期方法,在这里主要做一些初始化的操作,如setContentView()用来设置一个布局,以及绑定一些事件。

二、onStart():
Activity由不可见到可见时调用的方法

三、onResume():
Activity可以操作时的方法,此时Activity一定处于运行状态,并且聚焦可操作。

四、onPause():
这个声明周期方法对应onResume()方法,此时Activity已经处于失焦状态,此时我们就已经可以考虑释放掉一些消耗CPU的资源。

五、onStop():
对应onStart(),这个方法在Activity完全不可见时调用。

六、onDestory():
对应onCreate(),这个声明周期方法之后,Activity将被销毁。

七、onRestart():
这个方法调用时机是,当Activity结束流程走到onStop()时,如果重新开启此Activity,那么就会调用onRestart()方法。

说了这么多,那么我们打开一个Activity,声明周期到底是怎么变化的呢?

八、常见的声明周期变化:

  1. 如果是刚刚开启应用,也就是第一个Activity,那么他会执行onCreate()->onStart()->onResume();

  2. 如果是从一个Activity跳转到另一个Activity,如A跳转到B,那么A会执行onPause()->onStop(),紧接着B执行onCreate()->onStart()->onResume();

  3. 如果我们运行中,也就是onResume()执行后,按下键盘上的 Home 键,会执行onPause()->onStop();按下的如果是返回键,会执行onPause()->onStop()->onDestory(),

说到这里,声明周期大家应该明白了,那么如何从A跳转到B呢?这里向大家介绍另一个重要的东西 Intent

Intent

Intent 是进程间通信的一种方式,实现了与Parcelable, Cloneable接口,大家暂时不用管这么多,先知道Intent如何使用即可。后面的博客会为大家详解Intent。
比如从当前Activity调转到SecondActivity,代码如下。

Intent intent = new Intent(this, SecondActivity.this);
startActivity(intent);//开始跳转

当然我们还可以使用Intent传递一些数据过去,主要可以传递的数据类型有
java :八大基本类型及其数组
bundle :数据捆
Serializable :序列化
Parcelable :序列化到公共内存
Intent :意图类型

Intent intent = new Intent(this, SecondActivity.this);
intent.putExtra("key", value);//普通类型

Bundle bundle = new Bundle();
bundle.putString("key", value);
intent.putExtra("key", bundle); //bundle类型

startActivity(intent); //开始跳转

到这里,不禁有人要问了,如果不知道跳转的B活动叫什么名字,如别人的应用,我该怎么跳转呢,别急,上面介绍的是显式Intent,下面给大家介绍隐式Intent

首先,B活动,也就是要被跳转的Activity要在清单文件AndroidManifest.xml中配置如下标签:

<intent-filter>
    <action android:name="com.wxb.intent.Second" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

然后开始跳转,只需要加一行代码即可:

Intent intent = new Intent();
intent.setAction("com.wxb.intent.Second");
startActivity(intent);

这里给大家列出常用的一些跳转系统应用的代码:

  1. 发送短信
Uri uri = Uri.parse("smsto:18888888888");
Intent i=newIntent(Intent.ACTION_SENDTO, uri);
i.putExtra("sms_body", "The SMS text");
startActivity(i);
  1. 打电话
Uri uri = Uri.parse("tel:18888888888");
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);
  1. 浏览网页
Uri uri = Uri.parse("http://www.google.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

以上就是跳转Activity的全部流程。有人要问了,如果我跳转到B,此时又想回到A怎么办?

此时有两种办法,一种方法就是再跳转一次,用上面的代码从B跳转到A,重新执行刚刚我们说过的生命周期方法。
注意,由于重新执行A的onCreate()->onStart()->onResume(),就是重新创建了一个A活动,刚才初始化过的东西会被重新初始化,如果我们不需要重新创建,就要使用第二种方法。

第二种方法就是startActivityForResult();代码如下

Intent intent = new Intent(this, SecondActivity.this);
startActivityForResult(intent,1);//开始跳转,参2是请求码

//然后重写Activity中的一个方法
@Override   //重写onActivityResult方法,进行data非空校验,进行resultCode值判断
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
    if(null == data) 
        return;
    switch (resultCode) {//根据返回码进行判断是从哪一个Activity返回的,当然使用请求码也可以
        case 10:
            break;
        case 20:
            break;
        default:
            break;
    }
}
//SecondActivity 接收方代码
Intent intent = new Intent(); // 设置返回的数据
intent.putExtra("sms", arr[position]);
setResult(20,intent);   //响应码 注意setResult()一定要在finish()前调用
finish();   //关闭当前Activity

基本使用方法已经介绍完了,还有一些特殊的。如上面说到的,我们按下 Home 键返回桌面,Activity我们并没有关闭,只执行了onPause()->onStop()。此时系统内存不够,Activity被杀掉,那么会怎么样呢。

九、异常退出
这里介绍两个新的生命周期方法onSaveInstanceState()和onRestoreInstanceState()

  • onSaveInstanceState()
    异常退出时系统会调用onSaveInstanceState()这个方法,我们可以在这里保存一些东西。保存方式就是我们上边介绍过的bundle。
    这个方法在onStop()之前,与onPause()没有明显的先后区别。

  • onRestoreInstanceState()
    我们再次打开此Activity时,就可以使用在onCreate()中,或onRestoreInstanceState()中拿到保存的数据。
    这个生命周期方法在onStart()之后执行.
    注意: onCreate()中拿到的bundle对象可能为空,而onRestoreInstanceState()只要调用了bundle就不会为空。

任务栈

不知道大家有没有这样的疑问,我们一直开启新的Activity,按返回键的时候是怎么返回的呢?这就涉及到Activity的任务栈了。

Activity每次开启就会在任务栈的最上方添加一个Activity实例,每次按下返回键销毁一个Activity的时候,最上方的Activity会被移除,直到将任务栈中所有的Activity移除才能退出Activity。这就不方便用户使用了。

Android为我们提供了四种启动模式来解决此问题

Activity的启动模式(launchmoded): 影响activity在任务栈中的顺序。任务栈:先进后出
设置方法:

在清单文件中的Activity标签中填入如下属性 launchmode = "";
  • 标准模式:standard
    默认的,开启一个 Activity ,系统创建 Activity 的实例对象,把他放到应用程序任 务栈的栈顶

  • 单一顶部模式:singleTop
    开启 Activity 界面,系统回去应用程序任务栈的栈顶查找有没有这个 Activity 的实例对象,如果有,则复用栈顶的 Activity ;如果栈顶没有,则在栈顶创建 Activity 的实例对象
    系统浏览器的书签

  • 单一任务模式:singleTask
    开启 Activity,系统回去应用程序的任务栈查找有没有这个 Activity 的实例对象,如果有,则移除这个 Activity 上面的所有 Activity 的实例对象,使其位于任务栈的栈顶;如果没有,则在栈顶创建这个 Activity 的实例对象
    应用场景:系统浏览器

  • 单一实例模式:singleInstance
    开启目标 Activity ,系统给这个 Activity 创建一个单独的任务栈,这个任务栈就只有这个 Activity 。整个手机操作系统里就只有这样的一个 Activity 。
    应用场景:系统的来电界面

以上就是所有Activity的基础知识了。由于水平有限,如有错误欢迎大家指正,谢谢!

大家喜欢的话,别忘了收藏点赞哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值