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同栈 独占新栈
多应用共享 不支持 支持(如系统相机调用)
常见场景 应用主界面 系统级功能(分享菜单)
相关推荐
iOS阿玮18 小时前
苹果审核被拒4.1-Copycats过审技巧实操
uni-app·app·apple
宋智孝的小迷弟2 天前
Android 异步数据流:Kotlin Flow 为何成为新一代“利器”?LiveData 又有何局限?
android·面试·app
活哈哈哈哈2 天前
安卓AppWidget桌面小组件在国产移动设备的一些适配问题
app
iOS阿玮2 天前
不想被苹果卡审最好错开这两个提审时间
uni-app·app·apple
newki3 天前
【Flutter】FCM与Notifications集成流程
flutter·app
Chuck_Chan4 天前
Launcher3体系化之路
android·app
newki6 天前
【Flutter】Stripe支付集成流程
flutter·app
iOS阿玮6 天前
别让AI写的代码,成为Appstore上架的绊脚石
uni-app·app·apple
yxc_inspire15 天前
基于Qt的app开发第十天
开发语言·c++·qt·app