在我们开发Android App应用的时候,有些需求需要我们启动其他的App来处理一些逻辑,例如我们需要根据一个地址来调用系统或者相关的地图Map App,这样我们不用在自己的App中编写相应的功能,而是通过Intent来发送一些请求,调用相关的应用来处理这些请求。并且我们称这种Intent为隐式的Intent;这种隐式的Intent是相对于显式的Intent来讲的。显式的Intent我们都比较熟悉,显式的Intent常常需要声明类的名称,而隐式的Intent我们需要声明一个Action,我们Action中定义了我们想要处理的请求。与Action相关联的还有data,例如我们需要查看的地址,或者我们需要拨打的电话号码,或者我们需要发送邮件的邮件地址等等。例如:

Uri number = Uri.parse("tel:5551234");Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

上述代码中,我们通过startActivity()来调用Phone App,并进行拨打(5551234)的通话操作。当然这里还有很多案例,这里主要是从API 文档中摘录的了。贴在这里供大家参考。

查看地图:

// Map point based on address
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// Or map point based on latitude/longitude
// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

浏览网页:

Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

发送邮件:

Intent emailIntent = new Intent(Intent.ACTION_SEND);
// The intent does not have a URI, so declare the "text/plain" MIME type
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
// You can also attach multiple items by passing an ArrayList of Uris

创建一个事件通知:

Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");

此外,我们在定义我们的Intent的时候,要尽可能的详细,例如我们希望调用系统的图片查看器浏览图片,我们应该定义MIME type" image/*.",以防止会启动map app进行查看。而且如果没有app来响应我们的请求,我们的app就会崩溃。

因此为了防止我们的app发送intent没有其他app来响应而导致应用异常退出,我们在发送intent前进行验证。为了验证是否有app的Activity来响应我们的Intent请求,我们需要调用queryIntentActivities()来进行验证。这个方法会返回一个list,我们通过判断list是否为空来验证,这样我们可以安全的使用Intent来实现不同App之间Activity的交互。如果没有响应的Acitivty来响应,我们可以提供一些链接给用户进行下载安装。验证方法如下:

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;

下面我们通过具体的案例来使用隐式的Intent,使不同的App中的Activity进行交互。

首先我们创建第一个项目appsend,我们创建一个按钮,并且在点击事件中创建Intent,并设置Action和type,并添加onActivityResult()来接收我们从第二个应用中返回的数据。

	public void button(View view) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setType("test/");
startActivityForResult(intent, 2);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 2:
switch (resultCode) {
case Activity.RESULT_OK:
text.setText("URI:" + data.getDataString());
break;
}
break;
}
}

第二步:我们创建第二个应用,并且在清单文件中进行配置Intent-filter;

<activity
android:name="com.example.appreceiver.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="test/*" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

第三步:在第二个Activity中监听返回按钮,并传回数据。

	@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
Intent result = new Intent("com.example.appsend",
Uri.parse("content://result_uri"));
setResult(Activity.RESULT_OK, result);
finish();
break;
}
return super.onKeyDown(keyCode, event);
}

具体案例下载地址为:http://download.csdn.net/detail/huangyabin001/7561309点击打开链接

深入分析:Android中app之间的交互(一,使用Action)的更多相关文章

  1. 深入分析:Android中app之间的交互(二,使用ComponentName)

    在前一篇相关主题的博文中我们了解了如何使用Action来启动当前应用之外的Activity处理我们的业务逻辑,在本篇笔记中我在简单介绍一下使用ComponentName来与当前应用之外的应用进行交互. ...

  2. Android中H5和Native交互的两种方式

    Android中H5和Native交互的两种方式:http://www.jianshu.com/p/bcb5d8582d92 注意事项: 1.android给h5页面注入一个对象(WZApp),这个对 ...

  3. 在深入分析:Android在app之间的相互作用(一个,使用Action)

    我们开发Android App时间应用,有些需求,我们需要启动另一App为了应对一些逻辑.例如,我们需要映射基于地址调用系统或相关Map App,所以,我们不自己有App在相应的功能的制备.而是通过I ...

  4. android 与JS之间的交互

    在页面布局很复杂并且是动态的时候,android本身的控件就变得不是那么地灵活了,只有借助于网页的强大布局能力才能实现,但是在操作html页面的同时也需要与android其它的组件存在交互,比如说 在 ...

  5. Android中Native和H5交互

    1.概述 时至今日,H5的跨平台性越发凸显优势,一套代码适配android.ios,既能减少开发成本,又便于更新与维护.但是native的性能体验也确实更佳,尤其体现在复杂界面和频繁变化的界面上.事实 ...

  6. Android 中 js 和 原生交互

    Android中的WebView 中加载的URL 默认是在手机浏览器中加载的,我们可以覆盖这种默认的动作,让网页在WebView中打开.通过设置WebView的WebViewClent 达到这个效果. ...

  7. 从Android中Activity之间的通信说开来[转]

    http://www.cnblogs.com/virusswb/archive/2011/08/02/2124824.html 引言 最近两个星期在研究android的应用开发,学习了android应 ...

  8. 抓包工具Fidder详解(主要来抓取Android中app的请求)

    今天闲着没吊事,来写一篇关于怎么抓取Android中的app数据包?工欲行其事,必先利其器,上网google了一下,发现了一款神器:Fiddler,这个貌似是所有软件开发者必备神器呀!这款工具不仅可以 ...

  9. 一个App与另一个App之间的交互,添加了自己的一些理解

    URL Scheme 是什么? iOS有个特性就是应用将其自身"绑定"到一个自定义 URL scheme 上,该 scheme用于从浏览器或其他应用中启动本应用.常见的分享到第三方 ...

随机推荐

  1. seleniumAccessors

    assertErrorOnNext(message) 告诉Selenium在下一个命令执行时期待有错误. 参数:·message–我们所期望的错误信息.如果出现不正确的错误信息,该命令将失败.同断言相 ...

  2. excel中的单位换算函数convert()

    有时,我们在处理数据的时候,需要进行单位换算,比如“7小时24分”换算成小时,可以直接除以或乘以相应的进制来计算,但是在excel中,有一个convert()函数更加方便: 此函数属于工程函数,平时可 ...

  3. HTML5自学笔记[ 23 ]canvas绘图基础7

    变换矩阵: transform(a,b,c,d,e,f),多次使用该函数,效果是多次状态改变的累加: setTransform(a,b,c,d,e,f),会忽略之前的变换,从起始状态开始改变.

  4. vs版本的改变处理

    今天要用VS2010打开VS2013,一直觉得VS2010到VS2012只是界面上扁平化的改变,平台工具集有改变但很大程度上可能向上兼容.在网上搜了一些文章,其中有一篇说到一个观点:        从 ...

  5. settimeout如何调用方法的时候,传递参数

    常见写法: setTimeout("loaded()", 200); 延迟加载loaded方法 如果要给loaded方法传递参数 setTimeout(function () { ...

  6. 算法--数组中出现一次的数,其余都出现N次

    转载:http://blog.csdn.net/morewindows/article/details/12684497 题目:数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请 ...

  7. linux 安装 apache

    1.  系统基本信息 CentOS  6.4   内存2G  硬盘 200G   cpu 4核  (cat /proc/cpuinfo |grep 'processor'|wc -l  查看cpu核数 ...

  8. Spring MVC Controller中解析GET方式的中文参数会乱码的问题(tomcat如何解码)

    Spring MVC Controller中解析GET方式的中文参数会乱码的问题 问题描述 在工作上使用突然出现从get获取中文参数乱码(新装机器,tomcat重新下载和配置),查了半天终于找到解决办 ...

  9. linux sort 命令详解

    sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按AS ...

  10. C# webbrowser 修改useragent

    http://www.lukepaynesoftware.com/articles/programming-tutorials/changing-the-user-agent-in-a-web-bro ...