没错,就是那个说了N遍的Activity

Activity 对,就是Activity!

经典镇楼




我知道
这对你来说是一张很面熟的图

这张图
真的是经典中的经典

但是
你可能并不能理解

表方
接下来
我们来一起梳理一下
(●’◡’●)ノ


此处输入图片的描述



Activity生命周期

  • onCreate()

    继承Activity类时默认生成,在activity第一次被创建时候被调用,完成activity初始化。

  • onStart()

    当然在onCreate()之后被调用,这个时候你还看不到activity,在activity即将被你看见的时候,它被调用。

  • onResume()

    activity正在运行,即处于active/running的状态。

  • onPause()

    系统准备去撩别的activity的时候,当前activity马上要走了的时候被调用。在这个里面,赶紧把一些消耗CPU的资源放掉,养精蓄锐,等activity回来哟。[害羞脸]

  • onStop()

    当你已经完全看不到activity的时被调用。
    请注意:是完全看不到了,如果看到一根头发丝都不会被执行,比如:弹出了一个对话框的activity。

  • onDestory()

    在销毁前被调用。[忧伤.jpg]

  • onRestart()

    在onStop之后,从停止状态变成运行,那么经过onRestart又回到onStart。


又回到最初的起点~
activity温柔的脸~
啊哈哈哈


Activity被回收了之后


系统长时间处于stop的时候

或者内存极为紧张的时候

你的activity会被回收……

此处输入图片的描述

心疼2s

但是系统为了补偿

提供如下解决方法

  • onSaveInstanceState()

    会将activity状态通过这个方法保存至Bundle对象,当然你也可以额外增加键值存入Bundle来保存这些状态。
    但是,一切的前提:activity不是被用户finish的!

  • onRestoreInstanceState()

    这个方法可以理解为恢复上面大哥临时保存的状态。
    产生的Bundle对象传递到该方法以及onCreate()方法中。
    发现了吗?这就是onCreate()里面的参数。


Word天!原来是这样

public class MainActivity extends AppCompatActivity {

    String data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        if (savedInstanceState != null) {
            data = savedInstanceState.getString("data_key");
        }
        ......
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        String temp = "ahahaha";
        outState.putString("data_key", temp);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if (savedInstanceState != null) {
            data = savedInstanceState.getString("data_key");
        }
    }
}

Activity的四种启动模式


AndroidMainifest启动




  • standard – 标准启动模式
    默认模式,可以理解为叠罗汉,每次都会创建新的实例,覆盖在原来的额上面。


  • * singleTop *
    判断栈顶最上层是不是我们需要启动的activity。如果是,则不需要创建新的实例。


手残星人

  • * singleTask *
    检查整个栈中是否有需要启动的activity,如果存在则将该activity以上的所有acitivity都销毁。


主要看文字,啊哈哈,手残星人

  • * singleInstance*
    这个声明的activity会出现在一个新的栈中,这个栈只有这一个activity。两个应用之间可以共享这一个activity。




**Intent Flag启动**

* 该方法优先级高于AndroidMainifest启动 *



- FLAG_ACTIVITY_NEW_TASK
使用一个新的Task来启动一个Activity。
通常使用在从Service中启动Activity场景,由于Service中不存在Activity栈,使用改Flag创建一个新的Activity栈,并创建新的Activity实例。


- FLAG_ACTIVITY_SINGLE_TOP
相当于android:launchMode=”singleTop”


- FLAG_ACTIVITY_CLEAR_TOP
相当于android:launchMode=”singleTask”


- * FLAG_ACTIVITY_NO_HISTORY*
使用这种模式启动activity,当当前activity启动其他activity之后,该activity消失,不保留在Activity栈中。


FLAG_ACTIVITY_NO_HISTORY


IntentFilter匹配规则


IntentFilter过滤信息有:action、category、data。
一个过滤列表中可以有多个。
只有同时匹配这三项才能成功启动目标Activity。
一个Activity中可以有多个过滤列表,只要匹配任何一组即可成功启动目标Activity。



- action匹配规则
当一个过滤规则中有多个action时,只要Intent中的action能和过滤规则中任意一个action相同,即匹配成功。



- category匹配规则
1.category是一个字符串,系统有预定义一些,我们也可以定义自己的category。

2.当存在多个的时候,必须使每一个Intent中的category和过滤规则中的category完全相同,才能匹配成功。

3.当不存在时,系统在调用startActivity或startActivityForResult的时候默认为Intent加上“android.intent.category.DEFAULT”。

4 .为了使activity可以接收隐式调用,必须在intent-filter中指定“android.intent.category.DEFAULT”。



- data匹配规则
与action类似,但结构较为复杂。

<!-- data语法  -->
<intent-filter>
    <data
        android:host="string"
        android:mimeType="string"
        android:path="string"
        android:pathPattern="string"
        android:pathPrefix="string"
        android:port="string"
        android:scheme="string" />
      ……
</intent-filter>


<!-- 也可以写成 -->
<intent-filter>
    <data   android:host="string" />
    <data   android:mimeType="string" />
     ……
</intent-filter>

data由两部分组成,mime和URI,见下图

eg:
intent.setDataAndType(Uri.parse(“http://123“),”image/jpeg”);



如果
屏幕那端的你看完了
还是一脸萌B
那我就


此处输入图片的描述


好了
以上就是对Activity简单的梳理。
存在错误的地方还请大家多多指正!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值