Android组件之Activity知识点梳理

前言:最近在从头复习Android相关的知识,所谓温故而知新,每天会整理一些笔记分享出来,希望能帮到有需要的人。

一、Activity是什么?

Activity是Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)中的核心组件,代表应用中的一个独立界面。每个Activity提供用户交互的窗口,类似于桌面应用的窗体概念。Android应用通常由多个Activity组成,它们通过任务栈(Task Stack)管理,形成用户导航的返回栈。

二、常用场景

  1. 主界面展示:应用启动时的首个交互界面
  2. 页面跳转:用户操作触发的界面切换(如列表→详情页)
  3. 数据采集:表单填写、用户登录等交互场景
  4. 多窗口适配:分屏模式、自由窗口等响应式设计

三、核心知识点

1. 生命周期(核心)
typescript 复制代码
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Lifecycle", "onCreate"); // 初始化界面
    }

    @Override
    protected void onStart() {
        super.onStart(); // 界面可见
        Log.d("Lifecycle", "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume(); // 获取焦点,可交互
        Log.d("Lifecycle", "onResume");
    }

    @Override
    protected void onPause() {
        super.onPause(); // 失去焦点(如弹出对话框)
        Log.d("Lifecycle", "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop(); // 完全不可见
        Log.d("Lifecycle", "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy(); // 被销毁前资源释放
        Log.d("Lifecycle", "onDestroy");
    }
}
2. 启动方式
scss 复制代码
// 显式启动
Intent intent = new Intent(MainActivity.this, DetailActivity.class);
startActivity(intent);

// 隐式启动(需在AndroidManifest中声明intent-filter)
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.example.com"));
startActivity(intent);

// 带返回值启动
startActivityForResult(intent, REQUEST_CODE);

// 使用Activity Result API 启动
// 注册结果监听器
ActivityResultLauncher<Intent> launcher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        if (result.getResultCode() == RESULT_OK) {
            Intent data = result.getData();
            // 处理返回数据
        }
    }
);

// 启动目标Activity
launcher.launch(new Intent(this, DetailActivity.class));
3. 数据传递
scss 复制代码
// 发送数据
Intent intent = new Intent(this, DetailActivity.class);
intent.putExtra("USER_NAME", "AndroidDev");
intent.putExtra("USER_ID", 1001);
startActivity(intent);

// 接收数据(在DetailActivity中)
String name = getIntent().getStringExtra("USER_NAME");
int id = getIntent().getIntExtra("USER_ID", 0);

// 返回结果
Intent resultIntent = new Intent();
resultIntent.putExtra("RESULT_DATA", "操作成功");
setResult(RESULT_OK, resultIntent);
finish();
4. 启动模式(AndroidManifest配置)
  • 一种是在AndroidManifest.xml文件中的activity节点中设置android:launchMode属性
xml 复制代码
<activity
    android:name=".MainActivity"
    android:launchMode="singleTop"> <!-- 四种模式 -->
</activity>

standard:默认模式,每次启动创建新实例

singleTop:栈顶复用(防止重复打开)

singleTask:栈内复用(适合主界面)

singleInstance:独立栈(系统级应用)

  • 一种就是通过在开启Activity的时候,通过设置Intent Flag来设置
ini 复制代码
Intent intent=new Intent(this,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

1. FLAG_ACTIVITY_SINGLE_TOP(同singleTop)

2. FLAG_ACTIVITY_CLEAR_TOP(同singleTask)

3. FLAG_ACTIVITY_NO_HISTORY

  • 新活动不会保留在历史栈中,一旦用户切换到其他页面,新活动会马上销毁。
  • 旧活动的onActivityResult()方法永远不会被触发。

4. FLAG_ACTIVITY_NEW_TASK(同singleInstance)

四、整理的一部分面试题

1:onSaveInstanceState() 何时调用?与onPause()的区别?

  • 调用时机:Activity被异常销毁前(如屏幕旋转、内存不足)

  • 区别:

    • onPause():任何失去焦点时都调用
    • onSaveInstanceState():只在非用户主动关闭时触发
  • 典型用途:保存临时数据(EditText内容等)

2:Activity A启动B时生命周期变化?

A.onPause() → B.onCreate() → B.onStart() → B.onResume() → A.onStop()

注意:旧Activity的onPause()执行完成后,新Activity才会创建

3:如何避免Activity内存泄漏?
  1. 避免非静态内部类(改用静态内部类+WeakReference)
  2. 及时注销监听器(onDestroy中解除广播、Handler等)
  3. 谨慎使用Context(ApplicationContext优先)
  4. 避免在Activity中保存大数据
4:singleTask和singleInstance的区别?
特性 singleTask singleInstance
任务栈 可与其它Activity同栈 独占新栈
多应用共享 不支持 支持(如系统相机调用)
常见场景 应用主界面 系统级功能(分享菜单)
相关推荐
菌菇汤9 小时前
uni-app实现单选,多选也能搜索,勾选,选择,回显
前端·javascript·vue.js·微信小程序·uni-app·app
CYRUS_STUDIO11 天前
手把手教你用 Chrome 断点调试 Frida 脚本,JS 调试不再是黑盒
android·app·逆向
CYRUS STUDIO12 天前
逆向某物 App 登录接口:还原 newSign 算法全流程
android·python·安全·app·逆向·app加固·脱壳
kymjs张涛12 天前
前沿技术周刊 2025-06-23
android·ios·app
iOS阿玮12 天前
苹果卡审产品加急审核后,遭遇3.2f其实是解脱。
uni-app·app·apple
小喷友12 天前
Flutter 从入门到精通(水)
前端·flutter·app
CYRUS_STUDIO12 天前
逆向某物 App 登录接口:热修复逻辑挖掘隐藏参数、接口完整调用
android·app·逆向
AlfredZhao12 天前
APEX实战第4篇:如何把APEX程序变成“移动端APP”?
app·iphone·pwa