欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中启动Activity的两种方式分析

程序员文章站 2022-03-30 17:58:31
android中启动activity的两种方式分析。android中activity的启动方式有两种,分为显式调用和隐式调用。而这两种方式却存在很大的区别,下面将介绍他们是如何启动...

android中启动activity的两种方式分析。android中activity的启动方式有两种,分为显式调用和隐式调用。而这两种方式却存在很大的区别,下面将介绍他们是如何启动和他们之间的区别在哪。

首先是显调用,其实显式调用很简单,而且也是日常开发中使用得最多的。两行代码的事,哈哈;

btn.setonclicklistener(new view.onclicklistener() {
 @override
 public void onclick(view view) {
 intent intent = new intent(mainactivity.this,secondactivity.class);
 startactivity(intent);
 }
});

这样就成功地启动了secondactivity;是不是很简单,不说了,哈哈,这不是本文的重点,那我们就来看看显式调用和他有何不同

想要通过隐式调用的方式启动activity,那么intent必须能够匹配目标activity的intentfilter中的过滤信息,如果不匹配将无法启动目标,而intentfilter中的过滤信息包括action、category和data。我们先来看个例子:

首先secondactivity在manifests中的配置如下

<activity android:name=".secondactivity">
 <intent-filter>
 <action android:name="secendactivity"/>
 <category android:name="android.intent.category.default"/>
 <category android:name="sd"/>
 intent-filter>
 activity>

然后mainactivity中跳转到secondactivity中的代码如下:

btn.setonclicklistener(new view.onclicklistener() {
 @override
 public void onclick(view view) {
 intent intent = new intent();
 intent.setaction("secendactivity");
 intent.addcategory("sd");
 startactivity(intent);
 }
});

上面的示例就通过隐式调用的方式从mainactivity启动了secondactivity,那么他是怎么匹配intentfilter中的信息的呢?

接下来我们看看他的匹配规则,首先是action ,action是一个字符串,action的匹配规则是这样的;intent中的匹配信息必须和过滤规则中的action匹配,就是字符串的值完全相同,当intentfilter中有多条匹配规则时,intent中的匹配信息可以是一条也可以是多条,也就是说只要intent中的匹配信息有一条和intentfilter中的匹配规则相同,那么就可以匹配成功。当然,中为action默认指定了很多的action,我们也可以根据自己的需求自己定义;

 category的匹配规则:category的匹配规则和action不同,他要求intent如果intent中出现category,那么category中的匹配信息必须是intentfilter规则中所定义的;
当然,不管是一条还是多条都可匹配成功。还有一点需要注意的是;当我们使用隐式调用的方式调用startactivityz()和startactivityforresult()时,系统会默认给intent加
上android.intent.category.default这个category,也就是是当我们通过隐式调用方式启动activity时必须在目标组件的intentfilter规则中加上这条;
 data的匹配规则和action类似,只是data的写法稍微复杂,data由两部分主组成,mimetype和uri; mimetype指媒体类型,uri的格式包括scheme:uri的模式,如果不定义
scheme,那么这个uri的参数将全部无效。另外还有host:uri的主机名;port:uri的端口号,path:uri的路径信息;需要注意的是:如果intent指定完整的data,必须调用
setdateandtype方法,因为不能调用setdata后再调用settype,因为这两个方法会彼此清空对方的值;