android:Activity实例的概念及生命周期
前言:不同于C编程是通过main函数来启动一个程序,在安卓系统中是通过使用Activity启动程序;在了解Activity的使用之前,首先要了解一下关于Activity的一些概念。
Activity具有生命周期,通过调用系统中的回调方法来创建和管理自己的生命周期状态;Activity通过生命周期来管理自己;
在生命周期中Activity会被实例化,Activity实例是安卓app的关键组件之一;
Activity实例启动之后会被集中放在任务栈中进行管理,Activity的启动模式会影响到任务栈的管理方式;
所有Activity在使用之前需要现在manifest.xml中声明,一般创建Activity的时候会自动声明;
<manifest > <application> <activity android:name=".OneActivity" /> <activity android:name=".TwoActivity"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain" /> </intent-filter> </activity> <activity android:name=".ThreeActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity> </application> </manifest >
1、activity的生命周期
看视频的时候有人打电话进来,我们接完电话之后,总是希望能够继续看之前的视频,而不是重新看视频;
以上功能分解为逻辑就是:从ActivityA跳到ActivityB之后,再回到ActivityA之前的状态(相当于单片机的中断),而不是重新开始ActivityA;
Activityt通过生命周期划分为不同的状态,这样其他Activity返回或调用时,就可以跳转到某些对应的状态而不是重新开始。
1.1、生命周期的方法
Activity生命周期内,每个Activity不是必须要执行完所有状态方法的;
对于构建过的操作,需要确保在对应的生命周期方法内释放或终止它;
生命周期的所有方法大致如下:
1.1.1、onCreate():必须在初始化Activity时调用,将Activity实例化;
onCreate()方法执行完进入到created状态之后,Activity不会在当前状态停留,而是会马上调用onStart()方法;
1.1.2、onStart():始终紧随在onCreate()之后;
onStart()方法执行完进入到started状态之后,Activity也不会在当前状态停留,而是会马上调用onResume()方法;
1.1.3、onResume():始终紧随在onStart()之后;
在Activity与用户交互之前系统将调用当前方法,捕获用户的输入并进行交互;
后端逻辑大部分都是在这个状态中执行的,直到当前Activity失去焦点;
1.1.4、onPause():当Activity失去焦点时就会调用当前方法进入paused状态;
paused状态的停留时间不长,小部分资源会在onPause()方法中被释放;
1.1.5、onStop():当Activity被其他Activity覆盖、或者不可见之后,就会调用当前方法释放大部分资源;
此时Activity实例还在内存中;如果用户从其他Activity返回了,就会调用onRestart()重新进入started状态,
或者是调用onDestory()销毁当前Activity的实例;
可以在onStop()方法中将信息永久性存储到数据库中或room中;
Activity想要调用另一个app的Activity,需要在manifest的activity中设置两个Activity的permission权限为SHARE_POST。
1.1.6、onDestory():当Activity被用户撤销、或者调用了.finish()、或者是更改了配置,将调用当前方法;
确保Activity实例注销成功,相关资源和进程资源得到释放和注销;
由于配置使得Activity实例被迫注销,那么在系统的onSaveInstanceState()方法中依旧保存着被注销Activity的信息,
可以在下一次重新创建Activity之后恢复之前的实例状态;
2、activity的跳转方法
2.1、显示跳转:直接告诉Activity跳转到什么Activity;
2.1.1、new一个Intent,顺便把activity的类型指定了,然后调用startActivity()方法,省力省心;
Intent intent = new Intent ( this , Bactivity.class); startActivity(intent);
2.1.2、茴香豆的第二种写法;
Intent intent = new Intent( ); intent.setClass(this , 另一个activity.class); startActivity( );
2.1.3、茴香豆的第三种写法:同2.1.2只有中间一行不一样;
intent.setClassName(Activity.this,"com.用户名.包名.类名.Activity名");
2.1.4、茴香豆的第四种写法:同2.1.2只有中间一行不一样;
intent.setComponent(new Component(Activity.this,"com.用户名.包名.类名.Activity名"));
2.2、隐式跳转:告诉Activity哪些Activity可以执行任务,你可以往他们跳转;
对于隐式跳转的activity需要在manifest中给acticity加个<intent-filter>协助跳转,显示跳转则没必要;
<activity> <intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity>
2.2.1、所有的activity在使用前都是需要在manifest中声明的,此处的Action是manifest里<intent-filter>的action的名字;
Intent intent = new Intent(); intent.setAction("android.intent.action.MAIN");
startActivity(intent);
2.3、带值跳转:https://www.cnblogs.com/caesura-k/p/11909907.html
3、activity的数据传递,就是把数据附加给intent传递;
3.1、数据传入(在Activity1中操作)
3.1.1、intent的方法传递:其本质是在intent的方法中new了个Bundle,然后传入键名,键值;
intent.putExtra(键名,键值);
3.1.2、自己写一个Bundle类型,相当于把3.1.1的封装自己写;(String类型,键名加" ",键值也是String)
Bundle bundle = new Bundle( ); bundle.putString("键名",键值); intent.putExtras(bundle);
3.2、数据取出(在Activity2中操作):String str = getIntent().getExtras().getString("键名");
Bundle bundle = getIntent().getExtras(); String str1 = bundle.getString("键名"); int number = bundle.getInt(键名);
4、activity的启动模式
定义activity是由任务栈(先进后出的堆栈)进行管理的,任务栈默认名字是所在activity的包名;
activity一共有4种启动模式,不同启动模式的activity任务栈的管理方式不同,可以在mainfest中设置:
<activity
android:launchMode="standard">
</activity>
4.1、standard:标准模式
每启动一个activity就会将其推入栈顶,每次按下返回键,就会从栈顶移出(pop)当前activity;
从当前activity使用Intent跳转到当前activity,也会启动一个新的activity实例,调用onCreate();
其余三种activity是在standard模式的基础上加了限制条件;
4.2、singleTop:Task栈顶复用模式
如果栈顶的activity是将要跳转的activity,即从当前activity跳转到当前activity,则不会调用onCreate(),
调用onNewIntent()复用栈顶的activity;
4.3、singleTask:Task栈内复用模式
如果将要启动的activity已经存在栈中,则调用onNewIntent()复用栈中的activity;
并且会清除当前activity之后入栈(当前activity上面的activity)的所有activity;
4.4、singleInstance:全局单例模式
每个启动的activity都会配置一个任务栈,以供全局复用,其他app也可以复用当前app的全局任务栈;
只要该activity之前存在过,就会调用onNewIntent()复用之前的activity;
那那些pop出来的activity呢?难道被注销了吗?因为系统配置而注销了?