zoukankan      html  css  js  c++  java
  • 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呢?难道被注销了吗?因为系统配置而注销了?

  • 相关阅读:
    【转】跨域的理解与实现
    【3.5】从今天开始学习WCF技术
    LAB.js使用
    资源文件的动态加载
    C#对图片文件的压缩、裁剪操作初探
    WCF技术剖析_学习笔记之一
    SQL 写入调优
    【转】Nosql,为什么要使用
    wcf配置文件
    wcf错误
  • 原文地址:https://www.cnblogs.com/caesura-k/p/11934910.html
Copyright © 2011-2022 走看看