使用intent在活动中穿梭
intent(意图)是一种重要的消息传递对象,用于在不同组件(如活动(activity)、服务(service)、广播接收器(broadcastreceiver)等)之间进行通信和交互。
组成
intent 主要由以下几个部分组成:
- action:表示要执行的操作,比如
action_view
、action_send
等。 - data:表示要操作的数据,通常是一个 uri。
- category:表示 intent 的类型,比如
category_launcher
、category_default
等。 - extras:表示附加的信息,可以通过
putextra()
方法添加键值对。
显式intent
用于在应用内部启动组件(如activity、service、broadcastreceiver)。显式intent会指定要启动的组件的类名,例如:
button1.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { // 创建一个从 mainactivity 到 secondactivity 的 intent intent intent = new intent(mainactivity.this, secondactivity.class); // 启动 secondactivity startactivity(intent); } });
创建一个 intent
对象,用于启动 secondactivity
。intent
的第一个参数是当前的 context
(即 mainactivity.this
),第二个参数是要启动的目标 activity
类(即 secondactivity.class
)。
隐式intent
用于在不指定组件名称的情况下启动组件,而是通过指定动作(action)、数据(data)和类型(type)等信息,让系统去匹配合适的组件。 启动activity
在标签中添加下面代码:
<activity android:name=".secondactivity" android:exported="true" android:theme="@style/theme.appcompat.daynight.dialogwhenlarge"> <intent-filter> <!-- 指定动作为 com.example.menutest_716.secondactivity --> <action android:name="com.example.menutest_716.secondactivity" /> <!-- 添加默认分类 --> <category android:name="android.intent.category.default" /> <!-- 添加自定义分类 com.example.menutest_716.my_category --> <category android:name="com.example.menutest_716.my_category" /> </intent-filter> </activity>
button button5 = findviewbyid(r.id.button5); button5.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { // 创建一个隐式 intent,指定动作为 com.example.menutest_716.secondactivity intent intent = new intent("com.example.menutest_716.secondactivity"); // 添加自定义分类 com.example.menutest_716.my_category intent.addcategory("com.example.menutest_716.my_category"); // 启动符合条件的 activity startactivity(intent); } });
打开网页
button6.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { // 创建一个新的 intent,动作为 action_view intent intent = new intent(intent.action_view); // 设置 intent 的数据为指定的 uri,这里是打开百度网站的示例 intent.setdata(uri.parse("http://www.baidu.com")); // 启动能够处理此 intent 的 activity startactivity(intent); } });
拨打电话
button8.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { // 创建一个拨号的 intent intent intent = new intent(intent.action_dial); // 设置 intent 的数据为要拨打的电话号码 intent.setdata(uri.parse("tel:10086")); // 启动该 intent,跳转到系统的拨号界面 startactivity(intent); } });
显式与隐式区别
- 目的:显式intent用于精确指定要启动的组件,通常在应用内部使用;隐式intent用于请求系统启动能够处理指定动作或数据类型的任何组件。
- 使用方式:显式intent直接指定组件类名,而隐式intent通过设置动作、数据等信息间接指定要启动的组件,系统会根据匹配规则找到合适的组件处理请求。
作用
- 组件通信:intent 允许应用程序的不同组件(如活动、服务、广播接收器)之间进行通信。通过发送intent,一个组件可以请求另一个组件执行特定的操作或返回结果。
- 启动活动:当你需要从一个活动跳转到另一个活动时,可以使用intent来启动目标活动。这使得应用程序的导航更加灵活和动态。
- 启动服务:服务是后台运行的组件,通常用于执行长时间运行的操作,如下载文件或播放音乐。通过intent,你可以启动或绑定到一个服务,并与之交互。
- 发送广播:广播是一种消息传递机制,允许应用程序向系统或应用程序的其他部分发送消息。intent 可以用于发送和接收广播,从而实现应用程序之间的通信。
- 数据传输:intent 可以携带数据(如字符串、uri、文件等),这使得数据可以在不同的组件之间传递。这对于实现复杂的交互和数据共享非常有用。
- 隐式intent:隐式intent不指定具体的组件,而是通过定义一个操作(action)、数据类型(data)和类别(category)来请求系统执行相应的操作。这使得应用程序可以更灵活地与其他应用程序或系统服务交互。
- 显式intent:显式intent直接指向特定的组件,如某个活动或服务。这使得开发者可以精确控制应用程序的行为和交互。
活动间传递数据
有两个活动:mainactivity
和 secondactivity
,要从 mainactivity
向 secondactivity
传递数据。
在 mainactivity
中:
- 创建一个
intent
对象,并使用putextra
方法添加要传递的数据。 - 使用
startactivity
方法启动secondactivity
。
button button3 = findviewbyid(r.id.button3); button3.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { string data = "祝你开心永远"; intent intent = new intent(mainactivity.this, secondactivity.class); intent.putextra("extra_data",data); startactivity(intent); } });
在 secondactivity
中:
在 oncreate
方法中获取传递过来的数据。
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_second); // 获取传递的数据 intent intent = getintent(); string value = intent.getstringextra("key"); }
返回数据给上一个活动
在 android 中,如果我们需要从一个活动返回数据给上一个活动,可以使用 startactivityforresult
方法启动目标活动,并在目标活动中设置结果数据。
在 mainactivity
中:
- 使用
startactivityforresult
方法启动secondactivity
。 - 重写
onactivityresult
方法来接收返回的数据。
// 启动 secondactivity 并请求返回结果 intent intent = new intent(mainactivity.this, secondactivity.class); startactivityforresult(intent, 1); // 重写 onactivityresult 方法来接收返回的数据 @override protected void onactivityresult(int requestcode, int resultcode, intent data) { super.onactivityresult(requestcode, resultcode, data); if (requestcode == 1 && resultcode == result_ok) { // 从返回的 intent 中获取数据 string result = data.getstringextra("result_key"); // 处理返回的数据 } }
在 secondactivity
中:
- 创建一个
intent
对象,并使用putextra
方法添加要返回的数据。 - 使用
setresult
方法设置结果,并传入包含数据的intent
。 - 调用
finish
方法关闭当前活动。
// 创建一个 intent 对象并添加要返回的数据 intent returnintent = new intent(); returnintent.putextra("result_key", "result_value"); // 设置结果并传入包含数据的 intent setresult(result_ok, returnintent); // 关闭当前活动 finish();
到此这篇关于android intent基础用法及作用的文章就介绍到这了,更多相关android intent用法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论