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呢?难道被注销了吗?因为系统配置而注销了?

猜你喜欢

转载自www.cnblogs.com/caesura-k/p/11934910.html