1.7_Android Training 学习笔记_与其他应用的交互

来源:互联网 发布:最强淘宝系统 编辑:程序博客网 时间:2024/05/30 20:08

1.7.1 Intent 的发送

使用 intent 在同一个 app 的两个 activity 之间进行切换,通常是定义一个显式(explicit)的 intent ,它指定了需要启动组件的类名。然而,当想要唤起不同的app来执行某个动作(比如查看地图),则必须使用隐式(implicit)的 intent 。

验证是否有 App 去接收这个 Intent

如果触发了一个 intent ,而且没有任何一个 app 会去接收这个 intent ,则 app 会 crash
为了验证是否有合适的 activity 会响应这个 intent ,需要执行 queryIntentActivities() 来获取到能够接收这个 intent 的所有 activity 的 list 。若返回的 List 非空,那么我们才可以安全的使用这个 intent 。例如

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

Note:我们必须在第一次使用之前做这个检查,若是不可行,则应该关闭这个功能。如果知道某个确切的app能够handle这个intent,我们也可以向用户提供下载该app的链接。(see how to link to your product on Google Play).

在用户分享功能中需要强制弹出选择的对话框,这种情况下用户不能选中默认启动的 app

Intent intent = new Intent(Intent.ACTION_SEND);...// Always use string resources for UI text. This says something like "Share this photo with"String title = getResources().getText(R.string.chooser_title);// Create and start the chooserIntent chooser = Intent.createChooser(intent, title);startActivity(chooser);

1.7.2 接收 Activity 返回的结果

启动 Activity

对于startActivityForResult() 方法中的intent与之前介绍的并无太大差异,不过是需要在这个方法里面多添加一个int类型的参数。

接收Result

当用户完成了启动之后activity操作之后,系统会调用我们activity中的onActivityResult() 回调方法。该方法有三个参数:

  • 通过startActivityForResult()传递的request code。
  • 第二个activity指定的result code。如果操作成功则是RESULT_OK ,如果用户没有操作成功,而是直接点击回退或者其他什么原因,那么则是RESULT_CANCELED
  • 包含了所返回result数据的intent。
@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)        }    }}

如下代码为接收到选中联系人的信息,这种情况在2.3以上的系统就不需要申请权限了,但是这种临时权限仅仅限于特定的请求,所以仍无法获取除返回的Intent以外的联系人信息,除非声明了 READ_CONTACTS 权限。

1.7.3 Intent 过滤

为了尽可能确切的定义 activity 能够 handle 的 intent ,每一个 intent filter 都应该尽可能详尽的定义好 action 与 data。

添加 intent filter
在 activity 中 handle 发送过来的 intent 通过getIntent()

返回 Result 通过 setResult()

如果想返回一个result给启动的那个activity,仅仅需要执行setResult(),通过指定一个result code与result intent。操作完成之后,用户需要返回到原来的activity,通过执行finish() 关闭被唤起的activity。

// Create intent to deliver some kind of result data
Intent result = new Intent(“com.example.RESULT_ACTION”, Uri.parse(“content://result_uri”);
setResult(Activity.RESULT_OK, result);
finish();
我们必须总是指定一个result code。通常不是RESULT_OK就是RESULT_CANCELED。我们可以通过Intent 来添加需要返回的数据。

Note:默认的result code是RESULT_CANCELED.因此,如果用户在没有完成操作之前点击了back key,那么之前的activity接受到的result code就是”canceled”。
如果只是纯粹想要返回一个int来表示某些返回的result数据之一,则可以设置result code为任何大于0的数值。如果我们返回的result只是一个int,那么连intent都可以不需要返回了,可以调用setResult()然后只传递result code如下:

setResult(RESULT_COLOR_RED);
finish();
Note:我们没有必要在意自己的activity是被用startActivity() 还是 startActivityForResult()方法所叫起的。系统会自动去判断该如何传递result。在不需要的result的case下,result会被自动忽略。

0 0
原创粉丝点击