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>