Android四大组件之Activity

组件的共同点

  • 它的类必须实现固定的接口或者继承自特定的类
  • 需要在配置文件中配置全类名(组件的对象是系统创建的)
  • 它的对象有一定的生命周期,在实现类中有着对应的生命周期回调方法

Intent和IntentFilter

  • Intent:意图,是Activity、Service和BroadcastReceiver三者之间的信使,比如从一个Activity启动另一个Activity、服务或者广播接收者偶是需要Intent的对象。Intent对象可以携带数据。
  • IntentFilter:意图过滤器,是用来过滤匹配意图的,在清单文件的Activity中进行配置。action标签就是隐式意图构造函数里的action参数,category标签是额外条件,配置文件可以至少添加一个或多个category。
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    

Intent分类

  • 显式意图:明确指定目标组件的意图,一般操作自己应用的组件使用。

    Intent(Context context, Class clazz)
    
  • 隐式意图:未明确指定目标组件的意图,一般操作其他应用的组件使用。

    Intent(String action)
    

相关Api简介

  • Intent

    Intent(Context context, Class<?> clazz):显式意图
    Intent(String action):隐式意图
    putExtra(String name, Xxx value):携带数据
    Xxx getExtra(String name):取出数据
    setData(Uri data):设置有特定格式的Uri数据
    
  • Activity

    startActivity(Intent intent): 一般启动Activity
    startActivityForResult(int reqCode, Intent intent): 带回调启动Activity
    onActivityResult(int reqCode, int resultCode, Intent data): 回调方法
    setResult(int resultCode, Intent data): 设置要返回的结果
    finish(): 结束当前Activity
    getIntent(): 得到启动Activity的意图
    

Activity之间数据传递

通过Intent数据传递
通过Intent数据传递

Activity启动流程

Activity启动流程
Activity启动流程

Activity生命周期

  • 运行状态: 可见也可操作
  • 暂停状态: 可见但不可操作
  • 停止状态: 不可见,但对象存在
  • 死亡状态: 对象不存在

生命周期分析

生命周期流程

推荐三篇博客:

总结:

  • onSaveInstanceState():onSaveInstanceState()会在onPause()或onStop()之前执行,当系统销毁一个Activity的时候,如内存不足、用户直接按Home键等,onSaveInstanceState()方法会被调用;当如果是用户按返回键,则不会调用onSaveInstanceState方法,因为系统觉得没必要保存数据。如果我们没有复写onSaveInstanceState()方法, 此方法的默认实现会自动保存activity中的某些状态数据,比如activity中各种UI控制项的状态。如果我们需要覆写onSaveInstanceState()方法,一般会在第一行代码中调用该方法的默认实现:super.onSaveInstanceState(outState);

  • onRestoryInstanceState():onRestoreInstanceState()会在onStart()和onResume()之间执行,只有在activity销毁重建的时候onRestoreInstanceState()才会调用。当Activity被系统撤销后重新建立时,保存以及恢复数据的函数调用顺序是:onSaveInstanceState(保存数据)-->onCreate(恢复数据allstate)-->onRestoryInstanceState(恢复数据HierarchyState);

  • 推荐博客第二篇中实际测试结果如下,略有不同:

    1. 启动Activity:

      07-28 09:23:43.957 22220-22220/guo.ping.activitydemo I/MainActivity: onCreate()
      07-28 09:23:43.969 22220-22220/guo.ping.activitydemo I/MainActivity: onStart()
      07-28 09:23:43.969 22220-22220/guo.ping.activitydemo I/MainActivity: onResume()
      
    2. 跳转到其他Activity,或按下Home键回到主屏(没有销毁):

      07-28 09:29:59.029 22220-22220/guo.ping.activitydemo I/MainActivity: onPause()
      07-28 09:29:59.513 22220-22220/guo.ping.activitydemo I/MainActivity: onSaveInstanceState()
      07-28 09:29:59.513 22220-22220/guo.ping.activitydemo I/MainActivity: onStop()
      
    3. 从后台回到前台:

      07-28 09:31:46.417 22220-22220/guo.ping.activitydemo I/MainActivity: onRestart()
      07-28 09:31:46.417 22220-22220/guo.ping.activitydemo I/MainActivity: onStart()
      07-28 09:31:46.417 22220-22220/guo.ping.activitydemo I/MainActivity: onResume()
      
    4. 当前Activity不完全可见时调用的方法为:

      07-28 09:33:19.409 22220-22220/guo.ping.activitydemo I/MainActivity: onPause()
      07-28 09:33:19.729 22220-22220/guo.ping.activitydemo I/MainActivity: onSaveInstanceState()
      
    5. 按回退键使Activity从被覆盖回到前面,或者按解锁键解锁屏幕:

      07-28 09:34:21.533 22220-22220/guo.ping.activitydemo I/MainActivity: onResume()
      
    6. 退出:

      07-28 09:36:02.721 22220-22220/guo.ping.activitydemo I/MainActivity: onPause()
      07-28 09:36:02.797 22220-22220/guo.ping.activitydemo I/MainActivity: onStop()
      07-28 09:36:02.862 22220-22220/guo.ping.activitydemo I/MainActivity: onDestory()
      
    7. 旋转屏幕时:

      07-28 09:37:44.341 1638-1638/guo.ping.activitydemo I/MainActivity: onPause()
      07-28 09:37:44.341 1638-1638/guo.ping.activitydemo I/MainActivity: onSaveInstanceState()
      07-28 09:37:44.341 1638-1638/guo.ping.activitydemo I/MainActivity: onStop()
      07-28 09:37:44.341 1638-1638/guo.ping.activitydemo I/MainActivity: onDestroy()
      07-28 09:37:44.369 1638-1638/guo.ping.activitydemo I/MainActivity: onCreate()
      07-28 09:37:44.369 1638-1638/guo.ping.activitydemo I/MainActivity: onStart()
      07-28 09:37:44.369 1638-1638/guo.ping.activitydemo I/MainActivity: onRestoreInstanceState()
      07-28 09:37:44.369 1638-1638/guo.ping.activitydemo I/MainActivity: onResume()
      

Activity任务栈

  • 在Android中,系统用Task Stack (Back Stack)结构来存储管理启动的Activity对象
  • 一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该应用的Activity对象
  • 只有最上面的任务栈的栈顶的Activity才能显示在窗口中

Activity的启动模式

  1. standard: 标准模式,每次调用startActivity()方法就会产生一个新的实例。
  2. singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。
  3. singleTask: 只有一个实例, 默认在当前Task中。
  4. singleInstance: 只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象。

最后

当使用隐式意图时,可以添加category来区别相同的action,category也可以自定义,但是必须至少加上一个Android系统中定义的。

<activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="android.intent.action.OTHERACTIVITY"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="HAHA"/>
    </intent-filter>
</activity>
<activity android:name=".ThirdActivity">
    <intent-filter>
        <action android:name="android.intent.action.OTHERACTIVITY"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

在代码中,可以通过给Intent对象调用addCategory("xxx")方法添加条件便于更加明确。

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

推荐阅读更多精彩内容