Android学习 -- 《Intent app间通信》

来源:互联网 发布:青岛淘宝美工招聘信息 编辑:程序博客网 时间:2024/05/21 07:06

概述:

Android中的一个主要特性就是可以用 action 和 intent 使当前的app跳转到其他的app。

我们使用intent不止是可以在activity之间切换,还可以在不同app的activity之间切换

intent可以通过:

  • 定义一个显式的intent制定需要启动组件的类名
  • 定义一个隐式的inten来唤起不同的app

必须是隐式的才可以启动其他app


建立隐式(implicit)的intent

隐式的intent是不需要类名的,而是声明一个需要执行的 action,而这个action则指定了我们需要做的事情 : 查看,编辑,发送等,还可以 * 附带一些数据 *

从以下的三个例子可以看出:

Uri number = Uri.parse("tel:5551234"); Intent callIntent = new Intent(Intent.ACTION_DIAL, number); //第一个参数是action,dial是拨号的意思//这里就定义了一个带有电话号码的intent,用startactivity()调用这个callintent,就会拨打电话
Uri webpage = Uri.parse("http://www.android.com");Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage); // 这里的action就变成可view,因为这是一个查看网页的跳转

附带数据的情况

Intent emailIntent = new Intent(Intent.ACTION_SEND);// 在没有指定URi的情况下,比如要setType来指定intent附带的数据类型,如果是uri则系统会自动辨别emailIntent.setType(HTTP.PLAIN_TEXT_TYPE); // 类型为文本emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipientsemailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); // 使用putExtra()来添加数据第一个参数要注明数据类型是什么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

验证是否有app接收

android系统会确保每一个intent都有接受它的app,包括电话短信等系统内置app,但是确保起见,我们在触发一个intent之前,要先验证是否有人接受这个intent

没有的话,不能触发,否则会crash

执行的方法:queryIntentActivities() 返回一个list,如果list为空,则不触发

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

使用intent启动activity

这里出现了我们熟悉的一幕,就是点击分享之后出现了dialog,系统让用户选择用哪个app打开,如果只有一个app,系统会默认打开

这里写图片描述


接受Activity返回结果

发送了,我还要知道你收到了!

如果我们使用 startActivityForResult() 那么我们启动一个activity并接受一个返回的result 比如 : 启动联系人程序并获取其中的联系人详情

返回的result也是intent对象,我们用 onActivityResult() 这个回调方法来接收

//启动static final int PICK_CONTACT_REQUEST = 1;  // The request code 是用于标识请求的,因为很可能不止一个...private void pickContact() {    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);}//接收@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    // Check which request we're responding to    if (requestCode == PICK_CONTACT_REQUEST) {        // Make sure the request was successful        if (resultCode == RESULT_OK) {            // The user picked a contact.            // The Intent's data Uri identifies which contact was selected.            // Do something with the contact here (bigger example below)        }    }}

intent 过滤 | filter

所有app都因为做好被别的app启动的准备,那么如何做这样的准备呢?

这部分官网讲的很清楚,大家可以参考

link

0 0
原创粉丝点击