Android Intent知识总结

发布时间:2026/7/31 14:25:13
Android Intent知识总结 Android Intent 知识总结整理日期2026-07-30覆盖显式/隐式 Intent、Intent Filter、PendingIntent、Flag、安全限制与现代 API官方Intents and Intent Filters目录1. 是什么2. 能启动什么3. 显式 vs 隐式4. Intent 核心字段5. Intent Filter 匹配规则6. 常用 Action / Category / Data7. 传递数据8. 启动与结果回调9. Intent Flag10. PendingIntent11. 广播中的 Intent12. 安全与高版本限制13. 常见坑14. 速查 Checklist15. 优缺点与选型16. 参考链接1. 是什么Intent是 Android 组件间通信的消息对象描述「要做什么」启动 Activity / Service发送广播携带 action、data、category、extras、component 等信息系统根据 Intent 找到目标组件解析匹配或显式指定。发送方 ── Intent ──→ 系统AMS──→ 目标组件注意Intent不是通用 RPC跨进程大数据、持续通信应使用 Binder / AIDL / ContentProvider 等。2. 能启动什么目标API说明ActivitystartActivity/startActivityForResult旧/ Activity Result API可带 Flag、结果回传ServicestartService/startForegroundService/bindService后台限制多优先评估 WorkManager / FGSBroadcastReceiversendBroadcast/sendOrderedBroadcast显式广播更安全其他 App隐式 Intent 或显式指定包名/组件受包可见性、exported 影响3. 显式 vs 隐式3.1 显式 IntentExplicit明确指定目标组件类名或ComponentName应用内首选。valintentIntent(this,DetailActivity::class.java).apply{putExtra(EXTRA_ID,id)}startActivity(intent)优点匹配确定、安全、不受 Filter 干扰缺点需知道目标类跨应用时耦合包名/组件名3.2 隐式 IntentImplicit不指定组件靠action category data与 Manifest 中intent-filter匹配。valintentIntent(Intent.ACTION_VIEW,Uri.parse(https://example.com))startActivity(intent)优点解耦、可调起系统/其他 App浏览器、分享、相机缺点可能匹配多个或零个安全与可见性限制多解析相关resolveActivity/queryIntentActivities是否有处理器多个匹配时系统弹出选择器可用Intent.createChooser强制选择器4. Intent 核心字段字段作用Component显式目标组件Action要执行的通用动作字符串DataUri如content://、https://、tel:TypeMIME如image/*、application/pdf可与 Data 联动Category额外类别如CATEGORY_DEFAULT、LAUNCHERExtrasBundle键值对载荷Flags影响任务栈、权限授予等行为Package限制只匹配某包名半显式关系示意Intent ├─ component? → 有则显式不再走 filter 匹配 ├─ action / category ├─ data (uri) type ├─ extras (Bundle) └─ flags设置 Data 与 Type 时注意setData会清 typesetType会清 data需同时设时用setDataAndType。5. Intent Filter 匹配规则目标组件在 Manifest 声明intent-filter后隐式 Intent 需同时满足5.1 ActionIntent 的 action 必须与 Filter 中某一个action 相同Filter 无 action 则匹配不带 action 的 Intent少见5.2 CategoryIntent 中的每个category 都必须在 Filter 中出现startActivity会自动加CATEGORY_DEFAULT故 Activity 的 filter几乎必须写categoryandroid:nameandroid.intent.category.DEFAULT/5.3 Data按 URI 的 scheme / host / port / path / pathPrefix / pathPattern 以及 mimeType 匹配。多个data会组合成可匹配集合具体以官方匹配算法为准。示例activityandroid:name.WebActivityandroid:exportedtrueintent-filteractionandroid:nameandroid.intent.action.VIEW/categoryandroid:nameandroid.intent.category.DEFAULT/categoryandroid:nameandroid.intent.category.BROWSABLE/dataandroid:schemehttpsandroid:hostwww.example.com//intent-filter/activityDeep Link / App LinksBROWSABLEhttps Digital Asset Links 验证。6. 常用 Action / Category / Data6.1 常见 ActionAction用途ACTION_MAIN入口配合CATEGORY_LAUNCHERACTION_VIEW查看数据链接、地图、文件ACTION_SEND/ACTION_SEND_MULTIPLE分享ACTION_DIAL/ACTION_CALL拨号CALL 需权限ACTION_EDIT编辑ACTION_PICK/ACTION_GET_CONTENT/ACTION_OPEN_DOCUMENT选择内容推荐 SAFACTION_CREATE_DOCUMENT创建文档SAFACTION_WEB_SEARCH网页搜索ACTION_BATTERY_LOW等系统广播多已限制静态注册自定义 action 建议用包名反域com.example.app.ACTION_SYNC。6.2 常见 CategoryCategory用途CATEGORY_DEFAULTActivity 隐式启动必需CATEGORY_LAUNCHER桌面图标入口CATEGORY_BROWSABLE可被浏览器/链接唤起6.3 Data 示例Intent(Intent.ACTION_VIEW,Uri.parse(geo:0,0?qBeijing))Intent(Intent.ACTION_DIAL,Uri.parse(tel:10086))Intent(Intent.ACTION_SEND).apply{typetext/plainputExtra(Intent.EXTRA_TEXT,hello)}7. 传递数据7.1 Extrasintent.putExtra(key_string,value)intent.putExtra(key_int,1)intent.putExtra(key_parcelable,user)// Parcelable / 推荐 Parcelizevalbundleintent.extras注意说明体积Intent 载荷有 Binder 事务大小限制常见约 1MB 量级宜远小于此大图/大列表用Uri、磁盘缓存、ViewModel、单例仓库勿塞巨型 Bitmap类型安全可用类型安全封装或 Navigation Safe Args7.2 ClipData / URI 权限分享文件时valintentIntent(Intent.ACTION_SEND).apply{typeapplication/pdfputExtra(Intent.EXTRA_STREAM,contentUri)addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)clipDataClipData.newUri(contentResolver,pdf,contentUri)}使用FileProvider提供content://Uri避免file://与FileUriExposedException。8. 启动与结果回调8.1 只启动startActivity(intent)// 跨任务栈常见// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)8.2 需要返回结果现代写法vallauncherregisterForActivityResult(ActivityResultContracts.StartActivityForResult()){result-if(result.resultCodeRESULT_OK){valdataresult.data}}launcher.launch(Intent(this,EditActivity::class.java))常用 ContractTakePicture、GetContent、OpenDocument、RequestPermission等。目标页返回setResult(RESULT_OK,Intent().putExtra(result,value))finish()旧 APIstartActivityForResult/onActivityResult已不推荐。9. Intent Flag9.1 任务栈相关ActivityFlag作用FLAG_ACTIVITY_NEW_TASK在新任务中启动非 Activity Context 常必需FLAG_ACTIVITY_CLEAR_TOP若栈中已有目标清除其上 Activity 并复用/重建FLAG_ACTIVITY_SINGLE_TOP栈顶已是目标则不新建走onNewIntentFLAG_ACTIVITY_CLEAR_TASK常与 NEW_TASK 联用清空目标任务再启动FLAG_ACTIVITY_NO_HISTORY离开后不留在栈中FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS不进最近任务与launchModesingleTop/singleTask等共同决定实例复用需结合测试。9.2 URI 权限相关Flag作用FLAG_GRANT_READ_URI_PERMISSION授予接收方读 UriFLAG_GRANT_WRITE_URI_PERMISSION授予写FLAG_GRANT_PERSISTABLE_URI_PERMISSION可持久化需再 takePersistable9.3 其他Flag作用FLAG_ACTIVITY_NEW_DOCUMENT文档式多任务近年多窗场景Receiver 相关如FLAG_RECEIVER_FOREGROUND等按场景查阅10. PendingIntentPendingIntent交给其他应用/系统通知、闹钟、桌面小部件的「延迟触发 Intent 令牌」由系统持有发送身份按创建时的权限与身份。valintentIntent(context,TargetActivity::class.java)valpendingPendingIntent.getActivity(context,requestCode,intent,PendingIntent.FLAG_UPDATE_CURRENTorPendingIntent.FLAG_IMMUTABLE)工厂方法用途getActivity拉起 ActivitygetBroadcast发广播getService/getForegroundService启服务可变性Android 12 强制必须指定其一FLAG_IMMUTABLE不可被填充修改默认推荐FLAG_MUTABLE允许后续修改如内联回复、需填充 Extra 的场景常与FLAG_UPDATE_CURRENT/FLAG_CANCEL_CURRENT/FLAG_ONE_SHOT组合。优点系统组件可代为拉起 App权限模型清晰缺点Flag 用错易安全漏洞或无法更新后台启动 Activity 仍受限11. 广播中的 Intent// 发送sendBroadcast(Intent(ACTION_CUSTOM).setPackage(packageName))// 显式包名更安全// 动态注册API 34 必须指定导出标志ContextCompat.registerReceiver(context,receiver,IntentFilter(ACTION_CUSTOM),ContextCompat.RECEIVER_NOT_EXPORTED)点说明显式广播指定组件或 package避免被第三方窃听隐式 静态注册Android 8 大量禁止有序广播sendOrderedBroadcast可中止传播LocalBroadcastManager已废弃改用应用内事件Flow 等12. 安全与高版本限制版本/主题影响Android 11 包可见性查询/调起其他 App 需queries或可见性例外Android 12 exported含 intent-filter 的组件必须声明android:exportedAndroid 12 PendingIntent必须 IMMUTABLE 或 MUTABLEAndroid 12 隐式 Intent向非导出组件发送隐式 Intent 受限匹配规则更严Android 10 BAL后台启动 Activity 严格限制通知 PendingIntent 等有例外路径Android 14动态广播必须指定 exportedIntentSender/BAL 继续收紧File Uri禁止暴露file://给其他 App用 FileProvider原则应用内通信 →显式 Intent对外能力 → 最小化exportedtrue 权限分享文件 →content:// Grant Uri Permission调外部 App → 先resolveActivity并声明queriesqueriesintentactionandroid:nameandroid.intent.action.VIEW/dataandroid:schemehttps//intentpackageandroid:namecom.other.app//queries13. 常见坑现象原因处理ActivityNotFoundException无匹配或包不可见resolveActivity补queries隐式启不起来缺CATEGORY_DEFAULTFilter 加上 DEFAULTsetType后 data 丢了API 互斥用setDataAndTypeTransactionTooLargeExtras 过大改传 Uri/ID通知点了没反应PendingIntent Flag/后台限制IMMUTABLE/UPDATE符合 BAL 例外分享图片对方打不开未授权 Uri / 未设 ClipDataFLAG_GRANT_READ ClipData非 Activity Context 崩溃缺NEW_TASK加FLAG_ACTIVITY_NEW_TASKonNewIntent没走未 singleTop/Flag检查 launchMode 与 Flag14. 速查 Checklist应用内跳转是否全部显式Activity 隐式 filter 是否含DEFAULT及需要的BROWSABLE含 filter 的组件是否声明exported对外调起是否声明queriesExtras 是否够小大对象是否改 Uri文件分享是否 FileProvider Grant 权限PendingIntent 是否含IMMUTABLE/MUTABLE结果回调是否已迁 Activity Result APIService/广播是否符合后台与导出新规15. 优缺点与选型Intent 机制整体优点系统级解耦易调起系统能力组件模型统一缺点隐式匹配与安全策略复杂载荷大小受限后台行为年年收紧怎么选场景建议同 App 页面跳转显式 Intent / Navigation 组件要返回结果Activity Result API打开链接/分享/选文件隐式 Intent 系统 Contract通知/小组件/闹钟PendingIntentIMMUTABLE 优先应用内事件总线不要用隐式广播用 Flow / 共享 ViewModel跨 App 结构化数据ContentProvider而非塞巨型 Extra16. 参考链接Intents and Intent FiltersCommon IntentsPendingIntentActivity Result APIPackage visibilityShare files with FileProvider一句话Intent 描述「要做什么」应用内用显式跨应用用隐式 Filter数据走 Extras/Uri系统代发用 PendingIntent始终处理exported、包可见性、Uri 权限与后台启动限制。