Android 之Activity的生命周期和进程保和

Activity概念:

  1. 首先我们的Activity中最基础也是相当重要的,就是它的生命周期。也就是一个Acyivity 的一个状态的表现过程。只要把此知识点进行深入了解,就可以对Android 活动方面游刃有余。接下来,进行一些研究讲解:
  2. 其次,需要了解,Activity是什么?他是使用Task,使用任务管理活动的作用。 什么是任务呢?任务就是一组,将活动存放在一个叫返回栈的一个集合。
  3. 默认情况下,当我们重新开一个Activity,就会出现在栈顶,因为我们栈的一个特点就是,后进先出。当想要销毁这个活动时,调用finish()或者back,出于栈顶的活动就会出栈。

Activity状态:

那么接下来,就对这个Activity的一个状态进行研究:

Activity的状态有四种:运行状态、暂停状态、停止状态、销毁状态

  1. 运行状态:一般就是说,当一个活动出于栈顶的时候,可见时,就出于一个运行的状态
  2. 暂停状态:当一个活动不处于栈顶,但依旧可见,举一个栗子:当你支付的时候,出现一个输入密码的一个弹框,购物车的页面就被暂停了,但依然可见,这就是暂停的状态。
  3. 停止状态:这个活动不处于栈顶,也不可见,但程序还是会为它保留一些变量的相关数据。
  4. 销毁状态:这个活动已经彻底的销毁,在栈中移除

Activity的生命周期:

Activity类有其中对调方法有7种;为了更好的理解我们两两相对的进行探讨:

  1. 完整生存期:在onCrete()方法和onDestory()直接发生的状态都可以归为完整存在的状态。onCrete()就是Activity创建时进行调用,进行初始化操作。onDestory()当执行完此方法后,Activity处于一个销毁的状态,销毁前调用
  2. 可见生存期:在onstart()方法和onstop()直接发生的状态都可以归为可见存在的状态,无论他是否可以进行交互,但它是可见的,从而可以去管理那些用户可见的资源。onstart()就是Activity从一个不可见变为可见的一个状态。onstop()让Activity从可见到不可见的一个状态,对资源进行回收保证不会占用过多的内存。
  3. 前台生存期:在onResume()方法和onPause()直接发生的状态都可以归为前台生存的状态.在这个状态下是可以进行交互的。onResume()就是进行交互时调用。onPause()就是进行开启另一个Acyivity时调用。
  4. 最后一种呢就是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实现:

在asdf这里插入图片描述

  • 红色部分是容易被回收的进程,属于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销毁活动。

然后通过回调方法,判断返回码和请求码,得到标记并返回成功

猜你喜欢

转载自blog.csdn.net/LoverLeslie/article/details/84671122