Intent(意图)

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,

Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递

Intent来执行动作和产生事件。

使用Intent可激活Android应用的三个核心组件:活动Activity、服务service和广播接收器BroadcastReceiver。

Intent可以划分成显式意图和隐式意图。

显式意图:调用Intent.setComponent()或Intent.setClassName()或Intent.setClass()方法

明确指定了组件名的Intent为显式意图,显式意图明确指定了要激活的组件是哪个组件

隐式意图:没有明确指定组件名的Intent为隐式意图。Android系统会根据隐式意图中

设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图



在知乎 Android 版应用中,Intent 跳转是实现页面导航和功能调用的重要机制。通过 Intent,可以启动新的 Activity、Service 或广播事件,尤其在页面跳转和数据传递方面非常常见。 ### 显式 Intent 与隐式 Intent - **显式 Intent**:直接指定目标组件的类名,适用于跳转到应用内部的特定页面。例如: ```java Intent intent = new Intent(this, DetailActivity.class); startActivity(intent); ``` - **隐式 Intent**:不指定具体的目标组件,而是通过 Action、Data、Category 等描述要执行的操作,系统会根据 IntentFilter 匹配合适的组件。例如,打开网页链接时使用: ```java Uri uri = Uri.parse("https://www.zhihu.com"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); ``` ### Intent 数据传递 Intent 可以携带基本类型的数据或实现了 `Parcelable` 接口的对象进行跨页面通信。例如: ```java Intent intent = new Intent(this, DetailActivity.class); intent.putExtra("article_id", 123456); startActivity(intent); ``` 在目标 Activity 中获取数据: ```java int articleId = getIntent().getIntExtra("article_id", -1); ``` ### 使用 Scheme 实现页面跳转 知乎等 App 常采用自定义 URI Scheme 实现深度链接(Deep Link),例如: ```java Uri uri = Uri.parse("zhihu://question/123456"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); ``` 如果设备上安装了知乎 App,并且其注册了对应的 IntentFilter,则会直接打开知乎 App 的对应页面;否则可能跳转到网页版或提示错误[^3]。 ### 注意事项 - **权限控制**:确保跳转的目标页面有正确的权限配置,避免未授权访问。 - **异常处理**:使用隐式 Intent 时应检查是否有匹配的组件,防止崩溃: ```java if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { // 处理无可用组件的情况 } ``` - **适配 Android 高版本行为变更**:从 Android 10 开始,对后台启动 Activity 有限制,建议使用通知或前台服务替代。 ### Intent 回调问题 知乎使用了第三方图片选择库 Matisse 来处理图片选取任务,通过 `forResult()` 启动新 Activity 并等待结果返回。回调结果需在 `onActivityResult()` 方法中处理: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) { List<Uri> selectedUris = Matisse.obtainResult(data); // 处理选中的图片 } } ``` 如果遇到 `resultCode` 一直是 0 的情况,应检查是否正确调用了 `setResult()`,以及目标 Activity 是否正常结束。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值