专栏名称: Carson_Ho
走在产品路上的Android研究生
目录
相关文章推荐
开发者全社区  ·  你们的小姨,行长夫人火了 ·  8 小时前  
开发者全社区  ·  年会上被迫营业的小姐姐 ·  昨天  
开发者全社区  ·  国企年轻人对提拔越来越没感觉了 ·  2 天前  
开发者全社区  ·  前公司客户「相中」我当儿媳妇... ·  3 天前  
开发者全社区  ·  汪小菲大骂周受资? ·  3 天前  
51好读  ›  专栏  ›  Carson_Ho

Android四大组件:关于Activity的知识都在这里了

Carson_Ho  · 掘金  · android  · 2018-09-26 02:05

正文

前言

  • Activity 属于 Android 的四大组件之一
  • 本文将全面解析 Activity ,献上1份 Activity 的学习攻略,包括其生命周期、启动模式、启动方式等等,希望你们会喜欢。

目录

示意图


1. 定义

即 活动,属于 展示型组件

属于 Android 四大组件之一: Activity Service BroadcastReceiver ContentProvider


2. 作用

显示界面 & 与用户进行交互

  1. 一个 Activity 通常是一个界面,是四大组件唯一能被用户感知的
  2. 每个活动被实现为一个独立的类, & 从活动基类继承过来
  3. Activity 之间通过 Intent 进行通信

3. 生命周期

  • 具体如下图

示意图

更加详细请看文章: Android基础:3分钟详解Activity生命周期


4. 启动模式

  • Activity 的启动模式有4种,具体如下

示意图

  • 4种启动模式的区别

示意图

更加详细请看文章: Android基础:最易懂的Activity启动模式详解


5. 启动方式

  • 启动 Activity 的方式主要是:显式 Intent & 隐式 Intent
  • 具体介绍如下:

5.1 显式Intent(3种)

// 1. 使用构造函数 传入 Class对象
 Intent intent = new Intent(this, SecondActivity.class); 
 startActivity(intent);

// 2. 使用 setClassName()传入 包名+类名 / 包Context+类名
 Intent intent = new Intent(); 
 // 方式1:包名+类名
 // 参数1 = 包名称
 // 参数2 = 要启动的类的全限定名称 
 intent.setClassName("com.hc.hctest", "com.hc.hctest.SecondActivity"); 

 // 方式2:包Context+类名
 // 参数1 = 包Context,可直接传入Activity
 // 参数2 = 要启动的类的全限定名称 
 intent.setClassName(this, "com.hc.hctest.SecondActivity"); 

 startActivity(intent);

// 3. 通过ComponentName()传入 包名 & 类全名
 Intent intent = new Intent(); 
 // 参数1 = 包名称
 // 参数2 = 要启动的类的全限定名称 
 ComponentName cn = new ComponentName("com.hc.hctest", "com.hc.hctest.SecondActivity"); 
 intent.setComponent(cn); 
 startActivity(intent);


5.2 隐式Intent

// 通过Category、Action设置
Intent intent = new Intent(); 
intent.addCategory(Intent.CATEGORY_DEFAULT); 
intent.addCategory("com.hc.second"); 
intent.setAction("com.hc.action"); 
startActivity(intent);

5.3 匹配规则

示意图

更加详细请看文章: Android:关于 Intent组件的那些小事(介绍、使用方法等)


6. 启动过程

Activity 的启动过程具体如下:

6.1 示意图

示意图

6.2 具体描述

当请求启动 Activity 时:

  1. Launcher 进程通过 Binder 驱动向 ActivityManagerService 类发起 startActivity 请求;
  2. ActivityManagerService 类接收到请求后,向 ActivityStack 类发送启动 Activity 的请求;
  3. ActivityStack 类记录需启动的 Activity 的信息 & 调整 Activity 栈 将其置于栈顶、通过 Binder 驱动 将 Activity 的启动信息传递到 ApplicationThread 线程中(即 Binder 线程)
  4. ApplicationThread 线程通过 Handler Activity 的启动信息发送到主线程 ActivityThread
  5. 主线程 ActivityThread 类接收到该信息 & 请求后,通过 ClassLoader 机制加载相应的 Activity 类,最终调用 Activity onCreate() ,最后 启动完毕

7. 卡顿原因

Activity 的卡顿原因主要归结如下:

示意图

关于内存泄漏 & 性能优化,请看系列文章:
Android性能优化:这是一份全面&详细的内存优化指南
Android性能优化:手把手带你全面了解 内存泄露 & 解决方案
Android性能优化:那些关于Bitmap图片资源优化的小事
Android性能优化:手把手带你全面了解 绘制优化







请到「今天看啥」查看全文


推荐文章
开发者全社区  ·  你们的小姨,行长夫人火了
8 小时前
开发者全社区  ·  年会上被迫营业的小姐姐
昨天
开发者全社区  ·  国企年轻人对提拔越来越没感觉了
2 天前
开发者全社区  ·  前公司客户「相中」我当儿媳妇...
3 天前
开发者全社区  ·  汪小菲大骂周受资?
3 天前
superhealth  ·  来吧,彻底斩杀腰腹脂肪!
7 年前