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

本文介绍了Android中Intent的使用,特别是隐式Intent在app间通信的应用。通过声明action和附带数据,可以实现查看、编辑、发送等功能。在触发Intent前需验证有无接收方,以避免程序崩溃。同时,讲解了如何启动activity并接收返回结果,以及设置Intent过滤器来准备app间的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述:

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"}); // recipients
emailIntent.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);
}

//接收
@Override
protected 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值