Activity概念:
- 首先我们的Activity中最基础也是相当重要的,就是它的生命周期。也就是一个Acyivity 的一个状态的表现过程。只要把此知识点进行深入了解,就可以对Android 活动方面游刃有余。接下来,进行一些研究讲解:
- 其次,需要了解,Activity是什么?他是使用Task,使用任务管理活动的作用。 什么是任务呢?任务就是一组,将活动存放在一个叫返回栈的一个集合。
- 默认情况下,当我们重新开一个Activity,就会出现在栈顶,因为我们栈的一个特点就是,后进先出。当想要销毁这个活动时,调用finish()或者back,出于栈顶的活动就会出栈。
Activity状态:
那么接下来,就对这个Activity的一个状态进行研究:
Activity的状态有四种:运行状态、暂停状态、停止状态、销毁状态
- 运行状态:一般就是说,当一个活动出于栈顶的时候,可见时,就出于一个运行的状态
- 暂停状态:当一个活动不处于栈顶,但依旧可见,举一个栗子:当你支付的时候,出现一个输入密码的一个弹框,购物车的页面就被暂停了,但依然可见,这就是暂停的状态。
- 停止状态:这个活动不处于栈顶,也不可见,但程序还是会为它保留一些变量的相关数据。
- 销毁状态:这个活动已经彻底的销毁,在栈中移除
Activity的生命周期:
Activity类有其中对调方法有7种;为了更好的理解我们两两相对的进行探讨:
- 完整生存期:在onCrete()方法和onDestory()直接发生的状态都可以归为完整存在的状态。onCrete()就是Activity创建时进行调用,进行初始化操作。onDestory()当执行完此方法后,Activity处于一个销毁的状态,销毁前调用。
- 可见生存期:在onstart()方法和onstop()直接发生的状态都可以归为可见存在的状态,无论他是否可以进行交互,但它是可见的,从而可以去管理那些用户可见的资源。onstart()就是Activity从一个不可见变为可见的一个状态。onstop()让Activity从可见到不可见的一个状态,对资源进行回收保证不会占用过多的内存。
- 前台生存期:在onResume()方法和onPause()直接发生的状态都可以归为前台生存的状态.在这个状态下是可以进行交互的。onResume()就是进行交互时调用。onPause()就是进行开启另一个Acyivity时调用。
- 最后一种呢就是onRestart()方法,他的作用是重启一个Activity是调用。
Activity的优先级:
分别是:前台、可见、服务、后台、空
1.前台 Foreground:用户当前操作所必需的进程
- 用户正在交互的 Activity(已调用 Activity 的 onResume() 方法)
- 某个 Service,后者绑定到用户正在交互的 Activity
- 正在“前台”运行的 Service(服务已调用 startForeground())
- 正执行一个生命周期回调的 Service(onCreate()、onStart() 或 onDestroy())
- 正执行其 onReceive() 方法的 BroadcastReceiver
通常,在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。 此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应。
2.可见 Visible :没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程
- 不在前台、但仍对用户可见的 Activity(已调用其 onPause() 方法)。例如,如果前台 Activity 启动了一个对话框,允许在其后显示上一 Activity,则有可能会发生这种情况。
- 绑定到可见(或前台)Activity 的 Service。
可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。
3.服务 Service :
正在运行已使用 startService() 方法启动的服务且不属于上述两个更高类别进程的进程。尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。
4.后台 Service :
包含目前对用户不可见的 Activity 的进程(已调用 Activity 的 onStop() 方法)。这些进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在 LRU (最近最少使用)列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。
5.空 Empty :
不含任何活动应用组件的进程。保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。
Activity的启动模式:
一共有四种模式:standard、singleTop、singleTask、SingleInstance :
//在清单文件设置启动模式的方法:
android:launchMode="singleInstance"
1.standard 每创建一个activity就会实例一个activity,放入栈中。这种模式是比较消耗资源的。
2.singleTop 栈顶复用,判断栈顶是否有一个同样的Activity,是否复用。
3.singleTask 会判断这个栈中是否有一个同样的Activity,有就把这个Activity放到栈顶,销毁其他的Activity,没有就创建。
4.SingleInstance 判断栈中是否存在,存在,就把这个activity 单独放入一个栈中。Activity的: 进程保活:
Activity的进程保活:
可以通过 1像素且透明Activity提升App进程优先级、通过设置前台Service提升App进程优先级、Java层的双进程拉活、JobScheduler实现、NDK双进程守护、使用账户同步拉活、workmanager实现:
- 红色部分是容易被回收的进程,属于android进程
- 绿色部分是较难被回收的进程,属于android进程
- 其他部分则不是android进程,也不会被系统回收,一般是ROM自带的app和服务才能拥有
接下来再说一下跳转:
intent跳转分为两种:
1.一种显示跳转,直接实例Intent,为intent设置跳转、传递数据的方法。用startActivity方法,传入intent参数,进行跳转显示,
目标唯一,不够灵活。
2.另一种叫隐式跳转,隐式跳转就是没有目地性的,不像显示跳转,他明确的要从哪个activity跳转到哪个activity,而是指定了一个action,category信息(action只有一个,category可有多个) 可以把action写到跳转的xml.清单文件中。主要运用的是拨号等应用。
参考我 另一篇博客:https://blog.csdn.net/LoverLeslie/article/details/85253606
3.Schame跳转:
是一种页面内跳转协议,方便跳转app,任意一个页面,而且可以通过通知栏消息进行跳转,也卡伊过H5跳转。所以功能强大。\
4.还有一种是有返回值的跳转startActivityForResult() ,接收两个参数,(intent,请求码)。用于判断回调后的数据源:
/传递Activity
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent3=new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent3,1);
}
});
//接收并返回Activity
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent3=new Intent();
intent3.putExtra("send","LoverLeslie");
setResult(RESULT_OK,intent3);
finish();
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case 1:
if (requestCode==RESULT_OK){
String send = data.getStringExtra("send");
Log.d("sd",send);
}
break;
}
}
我们可以看到接收的Activity中还是构建了一个Activity 这个Intent这是用来传递数据(loverleslie)而已,调用了setResult方法
(一般是Result_ok/canceled)返回数据,然后调用finish销毁活动。
然后通过回调方法,判断返回码和请求码,得到标记并返回成功