Android中的intent,分为显式intent和隐式intent,使用intent,可以实现我们activity之间的跳转,以及组件之间的交流,我们先说显式intent。
intent有多个构造函数的重载,其中一个是intent(Context packageContext,Class<?>cls)。这个构造函数接受两个参数,第一个参数要求提供一个启动活动的上下文,一般为本activity,第二个参数Class则是指我们想要启动的目标活动,通过这个构造函数就可以构建出intent的“意图”,然后调用activity的startactivity方法,把intent传入,就可以跳转到目标activity。这种意图比较明显的,指明跳转目标界面的方式,我们称之为显式intent。
相比于显式intent,隐式intent就比较含蓄,他不会明确地指出我们想要启动哪个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统分析去启动这个intent,然后根据匹配规则,去启动相应的activity,
类似于我们的主页面,
通过我们设置意图过滤器(intent-filter),然后设置action和category,这样,我们的每次程序启动,会先进入这个页面,同理,我们的隐式intent,也可以通过这种方法来启动其他页面。
我们在action中指明我们的活动可以相应哪个action,然后通过category标签来进一步确定当前活动的启动规则,只有当和中的内容同时匹配我们在intent中指定的action和category时,这个活动才能相应该intent;
每个intent中只能指定一个action,但却能够指定多个category。
我们在intent中新增一个category,但是我们的配置文件中并没有新增对应的category,然后运行程序,发现程序崩溃,查看错误日志
显示没有activity能匹配到这个intent。然后我们在配置文件中添加这个category,再次运行程序,就会一切正常了。
使用隐式intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成了可能,比如在我们的应用程序中展示一个网页,我们就没必要自己去实现一个浏览器,而是直接调用系统的浏览器来打开网页。
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu,com"));
startActivity(intent);
我们首先指定了intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW.然后通过uri.parse()方法,将一个网址字符串解析成一个uri对象,再调用intent的setdata方法将这个uri对象传递进去。我们运行程序,点击按钮就可以看到打开了系统浏览器。
通过我们的uri.parse()方法,我们不仅可以实现打开浏览器,还可以这样。
intent.setdata(uri.parse(“tel:100010”));
然后在配置文件中,添加语句:
<data android:scheme="tel"></data>
当我们再次运行程序时,点击按钮,就会跳转到我们的打电话页面。