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

我们开发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[] {"[email protected]"}); // 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,我们创建一个button。而且在点击事件中创建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中监听返回button,并传回数据。

	@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点击打开链接

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-24 20:46:30

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

深入分析:Android中app之间的交互

在我们开发Android App应用的时候,有些需求需要我们启动其他的App来处理一些逻辑,例如我们需要根据一个地址来调用系统或者相关的地图Map App,这样我们不用在自己的App中编写相应的功能,而是通过Intent来发送一些请求,调用相关的应用来处理这些请求.并且我们称这种Intent为隐式的Intent:这种隐式的Intent是相对于显式的Intent来讲的.显式的Intent我们都比较熟悉,显式的Intent常常需要声明类的名称,而隐式的Intent我们需要声明一个Action,我们A

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

在前一篇相关主题的博文中我们了解了如何使用Action来启动当前应用之外的Activity处理我们的业务逻辑,在本篇笔记中我在简单介绍一下使用ComponentName来与当前应用之外的应用进行交互. 在介绍Component之前,我们首先来了解ComponentName这个类:ComponentName与Intent同位于android.content包下,我们从Android官方文档中可以看到,这个类主要用来定义可见一个应用程序组件,例如:Activity,Service,Broadcast

Android在一个app中启动另一个App

Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); ComponentName cn = new ComponentName("com.example.timer", "com.example.timer.MainActivity");//包名,类名 intent.setComponent(cn); startActivity(in

Android手机app启动的时候第一个Activity必须是MainActivity吗

原文:Android手机app启动的时候第一个Activity必须是MainActivity吗 Android手机APP启动的第一个Activity是可以自己设置的,不是必须的MainActivity,可以是任何的Activity. 设置Android手机APP启动的第一个Activity得看Android项目里的mainfest.xml文件: android.name属性值是由包名(com.example.login)+启动的Activity类名(Login)组成的,如果要修改APP启动的第一

Android中实现跨app之间数据的暴露与接收

例如一个小项目:实现单词本的添加单词等功能 功能:不同的方式实现跨app之间数据的暴露与接收 暴露端app:实现单词的添加(Word.Translate),增删改查: 接收端app:模糊查询,得到暴露端的数据. 暴露端主页及布局: 1.布局: 主页布局:ListView.TextView(empty) item布局:TextView(单词).TextView(翻译) 添加或修改单词的Dialog布局:EditText(hint="word").EditText(hint="t

[Android Memory] App调试内存泄露之Context篇(上)

转载自:http://www.cnblogs.com/qianxudetianxia/p/3645106.html Context作为最基本的上下文,承载着Activity,Service等最基本组件.当有对象引用到Activity,并不能被回收释放,必将造成大范围的对象无法被回收释放,进而造成内存泄漏. 下面针对一些常用场景逐一分析. 1. CallBack对象的引用 先看一段代码: @Override protectedvoid onCreate(Bundle state){ super.o

(Android review)Activity之间的数据传递

一.基本知识点 1.Activity之间传递数据1)传递基本类型或String intent.putExtra("username", username);  getIntent(); intent.getStringExtra("username"); 2)以bundle的形式传 Bundle bundle = new Bundle();    bundle.putString("username", username);    bundle.

关于Android和iOS之间个人不(ch&#250;n)吐(cu&#236;)不(t&#249;)快(c&#225;o)的看法

这是一个我很久就想说的话题,这是一个我不吐不快的话题,先交待下本人是做Android开发的,虽然最近也有在整iOS的事情,不过毕竟不像Android那么熟悉,当然这主要是从开发的层面.其次,我要声明下这只是我的个人观点和看法,如果有失偏颇,还请各位提出建议或给予更正,对于我的个人观点,您可以不认同或者发表您的不同意见,我都乐意接纳,但请各位在看的同时注意文明用语,谢谢! 如果只说喜好,我更喜欢Andorid,iOS虽然说不上讨厌,但起码我是觉着用着难受! Android和iOS之间的争议从来就没

UWP开发:APP之间的数据交互(以微信为例)

目录 说明 UWP应用唤醒方式 跟微信APP交互数据 APP之间交互数据的前提 说明 我们经常看到,在手机上不需要退到桌面,APP之间就可以相互切换,并且可以传递数据.比如我在使用知乎APP的时候,需要使用新浪微博账号登录,点击“微博登录”后,系统自动唤醒新浪微博APP,并将知乎请求登录的数据传给了微博APP(微博APP界面上可以看到是知乎请求登录授权),见下图:    如上所示,依次点击“微博登录”.“确定”,手机界面自动来回切换,不需要人为干预.另外,如果我们在知乎看到一篇有意思的文章,需要