Hi,新的征程开始啦,关于各种控件我们给大家介绍的已经差不多了,各位花粉已经陪伴着我们走过了一个阶段,本篇就是我们新征程的开始,当然,我们会在新征程之中偶尔穿插一些实战控件的使用,让大家学习的内容不再单一,还在等什么,紧跟我们的步伐,为了白富...理想而出发!!
Intent 直译为 "意图",它用于在 Android
系统组件之间进行交互。它可被用来启动 Activity
、发生信息到 BroadCastReciver
,启动并与 service
进行交互。
Intent
显示 Intent
通过它的 setCompoent()
或 setClass()
来明确的指明要进行交互的组件,一般情况下不再会包含其他信息。
代码示例:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
Intent
使用隐式 Intent
并没有明确的指定特定组件,而是指定足够的信息让 Android
系统去决定哪一个组件是最符合 Intent
信息,从而拣选出最合适的组件。
隐式 Intent
一般在 Manifestfest.xml
给声明组件通过设置 Action
、Data
、Category
给与组件足够的信息,让系统筛选出合适的组件。
下面是给要启动的 Activity
在AndroidManifest.xml
文件中设置:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="abcdefg" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
我们修改 SecondActivity
在AndroidManifest.xml
中声明,在<intent-filter>
标签中声明 Intent
要过滤的信息。action
的 name
是一个字符串,可以自定义。
现在修改刚才在的 Activity
跳转代码如下:
Intent intent = new Intent();
intent.setAction("abcdefg");//与 Manifest 中组件声明的 action name 必须相同。
startActivity(intent);
运行程序,点击跳转按钮仍然可以跳转到 SecondActivity
。
事实上可以把 Intent
当做一个工具,用于绑定不同组件(甚至是不相同的应用程序之间)。程序在运行时通过 Intent
来延迟运行时绑定。最重要的用途就是启动 Activity
,它可以被认为是 Activity
之间的粘合剂,而它本身是就是一个包含要执行动作的数据结构。
Intent.ACTION_VIEW
用于显示用户的数据。比较通用,会根据用户的数据类型打开相应的Activity。
Uri uri = Uri.parse("http://www.google.com"); Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); //打开浏览器 --> 浏览网页 Uri uri =Uri.parse("tel:1232333"); Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); //打开拨号界面 --> 输入1232333号码 ....
Activity
Uri
对象。data子元素在配置的时候是可选的,但又是相互依存的,比如,如果没有配置scheme,那么其他所有的Uri属性都被忽略;如果host没有配置,那么port以及path,pathPrefix,pathPattern都会被忽略(不起作用)。
在使用 Intent
进行执行操作时,可以通过给 Intent
绑定数据到另一个组件中,从而实现数据的传递。在这个过程中存在数据从内存序列化或从文件序列化。
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("Name","Android"); //Name --> key , Android --> value
startActivity(intent);
数据的传递方式是以键值对的方式。
当跳转到SecondActivity
再从 Intent
中通过 key
(键)把携带的数据取出。
TextView textView = findViewById(R.id.tv_content);
Intent intent = getIntent();//获取传递数据的 Intent
String name = intent.getStringExtra("Name"); //通过 key 取出数据
if (!name.isEmpty()) {
//把界面上原来的字符串SecondActivity进行替换
textView.setText(name);
}
下面是通过源码查看的Intent
所支持的传递数据类型。
当使用 Intent
从 MainActivity
跳转到 SecondActivity
,当在关闭或返回 MainActivity
时需要从 SecondActivity
携带数据到 MainActivity
。
这时,需要在启动 Activity
的时候使用 startActivityForResult(Intent intent, int requestCode)
方式启动。这个原理是当使用 startActivityForResult()
方式启动 Activity
时在返回时系统会回调 Activity
的 onActivityResult(int requestCode, int resultCode, Intent data)
方法。
注意这里有两个特殊的参数:
Activity
启动同一个 Activity
时,确定是哪一个 Activity
启动的。Activity
中返回的多类型数据中,确定需要哪一种数据。很明显返回的数据是包含在 onActivityResult(int requestCode, int resultCode, Intent data)
回调方法的 Intent
当中。
在 MainActivity
中重写回调方法获取从SecondActivity
中设置的数据通过 key
。然后将原来界面上的文字 MainActivity
设置为从 SecondActivity
中取回的值。
在SecondActivity
中通过 setResult()
方法设置数据,通过 Intent
对象。运行程序如下: