Interacting with Other Apps

App内部通过创建Intent并显示的指明需要start的组件类名来导航到另一个Activity,而导航到另一个独立的app则不需要这种显示指明。只需要对Intent设置正确的MIME类型和相应的data即可,但在invoke Intent之前需要验证设备上是否已安装能处理这类Intent的app,否则你的app将会发生crash。

验证是否有Activity能处理某类Intent可以通过queryIntentActivities()来做:
PackageManager packageManager =getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,0);
boolean isIntentSafe = activities.size()>0;
一旦创建好Intent并调用startActivity(),如果有超过1个Activity能处理这类Intent,系统将会弹出对话框供用户选择哪个app来打开。系统弹出的该对话框底部会有一个checkbox,用户勾选后以后将默认使用该app处理这类Intent。但有时候你需要用户每次都做选择(例如提供不同的分享平台),这时创建的Intent就需要调用createChooser()来创建一个选择对话框。
当你需要从调用的Activity取回结果时(无论是自己的还是其它app的),应该调用startActivityForResult()。该API多了一个参数request code,当被调用的Activity有结果返回时会调用onActivityResult()回调,同时将request code带回供你判断如何处理返回结果。
@Override
protectedvoid 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)
        }
    }
}
当你的app允许接受其它app的调用时,只需在manifest.xml相应的<activiy>标签中通过<intent-filter>来声明。
<activityandroid:name="ShareActivity">
    <!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
    <intent-filter>
        <actionandroid:name="android.intent.action.SENDTO"/>
        <categoryandroid:name="android.intent.category.DEFAULT"/>
        <dataandroid:scheme="sms"/>
        <dataandroid:scheme="smsto"/>
    </intent-filter>
    <!-- filter for sending text or images; accepts SEND action and text or image data -->
    <intent-filter>
        <actionandroid:name="android.intent.action.SEND"/>
        <categoryandroid:name="android.intent.category.DEFAULT"/>
        <dataandroid:mimeType="image/*"/>
        <dataandroid:mimeType="text/plain"/>
    </intent-filter>
</activity>

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据