Android中的intent

这两天一直都在学习Intent的相关知识,先推荐一个写得特别好的博客链接,讲述Intent非常详细,


http://www.cnblogs.com/smyhvae/p/3959204.html。接下来,谈谈在activity方面,我对它的总结。

我目前对intent的理解是,当我们离开当前的activity,去打开另一个activity(不管这个activity是系统自带的,还是我们自定义的)时,这时我们需要新建一个intent对象,通过对这个对象的属性设置,将我们希望开启的那一个activity的相关信息存入,然后通过startactivity(intent),来开启另一个activity。

在intent的属性中,有几个常用的:component,action,category,data,type.我们可以通过3种对不同属性设置的方式来打开一个新的activity。

1.component:

可能有人会觉得这行代码中并没有涉及到component,上述代码的另一种写法是,

从中可以发现,intent已经为它的component属性提供了一个构造器,所以我们不需要去new一个componentname对象了,直接生成一个intent对象,将我们要启动的那个类的位置,即在哪个环境下,类名是什么,分别对应第一,二个参数,传递进去就可以了。

这种方式创建的Intent对象被称为显式Intent,除此之外的均为隐式intent,一般建议用隐式。

2.action,category:

action代表要完成的动作,比如查看,或编辑等,而category是action的附加信息。我们在请求组件的页面中,写入我们想要开启的activity需要满足的条件在action和category中,

setAction()中的内容就是字符串,除了系统自带的,我们可以自定义,

然后就可以寻找满足条件的activity了,怎么设置恁?我们在androidmanifest.xml中选择一个我们想打开的activity配置文件,在其中加入如下代码,

就可以让起初的那个activity跳转到当前的activity了,但注意,注意,注意,上面红线标注的name,它的值一定要与我们上面定义的CRAZYIT_ACTION的值相等,任意写个字符串就行,不过最好写成它的路径位置,就像上面的com.这种,方便找到嘛,但不要写成name=CRAZYIT_ACTION。还有,对于系统已经定义好了的,一定要注意大小写!!!如果在AS中有快捷显示,一定要注意它最后写在屏幕上的是不是和当初显示提示时的大小写一样,因为可能出现提示给的是DEFAULT,但当你按了enter后,代码行中写下的是default,出现这种情况时,编译器中不会显示错误,但最后在手机上是一定无法运行的(别问我为什么这么清楚,就是因为这个问题,在那到处找错在哪了,哪了,当最后发现是这个问题时,内心是崩溃的。。。)。还有,不要忘记<intent-filter>标签,只有写了这个,intent才会对这一块我们配置的内容起反应,否则它连识别都未识别出来,又怎么会知道里面的action和category恁。有时会出现这个问题,明明各个文件上都没有语法错误,但运行app的地方,图标上出现了小红叉,如

这种情况下,我们如果点击运行,在手机上是不会出现任何结果的。出现这种情况的原因在于,系统根本没找到入口文件的位置,换句话说,我们在想要作为启动activity的配置文件中,忘了加上这两句,

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

在我们的配置文件中,action与category是同时出现的,我们在想要打开另一个activity的界面,换句话说,就是写要求时,我们可以只写action的,因为category有默认的值。我们也可以写多个category,但只能写一个action,这就是为什么是setaction(),包括后面的setdata(),settype(),但却是addcategory()了。我们在写符合要求的配置信息时,必须要写上这一句,<category android:name="android.intent.category.LAUNCHER">,在这句后,我们才开始写它满足的其他category条件。

3.data,type:

data其实就是一个uri对象,而type就是这个对象的解析类型。当我们在一个activity的配置信息中,在action,category,data同时存在时,只要data是相同的了,依然可以跳到这个页面。如下,

intent.setData(Uri.parse("lee://www.hello:1234/test"));
符合要求activity的配置为:
<data
android:host=" www.hello"
android:port="1234"
android:scheme="lee" />
书上说data中的scheme,host,path,port只要部分相同就可以跳转,但我试验了一下,貌似不行,所以还是都满足条件时跳转。一般我们只设置data,type中的一个,因为后写的会将前一个覆盖,不过可以通过setDataAndType()来同时设置。
当将action与data连用时,我们可以通过简单的代码来实现对系统内部应用,如联系人,短信啊之类的操作。但是有一点要注意,如果我们要进行的操作,是当前应用调用系统应用来操作,则此时我们不需要获得什么权限之类的,但如果我们是要在应用内完成,则需要添加获取权限语句。如ACTION_DIAL和ACTION_CALL,前者是会到系统页面,然后我们再选择是否打电话,这时我们不需要获得权限,后者是直接在应用中就拨打了电话了,这是就需要我们在androidmanifest.xml文件的</application>语句后添加这样一句,
<uses-permission android:name="android.permission.CALL_PHONE"/>,目前我遇到的还有一个,就是查看联系人信息,
<uses-permission android:name="android.permission.READ_CONTACTS"/>,而像ACTION_DELETE来卸载应用,则不需要权限。
当我们写的intent中的条件被多个组件满足时,一般会让我们自己选择开启哪个,我们也可以通过设置优先级来决定出现这种情况时调用哪个,
<intent-filter android:priority="-1">,可以通过改变priority的值来实现,通常系统自带的应用的priority都是正数。
在intent找寻与它条件匹配的组件时,是按照action,data,category的顺序来依次查找的。
当我们通过<data/>标签设置信息时,一定要按照顺序来,scheme,host,port,path,要么不写,写了就要按照顺序,不能跳过,否则会报错。
这里补充一个知识,如果uri对应的数据包含多条记录,则MIME类型应该以vnd.android.cursor.dir/开头,如果只有一条记录,则应该是以vnd.android.cursor.item/开头。
ps:一直没弄懂编辑博客的这个编辑器到底咋个用,写到一半,字号就变了,关键折腾了好一会儿,还是没有改过来,好别扭难过

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值