谈谈Activity

Android中的Activity

1.Activity的生命周期

​ onCreate 创建 onStart 可见 onResume 可编辑/有焦点
​ onDestroy 销毁 onStope 不可见 onPause 不可编辑/失去焦点
​ 以上六个生命周期方法,两两成对出现
​ 还有 onRestart 从onStop直接回到onStart

2.Activity 的状态

​ foreground activity 前台活动
​ visible activity 可见活动
​ background activity 后台活动
​ empty process 空进程

3.Android线程的层次

​ 前台进程—|
​ 课件进程—|
​ 服务进程—|———存在的优先级也是由上到下越来越低
​ 后台进程—|
​ 空进程——|

4.如何保存Activity的状态

—–通常情况下Activity的状态会自动保存下来,虽然执行了onPause(),onStop()方法,activity的状态和数据也存在于内存中,但是,系统内存不足时,执行过onPause(),onStop() 方法的activity就可能会被销毁,数据自然就在内存中被销毁了。
—–这样我们就需要通过覆写onSaveInstanceState()方法来保存activity状态了,这个方法接收一个Bundle类型的参数,我们可以将状态数据存储到了个Bundle对象中,从而实现了状态保存。
—–不过需要注意的是,onSaveInstanceState()方法并不一定会被调用的,比如Back健退出方式,这个方式跳过生命周期方法,所以数据并没被保存下来,当然这种方式也并不需要将数据保存下来的,还有就是哦你SaveInstanceState()方法的调用要发生在onPause(),onStop()方法前。

5.两个Activity之间跳转时,生命周期方法的变化状况?

​ 场景一:有A,B两个全屏非透明的Activity,在A里面开启B
​ 执行顺序:A,onPause() — B,onCreat() – onStrat() – onResume() — A, onStop()

​ 场景二:有A 全屏非透明的Activity,而B是一个透明的或者对话框的Activity,同样在A里面开启B
​ 执行顺序:A,onPause() — B,onCreat() – onStrat() – onResume()

这里写图片描述

6.横竖屏切换时Activity的生命周期(先切横屏再切竖屏)

  1. 没有任配置的时候
    竖屏切换到横屏 – onSaveInstanceState() — onPause() — onStop() — onDestroy() — onCreate() — onStart() —onSaveInstanceState() — onResume()
    横屏切换到竖屏 – onSaveInstanceState() — onPause() — onStop() — onDestroy() — onCreate() — onStart() —onSaveInstanceState() — onResume()

  2. 在AndroidManifest.xml中,把该Activity添加 Android:configChanges=”orientation”

    竖屏切换到横屏 – onSaveInstanceState() — onPause() — onStop() — onDestroy() — onCreate() — onStart() —onSaveInstanceState() — onResume()
    横屏切换到竖屏 – onConfigurationChanged()

  3. 在AndroidManifest.xml中,把该Activity添加 android:configChanges=”orientation|
    keyboardHidden”
    竖屏切换到横屏 – onConfigurationChanged()
    横屏切换到竖屏 – onConfigurationChanged()

7.一次性推出一个打开多个Activity的Application

方案一:可以将每一个打开的Activity记录到一个List集合中,然后在需要关闭的时候,遍历集合并执行finish()方法

方案二:可以通过intent的flag的方式来实现intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity,其实就是相当给Activity配置启动模式为SingleTask,这样系统就会把这个上面的所有Activity全部干掉,然后再将这个Activity给finish掉就好了。

其实还有很多种方式,比如发送广播的方式,或者递归退出等方式,就不一一列举了。

8.Activity的四种启动模式

​ 1.Standard:默认模式

​ 这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中 加入新创建的实例,退出Activity则会在任务栈中销毁该实例。遵循后进先出原则。

​ 2.SingleTop

​ 这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。

​ 3.SingleTask

​ 如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。

​ 4.SingleInstance

​ 当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。

​ 配置方式:(优先级方式二高于方式一)

​ 方式一:activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=”“设置

这里写图片描述

​ 方式二:在用Intent开启一个Activity时,在Intent中加入标志
这里写图片描述

9.Activity跳转的几种方式

方式一:显示调用
​ 对于初学者来说,这个最常见,其中可以通过Intent传递数据
​ Intent intent=new Intent(MainActivity.this, SecondActivity.class);
​ startActivity(intent);

方式二:隐式调用
​ 这种适合调用系统的界面,只要action、category、data和要跳转到的Activity在AndroidManifest.xml中设置的匹配就行。

<activity
android:name="com.example.android.tst.SecondActivity"
android:label="@string/title_activity_main" >
    <intent-filter>
        <action android:name="com.example.android.tst.SecondActivity"/>
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
Intent intent=new Intent("com.example.android.tst.SecondActivity"); 
startActivity(intent);

方式三:调到另一Activity中,并可以在返回时返回数据
​ 1.在跳转的Activity端,调用startActivityForResult(intent2, 1),跳转到下一个Activity,其中第一个参数为传入的意图对象,第二个为设置的请求码;
​ 2.跳转到第二个Activity后,调用setResult(100, intent)方法可返回上一个Activity,其中第一个参数为结果码,第二个为传入的意图对象;
​ 3.在第一个Activity通过onActivityResult()方法获得返回的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值