getintent data.getData是得到什么

23364人阅读
Android(231)
Intent的构成
Intent可以带有action,data(由URI表达),extra data(key/value map,键值对),指定的类名(成为component name)。一个intent至少携带上述的一个内容。
Action。Action名,在上一笔记中已经给出两种例子,一种是系统自带的,如Intent.ACTION_DAIL,一种是开发者通过AndroidManifest.xml进行注册的,在创建intent时给出:Intent intent=new Intent(String action_name);。action_name字符串的名字前缀是类名。
Data。由不同action决定有效的URI的格式。intent.setData(Uri.parse(”xxxxxx”));。被唤起的activity可以同activity.getIntent()来获得intent,然后通该intent的getData()来获取数据。
//触发方。&
Intent i = new Intent(actionName);
String uriStr = &&;
i.setData(Uri.parse(uriStr));
this.startActivity(i);
//被触发方。需要在AndroidManifest.xml中在intent-filter中注册data信息,后文详细说明
Intent intent = this.getIntent();
String data = intent.getData();
通用的action即数据传递。Action和唤起的并非是一对一的,例如Intent.ACTION_VIEW根据data,唤起不同的应用。这种一对多,也就是通用的action,在manifest中注册时,需要声明数据(URI)的要求。具体可以参考:。ACTION_VIEW是通过schema进行区分。通过class名字、action名字等方式进行指定的称为explicit
intent,可以一对多的称为implicit intent。
&activity......&
&&& &intent-filter&&
&&&&&&&& &action android:name=&android.intent.action.VIEW& /&
&&&&&&&& &data android:scheme=&http&/&
&&&&&&&& &data android:scheme=&https&/&
&&& &/intent-filter&
&/activity&
如果我们自己的intent要传递data,也必须要在manifest中注册data,否则intent会唤起失败,报告ActivityNotFoundException的异常。
比较常用的还有MIME type,例如注册&data android:mimeType=&vnd.android.cursor.dir/vnd.google.note& /&表示要查看notes的集合(即目录),而注册&data android:mimeType=&vnd.android.cursor.item/vnd.google.note& /&则表示查看具体item,即查看具体的note。
扩展数据(Extra data)传递。uri的方式限制了信息的传递量。Extra的格式key/value对,key名字通常以包名开头,而value可以是任何基础数据类型,或者是实现android.os.Parcelable的对象。
在IntentTestDemo.java(通过intent i唤起IntentBasicViewActivity)通过下面传递extra数据。
1、extra数据以bundle的方式在intent中存放,如果已经有bundle,将新的键值对加入其中,如果没有bundle,则创建一个。未来确保key的唯一性
2、key名通常以包名开头,本例以常量方式,实际为:cn.flowingflying.android.pro.extra.string。
3、下面是最最简单据类型,还可以是array,例如putExtra(String name, int[] values);
&&&&& 可以是Serializable对象,如putExtra(String name, Serializable value);以及Parcelable对象,如putExtra(String name,Parcelable value); 。
&&&&& 可以将bundle进行传递,如putExtra(String name, Bundle value);,
&&&&& 可以将Intent进行传递,如putExtra(String name, Intent anotherIntent);
&&&&& 可以支持Array list:如putIntegerArrayListExtra(String name, ArrayList arrayList);&putParcelableArrayListExtra(String name, ArrayList arrayList);和putStringArrayListExtra(String name, ArrayList arrayList)
&&&& 【注意】在intent中传递的不是reference(指针),而是copy一份,我们修改对象,并不会影响已经copy进intent中bundle的数据,这点需要非常注意。
i.putExtra(, &Hello, Intent! &);
在IntentBasicViewActivity.java中通过以下代码获取extra数据。
Intent intent = this.getIntent();
Bundle b = intent.getExtras();&
String s =& b.getString());
Android系统有已定义的key值,具体参见
使用Component来唤起Activity
之前例子,我们通过action name来唤起Activity。对于explicit intent,即明确指定调用哪个activity,可以通过给出该Component的的package name和class name来进行调用。下面我们试验采用四种类似的方式进行调用,这四种方式本质没有区别。
private void basicTest1(){
&&& Intent intent = new Intent();
&& //方式1:setComponent(ComponentName name);
&&& intent.setComponent(new ComponentName(&cn.flowingflying.android.pro&,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &cn.flowingflying.android.pro.IntentBasicViewActivity&));
&&& startActivity(intent);
//要写完整的class Name,不能写IntentBasicViewActivity或者.IntentBasicViewActivity,否则报告找不到Activity的错误
private void basicTest2(){
&&& Intent intent = new Intent();&
&&& //方式2:setClassName(String packageName, String classNameInThatPackage);&
&& intent.setClassName(&cn.flowingflying.android.pro&,&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &cn.flowingflying.android.pro.IntentBasicViewActivity&);
&&& startActivity(intent);
//要写完整的class Name,不能写IntentBasicViewActivity或者.IntentBasicViewActivity,否则报告找不到Activity的错误
private void basicTest3(){
&&& Intent intent = new Intent();
&& //方式3:setClassName(Context context, String classNameInThatContext);
&&& intent.setClassName(this,&cn.flowingflying.android.pro.IntentBasicViewActivity&);
&&& startActivity(intent);
private void basicTest4(){
&&& Intent intent = new Intent();
&&& //方式4:setClass(Context context, Class classObjectInThatContext);
&& intent.setClass(this,IntentBasicViewActivity.class);
&&& startActivity(intent);
Intent的Category属性
在AndroidManifest.xml中,我们可以设置intent的category,例如:
&activity ……&
&&& &intent-filter&
&&&&&&& &action android:name=&android.intent.action.MAIN& /&
&&&&&&& &category android:name=&android.intent.category.LAUNCHER& /&
&&& &/intent-filter&
&/activity&
在应用启动是,将寻找Activity标记为CATEGORY_LAUNCHER来加载。Android定义了多个Category,具体可以在中查阅。例如CATEGORY_HOME可以作为该应用的home
screen,而CATEGORY_GADGET适合嵌入到某个activity中。
下面是两个例子。例子1指明了action name,由于存在多个匹配,系统将列出来,供用户进行选择,如下。
例子2在例子1的基础上增加了intent.addCategory(Intent.CATEGORY_LAUNCHER);,增加对Category名字的匹配,可以看到系统进行了进一步的过滤。:
我们可以通过PackageManager在代码中,可以不唤起intent就获得匹配的activity信息。如下
Intent intent = new Intent(Intent.ACTION_MAIN,null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
PackageManager pm = getPackageManager();
List&ResolveInfo& list = pm.queryIntentActivities(intent, 0);
for(ResolveInfo ri : list){&
&&& String packageName = ri.activityInfo.packageName;
&&& String className = ri.activityInfo.name;&
&&& ... ....
&&& //有了packageName和className,就可以进行分析,然后通过Intent i= new Intent(packaname,className); startActivity(i);唤起我们所需的acitivity。&
然而,通过PackageManager获得匹配的Activity的数量多于例子中系统提供给用户选择的activities的数量,为何?特别是没有将本应用显示出来。通过category筛选属于implicit intent的调用方式,不属于指定软件包名及类名的explicit intent的精确调用方式,对于implicit
intent调用需要进行声明,如下:
&activity& android:name=&……&& android:label=&@string/app_name& &
&&& &intent-filter&
&&&&&&& &action android:name=&android.intent.action.MAIN& /&&
&&&&&&& &category android:name=&android.intent.category.LAUNCHER& /&
&&&&&&& &category android:name=&android.intent.category.DEFAULT&/&
&&& &/intent-filter&
&/activity&
activity的intent-filter中可以有多个category描述,其中CATEGORY_DEFAULT表示可以使用implicit intent调用,当我们增加此项声明后,本应用就出现在匹配的activity列表中。同样,对于通过action name来调用的,不指定包名和类名的,也属于implicit intent,同样需要进行CATEGORY_DEFAULT的声明,否则会出现ActivityNotFoundException的错误。如果activity没有在intent
fliter中设置为CATEGORY_DEFAULT,我们可以用PackageManager获取匹配的activities的信息,分析后得到确切的包名和类名,通过explicit的方式唤起该activity。
此外Android说如果从launcher screen唤起时不需要DEFAULT,也就是此时acitivty只需MAIN和LAUNCHER,当然我们也可以DEFAULT设上。Android在DEFAULT上似乎有些繁杂,简单说如果我们不希望App被其他App通过implicit调用,我们就不要设置DEFAULT。
在category中有一个有趣的类别:&category android:name=&android.intent.category.HOME&/&,我们在MainActivity以及另外一个Activity增加该类别。
&application ...... &
&&& &activity ...... &
&&&&&&& &intent-filter&
&&&&&&&&&&& &action android:name=&android.intent.action.MAIN& /&
&&&&&&&&&&& &category android:name=&android.intent.category.HOME&/&
&&&&&&&&&&& &category android:name=&android.intent.category.LAUNCHER& /&
&&&&&&&&&&& &category android:name=&android.intent.category.DEFAULT&/&
&&&&&&& &/intent-filter&
&&& &/activity&
&&& &activity android:name=&.IntentBasicViewActivity& android:label=&@string/intent_basic_test&&
&&&&&&& &intent-filter&
&&&&&&&&&&&&&&& &action android:name=&android.intent.action.MAIN& /&
&&&&&&&&&&& &category android:name=&android.intent.category.HOME&/&
&&&&&&&&&&& &category android:name=&android.intent.category.DEFAULT&/&
&&&&&&& &/intent-filter&
&&& &/activity&
&&& ......
&/application&
左图在代码中通过PackageManager来查看匹配CATEGORY_HOME的信息;中图通过StartActivity(intent)来唤起匹配CATEGORY_HOME的Activities时,系统给予用户的选择,如果在应用中按Home键,有同样效果;右图为退出应用,按Home键,要求进入Home UI时,系统给予用户的选择。
相关链接:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4285631次
积分:48589
积分:48589
排名:第55名
原创:721篇
转载:23篇
译文:237篇
评论:1516条
文章:49篇
阅读:34018
文章:222篇
阅读:525954
文章:230篇
阅读:1930131
我思故我在,如果一个人无法独立思考,即使熟习各种工具,实质只是工具的一部分,永远无法创造工具。
文章转载只能用于非商业性质,且不能带有虚拟货币、积分等附加条件;转载必须注明出处。
我的微博帐号:
(10)(6)(2)(2)(2)(7)(3)(3)(8)(4)(12)(5)(5)(8)(3)(11)(3)(10)(6)(9)(8)(8)(8)(11)(5)(4)(16)(8)(7)(19)(17)(11)(8)(11)(22)(16)(18)(11)(6)(15)(14)(13)(17)(15)(6)(5)(2)(15)(4)(14)(3)(5)(13)(8)(7)(12)(7)(8)(6)(3)(3)(19)(14)(14)(16)(16)(13)(19)(16)(8)(17)(23)(16)(15)(11)(10)(7)(15)(10)(21)(6)(7)(8)(9)(5)(4)(14)(22)(9)(21)(22)(13)(12)(5)(5)(9)(1)博客访问: 242555
博文数量: 26
博客积分: 169
博客等级: 入伍新兵
技术积分: 516
注册时间:
爱工作,爱生活,更爱自由的程序媛,坚持最初的梦想,做最好的自己!
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Android平台
现有MainActivity,当它进入到SecondActivity后,在SecondActivity中进行了某些操作然后需要将值返回给MainActivity时,
于是就可以用到onActivityResult()&这个方法了,下面呢,我就具体来介绍一下用法。
不过在这之前,先讲一下intent的用法:
对于intent主要的分类主要包括隐式意图和显式意图。显式意图通常主要是启动本应用中的Activity之间的数据,
而隐式意图则常见于启动系统中的某些特定的动作,比如打电话,或者是跨应用的Activity启动。
一般来说:
显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、
&&&&&&&&& 数据(URI和数据类型)找到最合适的组件来处理这个意图。
1、MainActivity里面的主要代码
(1)当需要返回值时,那么在启动另一个Activity时要用到startActivityForResult(intent, REQUEST_CODE);
&&&& 注意第二个参数是请求的int类型的值,这个值要在onActivityResult()方法中和requestCode做判断的,
&&&& 由此来判断是启动的某个Activity。
(2)onActivityResult()方法中的第二个参数就是SecondActivity传回来的键,
&&&& 第三个参数就是SecondActivity传回来的键对应的值。
&&& final int RESULT_CODE=101;
&&&&final int REQUEST_CODE=1;
&&&&public void enterSecond(View view) {
&&&&&&&&Intent intent=new Intent(this,SecondActivity.class);
&&&&&&&&startActivityForResult(intent, REQUEST_CODE);
&&&&@Override
&&&&protected void onActivityResult(int requestCode, int resultCode, Intent data) {
&&&&&&&&Log.i(TAG, "onActivityResult"+"requestCode"+requestCode+"\n resultCode="+resultCode);
&&&&&&&&if(requestCode==REQUEST_CODE) {
&&&&&&&&&&&&if(resultCode==RESULT_CODE) {
&&&&&&&&&&&&&&&&String result=data.getStringExtra("second");
&&&&&&&&&&&&
textView.setText(result);
&&&&&&&&&&&&}
&&&&&&&&super.onActivityResult(requestCode, resultCode, data);
2、SecondActivity&类中的代码:
&& 这个里面的RESULT_CODE、intent分别跟上段代码中onActivityResult()方法中的第二个、第三个参数相对应。
final int RESULT_CODE=101;
&&&&public void closeButton(View view) {
&&&&&&&&Intent intent=new Intent();
&&&&&&&&intent.putExtra("second", "I am second!");
&&&&&&&&setResult(RESULT_CODE, intent);
&&&&&&&&finish();
3、除此之外,onActivityResult()方法中的第二个参数resultCode还有系统自带的一些参数,也就是说,如果我们启动的intent是隐式意图,那么可以用Activity类中RESULT_OK来表示操作已经顺利结束。
例如,调用系统图库的返回,请看代码:
final int CROP_PIC_REQUESTCODE = 23;
final int SELECT_PICTURE = 21;
if (resultCode == RESULT_OK && requestCode == SELECT_PICTURE) {
&&&&&&&&&&&&System.out.println("调用图库返回,关闭activity");
&&&&&&&&&&&&Intent intent1 = new Intent("com.android.camera.action.CROP");
&&&&&&&&&&&&intent1.setDataAndType(data.getData(), "image/*");
&&&&&&&&&&&&intent1.putExtra("crop", "true");
&&&&&&&&&&&&intent1.putExtra("aspectX", 1);
&&&&&&&&&&&&intent1.putExtra("aspectY", 1);
&&&&&&&&&&&&intent1.putExtra("outputX", 80);
&&&&&&&&&&&&intent1.putExtra("outputY", 80);
&&&&&&&&&&&&intent1.putExtra("return-data", true);
&&&&&&&&&&&&startActivityForResult(intent1, CROP_PIC_REQUESTCODE);
当然,我们还可以看下源码中还有哪些类似RESULT_OK的。
/** Standard activity result: operation canceled. */
&&&&public static final int RESULT_CANCELED = 0;
&&&&/** Standard activity result: operation succeeded. */
&&&&public static final int RESULT_OK = -1;
&&&&/** Start of user-defined activity results. */
&&&&public static final int RESULT_FIRST_USER = 1;
总结:本来我只是想使用一下显示intent启动Activity的方式,后来我又自己扩展了隐式intent启动Activity。
总之,碰到问题,要多思考,不要拘泥在一个点上,这样自己才会真正的进步。
如果大家有什么更好的建议和看法,一定要提出来,互相切磋,共同进步是我们技术宅最大的愿望啊,很高兴和大家分享!
PS:要有扩展性的思维,多想多做。
阅读(47375) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。getIntent().getData() returns previous url in android - Stack Overflow
Join the Stack Overflow Community
Stack Overflow is a community of 7.0 million programmers, just like you, helping each other.
J it only takes a minute:
I am trying to enable deep linking in my app . So my Intent- Filter looks like below
&intent-filter&
android:host="*."
android:scheme="http" /&
android:host="*."
android:scheme="https" /&
&category android:name="android.intent.category.DEFAULT" /&
&category android:name="android.intent.category.BROWSABLE" /&
&action android:name="android.intent.action.VIEW" /&
&action android:name="android.intent.action.ALL_APPS" /&
&/intent-filter&
When clicking the url from other app (Gmail App) my app got opened.But get the previously clicked url. The implemented code is
Intent deepLinkIntent = getIntent();
dataUri = deepLinkIntent.getData();
The printed value shows the previous one
Log.d(TAG, "Received url from intent :data uri==&" +dataUri);
I got one link
From this can't get any answer.
Know someone who can answer? Share a link to this
via , , , or .
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Browse other questions tagged
rev .25712
Stack Overflow works best with JavaScript enabled}

我要回帖

更多关于 intent filter data 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信