尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Android Activity创建与跳转深度解析
1. Activity创建与跳转核心解析作为Android开发中最基础的组件Activity承载了90%以上的用户交互界面。但很多初级开发者对Activity的创建和跳转只停留在会用的层面今天我就结合8年踩坑经验带大家深入理解这两个基础操作背后的技术细节。先看一个典型场景当用户点击APP首页的个人中心按钮时我们需要完成创建PersonalActivity实例关闭当前MainActivity传递用户ID参数设置转场动画处理返回栈逻辑这些操作看似简单但每个环节都藏着魔鬼细节。比如在华为EMUI系统上如果没正确处理Activity启动模式可能会出现双实例问题又比如在Android 12上如果没适配新的PendingIntent可变性要求跳转会直接崩溃。2. Activity创建全流程剖析2.1 基础创建方式标准的Activity创建需要三个关键步骤!-- AndroidManifest.xml声明 -- activity android:name.PersonalActivity android:exportedfalse android:themestyle/AppTheme.NoActionBar/// 继承AppCompatActivity基类 class PersonalActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_personal) // 必须调用setContentView否则会白屏 } }关键提示从Android 12开始所有Activity必须显式声明android:exported属性否则安装时会直接报错2.2 进阶配置方案实际项目中我们还需要考虑主题适配深色模式/浅色模式的自动切换style nameAppTheme.NoActionBar parentTheme.MaterialComponents.DayNight.NoActionBar item namewindowNoTitletrue/item item nameandroid:windowFullscreentrue/item /style生命周期优化避免在onCreate()中执行耗时操作override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 错误示范直接在这里请求网络 // 正确做法在onStart()中启动协程 }内存泄漏防护静态Handler必须使用WeakReferenceprivate class SafeHandler( activity: PersonalActivity ) : Handler(Looper.getMainLooper()) { private val weakRef WeakReference(activity) // ...处理消息时先检查weakRef.get() }3. Activity跳转的六种姿势3.1 基础显式跳转// 最简单的跳转方式 Intent(this, TargetActivity::class.java).apply { startActivity(this) }但这种方式存在三个典型问题没有请求码无法处理返回结果无法设置转场动画在Android 10上会有启动延迟3.2 带参数传递的跳转推荐使用Bundle传递数据而非直接putExtraIntent(this, TargetActivity::class.java).apply { putExtras(bundleOf( user_id to 123, user_name to 张三 )) startActivityForResult(this, REQUEST_CODE) }重要经验传递对象时必须实现Parcelable接口且数据量不要超过1MB否则会触发TransactionTooLargeException3.3 高级跳转配置val options ActivityOptions.makeCustomAnimation( context, R.anim.slide_in_right, // 进入动画 R.anim.slide_out_left // 退出动画 ).toBundle() Intent(this, TargetActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) startActivity(this, options) }动画资源示例!-- res/anim/slide_in_right.xml -- set xmlns:androidhttp://schemas.android.com/apk/res/android translate android:fromXDelta100% android:toXDelta0% android:duration300/ /set4. 启动模式实战详解4.1 四种标准模式对比启动模式特点适用场景典型问题standard默认模式每次新建实例普通页面可能产生重复实例singleTop栈顶复用通知跳转页非栈顶时仍会新建singleTask栈内单例主页/登录页可能清空上方ActivitysingleInstance全局单例独立任务栈与其他页面隔离过度4.2 动态设置技巧除了在AndroidManifest.xml中定义还可以通过Intent动态设置Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) startActivity(this) }这种方式的优先级高于manifest配置但要注意不能与FLAG_ACTIVITY_MULTIPLE_TASK混用在Android 12上需要额外声明android:exported5. 常见问题排查指南5.1 启动崩溃问题现象点击跳转按钮后APP直接崩溃检查清单目标Activity是否在manifest中注册Android 12是否声明了exported属性传递的数据是否实现了Parcelable是否在主线程执行跳转5.2 页面重叠问题现象新Activity覆盖在旧Activity上解决方案// 方法1设置透明主题 style nameTheme.Transparent parentTheme.AppCompat.DayNight.NoActionBar item nameandroid:windowIsTranslucenttrue/item /style // 方法2在跳转前finish当前Activity finish() startActivity(intent)5.3 返回栈异常案例从详情页返回时跳到了错误的页面调试技巧// 打印任务栈信息 val am getSystemService(ACTIVITY_SERVICE) as ActivityManager am.appTasks.forEach { task - Log.d(TaskStack, task.taskInfo.baseIntent.toString()) }6. 性能优化实践6.1 延迟加载技巧使用ViewStub实现布局按需加载ViewStub android:idid/stub_ads android:layoutlayout/ads_banner android:inflatedIdid/ads_container /// 需要时再加载 findViewByIdViewStub(R.id.stub_ads).inflate()6.2 启动加速方案预创建Windowoverride fun onCreate(savedInstanceState: Bundle?) { window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) super.onCreate(savedInstanceState) // ...其他初始化 }异步加载数据lifecycleScope.launch { val data withContext(Dispatchers.IO) { repository.loadData() } bindData(data) // 主线程更新UI }7. 跨进程跳转方案7.1 显式跨APP跳转val packageName com.example.targetapp val className com.example.targetapp.MainActivity Intent().apply { setClassName(packageName, className) startActivity(this) }需要满足目标Activity exportedtrue双方签名一致或目标未验证签名用户已安装目标APP7.2 隐式跳转处理!-- 在目标APP的manifest中声明 -- activity android:name.ShareActivity intent-filter action android:nameandroid.intent.action.SEND / category android:nameandroid.intent.category.DEFAULT / data android:mimeTypetext/plain / /intent-filter /activity跳转代码Intent().apply { action Intent.ACTION_SEND type text/plain putExtra(Intent.EXTRA_TEXT, 分享内容) startActivity(this) }8. 最新适配要点8.1 Android 13变更必须声明POST_NOTIFICATIONS权限才能显示通知附近Wi-Fi设备需要新权限照片选择器需要适配新的API8.2 折叠屏适配val feature packageManager.systemAvailableFeatures.find { it.name android.hardware.foldable } if (feature ! null) { // 处理折叠屏特有逻辑 window.attributes.layoutInDisplayCutoutMode LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES }在华为Mate X系列上还需要额外处理if (Build.MANUFACTURER.equals(HUAWEI, ignoreCase true)) { // 华为折叠屏特殊适配 }9. 测试验证方案9.1 单元测试用例Test fun testActivityLaunch() { val scenario launchActivityMainActivity() onView(withId(R.id.btn_profile)).perform(click()) intended(hasComponent(ProfileActivity::class.java.name)) }9.2 Monkey测试策略adb shell monkey -p com.example.app -v 500关键参数--throttle 100 事件间隔100ms--pct-nav 30 增加导航事件比例--ignore-crashes 忽略崩溃继续测试10. 终极避坑指南Context选择用Activity的Context启动Activity用Application的Context启动ServiceFlags组合FLAG_ACTIVITY_NEW_TASK必须与FLAG_ACTIVITY_CLEAR_TASK搭配使用避免同时使用FLAG_ACTIVITY_SINGLE_TOP和FLAG_ACTIVITY_CLEAR_TOP内存泄漏检查// 在BaseActivity中检测泄漏 override fun onDestroy() { super.onDestroy() if (!isChangingConfigurations) { LeakCanary.refWatcher.watch(this) } }跨版本兼容fun startActivitySafely(intent: Intent) { try { startActivity(intent) } catch (e: Exception) { if (Build.VERSION.SDK_INT Build.VERSION_CODES.R) { // Android 11的特殊处理 intent.addFlags(Intent.FLAG_ACTIVITY_REQUIRE_NON_BROWSER) startActivity(intent) } } }
RELATED

相关推荐

从极简命名到完整落地:轻量级项目开发全流程与避坑指南

从极简命名到完整落地:轻量级项目开发全流程与避坑指南

1. 从“rea”这个标题说起:一个极简命名背后的完整项目思维第一次看到“rea”这个标题,很多人会愣一下——三个字母,没有上下文,没有说明,甚至不知道它指代什么。但恰恰是这种极简命名,在技术圈和创意圈里越…

📅 2026/10/25 5:09:20
无可挑剔的交付:用流程与清单打磨impeccable标准

无可挑剔的交付:用流程与清单打磨impeccable标准

今天想认真聊一个词:impeccable。我第一次认真记住这个英文单词,并不是因为背单词,而是因为收到过一份让我印象深刻的交付物。那份交付物的功能其实很基础,但每一个按钮的点击状态、每一处文案的断句、每一张图片的压缩体积都处理…

📅 2026/10/25 5:09:20
AI Agent新阶段:从聊天到干活,Muse登顶与SDK开源的启示

AI Agent新阶段:从聊天到干活,Muse登顶与SDK开源的启示

Muse 登顶 App Store 第一那天,我的开发者群直接炸了。大家关注的其实不是这个 App 本身,而是同一天官方甩出的 SDX 开源。一个产品做到 App Store 榜首,说明面向普通用户的路走通了;而 SDK 开源,说明他们打算把这条路…

📅 2026/10/25 5:09:20
MORE NEWS

更多资讯

📰

LabVIEW集成HALCON深度学习实现工业质检异常检测

1. 项目背景与核心价值在工业质检领域,基于深度学习的异常检测正逐渐取代传统算法。我们团队最近成功将HALCON 22.05的深度学习工具包集成到LabVIEW 2018(64位)环境中,实现了仅需良品样本就能训练的DLT(Deep Learning …

📰

text-to-cad 原理与工程落地:从自然语言到可编辑参数化模型

1. text-to-cad到底解决什么问题1.1 先把“能生成3D模型”和“能生成零件”分清楚先说个结论:text-to-cad 不是让 AI 随手吐一个三维模型出来,而是要输出能进加工、装配、仿真流程的“正经 CAD 模型”。很多第一次接触这个概念的人,以为只要对…

📰

OpenMontage:基于Rust的视频智能体协作系统

1. OpenMontage 是什么:一个被低估的开源视频智能协作系统OpenMontage 这个名字乍一听像某个电影剪辑软件的副产品,或者某家初创公司悄悄上线的SaaS工具。但实际翻开源码仓库、读完它的README和早期设计文档后,我立刻意识到——这不是又一个“…

📰

程序员转型AI开发:实战路径与知识体系重构

1. 转型背景与核心挑战2023年大模型技术爆发后,AI应用开发岗位需求同比增长217%(LinkedIn数据)。作为经历过技术转型的老兵,我深刻理解普通程序员面对AI领域时的三大困惑:数学恐惧症(实际80%应用开发不需推…

📰

Agent-Reach:打造多Agent协作的可靠触达层与管理实践

如果你的多 Agent 系统只在一台机器上跑,你可能还意识不到 Agent-Reach 的价值。等 Agent 被拆到不同容器、不同机器、不同网络区域后,你就会遇到一类特别诡异的现象:Agent 的进程明明活着,日志还在打印,但调度 Agent …

📰

神经网络发展史与关键技术演进

1. 神经网络发展史概述1943年,神经生理学家沃伦麦卡洛克和数学家沃尔特皮茨提出了第一个神经网络数学模型——MP模型,这被视为人工神经网络的起点。这个简单的二元阈值模型虽然功能有限,却奠定了神经网络最基础的理论框架:模拟生物…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬