Android笔记-四大组件之Activity

简介

Activity是Android APP开发中最常用、最基础的组件,属于Android四大组件之一,其主要负责UI展示以及与用户交互。

启动

  • 显式启动
    显示启动就是明确指出要启动的目标Acitivity的名称,然后通过startActivity()或startAcitivtyForResult()方法来启动,并且在启动的时候可以携带数据至目标Activity。

    • 无参数无返回结果
    //StartActivity.java文件中
    this.startActivity(new Intent(this, TargetActivity.class));
    
    • 有参数无返回结果
    //send StartActivity.java文件中
    Intent intent = new Intent(this, TargetActivity.class);
    intent.putExtra("args_data", "data from start activity with explicit");
    this.startActivity(intent);
    
    //received TargetActivity.java文件中
    String data = getIntent().getStringExtra("args_data");
    
    • 无参数有返回结果
    //1.send StartActivity.java文件中
    //1.1 启动时指定requestCode = 1
    this.startActivityForResult(new Intent(this, TargetActivity.class), 1);
    
    //1.2 重写onActivityResult方法,通过requestCode、resulutCode和Intent获取返回结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if (resultCode == RESULT_OK) {
                ((TextView) findViewById(R.id.text_dashboard)).setText("got data: " + data.getStringExtra("data_return"));
            }
        }
    }
    
    //2. received TargetActivity.java文件中
    Intent intent = new Intent();
    intent.putExtra("data_return", "return data from target");
    setResult(RESULT_OK, intent);
    finish();
    
    • 有参数有返回结果
    //1.send StartActivity.java文件中
    //1.1 启动时指定requestCode = 1
    Intent intent = new Intent(this, TargetActivity.class);
    intent.putExtra("args_data", "data from start activity for result with explicit");
    this.startActivityForResult(intent, 1);
    
    //1.2 重写onActivityResult方法,通过requestCode、resulutCode和Intent获取返回结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if (resultCode == RESULT_OK) {
                ((TextView) findViewById(R.id.text_dashboard)).setText("got data: " + data.getStringExtra("data_return"));
            }
        }
    }
    
    //2. received TargetActivity.java文件中
    Intent intent = new Intent();
    intent.putExtra("data_return", "return data from target");
    setResult(RESULT_OK, intent);
    finish();
    

    温馨提示:显式启动的方式有个比较好的写法是在每个Activity中声明静态方法来启动当前Activity,启动参数信息可以一目了然,对于调用者来说非常清晰明了,示例代码如下:

    public class TargetActivity extends AppCompatActivity {
        private static final String DATA_TAG = "data_tag";
        
        public static void startAction(Context context, XXX args) {
            Intent intent = new Intent(context, TargetActivity.class);
            intent.putExtra(DATA_TAG, args);
            context.startActivity(intent);
        }
    }
    
  • 隐式启动
    隐式启动是通过一定的匹配规则来进行启动目标Activity的,相对于显式启动更加隐晦,数据的传递及返回均域显式启动相同,唯一不同的是Intent中必须指定action名字,以及category类型(可以不需要,默认通过 `android.intent.category.DEFAULT 来匹配),另外需要在manifest文件中为目标Activity添加过滤条件,只有完全匹配的才能正常启动,简单示例如下:

    //1. manifest.xml文件中
    <activity android:name=".activity.TargetActivity">
         <intent-filter>
             <action android:name="com.example.study.START_ACTION" />
             <category android:name="android.intent.category.DEFAULT" />
         </intent-filter>
     </activity>
         
    //2. StartActivity.java 文件中
    this.startActivity(new Intent("com.example.study.START_ACTION"));
    

    温馨提示:隐式启动一般用于启动其他应用,比如拨号器和网页等,由于其需要启动的目标Activity比较隐晦,不利于代码阅读,因此在应用内尽量不要用隐式启动方式来实现启动目标Activity。

    隐式启动除了可以启动本应用或者其他应用以外,还有一个比较常用的场景,即当需要在别的应用或者浏览器中启动我们的应用时,需要给我们的响应Activity配上隐式启动规则。

销毁

销毁Activity只需要调用finish() 方法即可。

生命周期

  • onCreate()
    该方法只在Activity第一次创建时调用,描述的是从无到有的一个状态变化,整个页面生存期间 只调用一次 ,在该方法中主要做一些初始化的工作,比如:加载布局绑定事件等。

  • onStart()
    该方法在Activity从不可见变成可见时调用,该方法中不要做耗时较长的事情。

  • onResume()
    该方法在Activity从可见变成可交互时调用,在该方法中做一些特殊的业务逻辑,比如每次回到页面刷新页面数据

  • onPause()
    该方法在Activity从可交互变成可见但不可交互时调用,通常会在该方法中释放消耗cpu的资源保存关键性数据,但是该方法执行速度一定要快,否则会影响新Activity的展示速度

  • onStop()
    该方法在Activity从可见变成不可见时调用。

  • onDestroy()
    该方法在Activity被销毁前调用,主要做一些资源的释放工作。

  • onRestart()
    该方法在Activity未销毁但不可见时将要变得可见时调用

一图胜千言:


Activity生命周期图.png

下面来看下几种常见场景的生命周期方法调用顺序:

  • 当前Activity 启动另外一个正常Activity,然后返回,整个生命周期过程如下图:
启动正常Activity然后返回生命周期时序图.png

通过该时序图,可以看出即将不可见的Activity的onStop()是在即将可见Activity的onResume()方法之后调用的。

  • 当前Activity 启动一个Dialog类型的Acitivty,然后返回,整个生命周期过程如下图所示:
启动一个Dialog类型的Acitivty然后返回生命周期时序图.png

在这种情况下,主要区别在于Dialog类型的Activity和普通Activity的不同,前者不会完全遮挡住后面的Activity,所以后面的Activity还是可见的,只是不能与用户交互了而已,因此后面可见但是不可交互Activity的onStop()onRestart()onStart()方法不会被调用。

Dialog类型Activity的最简单的创建方法是指定Activity的theme为Dialog类型即可。

    <activity
        android:name=".activity.lifecycle.LifecycleDialogActivity"
        android:theme="@style/Theme.AppCompat.Light.Dialog.Alert" />
  • 当前Activity 启动一个Alert Dialog,然后返回,整个生命周期过程
    创建一个最简单的AlertDialog代码如下:
  private void showAlertDialog() {
        new AlertDialog.Builder(this)
                .setTitle("Alert Dialog Title")
                .setMessage("The message content of this alert dialog!")
                .setPositiveButton("ok", null)
                .setNegativeButton("cancel", null)
                .create()
                .show();
    }

AlertDialog的显示与关闭过程中都没有任何生命周期方法调用。

  • 横竖屏切换的生命周期


    横竖屏切换Acitivity的生命周期.png

正常情况下横竖屏的切换,其实都是销毁当前Activity重新创建一个新Activity的过程。

启动模式

Android系统里面通过返回栈来管理每个Activity,当一个Activity被创建出来就会进栈,而当一个Activity销毁了就会出栈,并且当前位于栈顶的Activity一定是当前显示的Activity,系统提供了以下四种启动模式,可以根据需要给每个Activity设置不同的启动模式。

  • standard模式
    这是默认的启动模式,如果什么也不设置即为此模式,此模式的特点是:每次启动都会创建一个新的实例而不关心当前栈里是否已存在此Activity的实例

  • singleTop模式
    此模式的特点是:每次当需要创建一个Activity的实例时,先检查当前栈顶是否为此Activity的实例,如果是则复用,反之才会创建一个新的实例。常用设置方式为:

      <activity
          android:name=".activity.mode.ModeSingleTopActivity"
          android:launchMode="singleTop" />
    

    此模式通常用于Dialog类型Activity的启动模式。

  • singleTask模式
    此模式的特点是:栈中只存在唯一实例,如果已经存在,将其置为栈顶,位于其上面的Activity全部出栈, 反之则创建新的实例。常用设置方式为:

      <activity
          android:name=".activity.mode.ModeSingleTaskActivity"
          android:launchMode="singleTask" />
    

    此模式常用于一个应用的主Activity的启动模式。

  • singleInstance模式
    此模式的特点是:创建一个新的栈来管理此Activity。常用设置方式为:

      <activity
          android:name=".activity.mode.ModeSingleInstanceActivity"
          android:launchMode="singleInstance" />
    

    此模式通常用于需要与其他应用共享此Activity实例的情景,即一个Activity实例多个应用共享。如果此Activity中启动一个常规的Activity,则该常规Activity继续在老的栈中管理,此时如果按返回,会直接返回至上上个页面的Activity,例如:A-->B(SingleInstance模式)-->C,在C中按下返回按钮直接返回至A。

面试常考点

  1. onStart()与onResume()的区别
  2. 横竖屏切换的生命周期
  3. Activity启动流程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容

  • 关于为什么要写属于自己的博客,我在前一篇文章中也提到了。主要是归纳自己这一个时期所学到的知识,帮助自己更好的理解,...
    Kevin_Jern阅读 867评论 0 9
  • 1. 什么是Activity Activity负责UI元素的加载与页面之前的跳转,代表了一个页面单元。 2. Ac...
    付凯强阅读 504评论 0 0
  • 没有难点,没有不会的,只是匆匆的留个笔记。。。。。 简介 Activity是Android一个非常重要的用户接口(...
    一s独秀阅读 555评论 0 0
  • 四大组件之一,是用户唯一可以看到的东西,主要用来跟用户进行交互,通过setContextView(view);来显...
    WeiAai阅读 302评论 0 0
  • 有缘千里来相遇,无缘对面不相识。 缘也有天时、地利、人和。 在不知不觉中,缘起缘灭! 一切都是明明注定! 希望再续...
    袁文_14e7阅读 296评论 0 0