Android应用程序间的交互

1、Sending the User to Another App
Intent 的 action 包括:view,edit,send,get等,表明你想要的形为( Intent中的action都是字符串,这些字符串是在哪定义的呢? 是别人在声明Component时在manifest.xml文件中注册的,所谓的action只是一个注册的String,当你的APP要用Intent激活别的程序时,用于激活的那个Intent的action就应该是别人应用程序所声明的aciton字符串),且这些动作有可能关联一些数据(这些数据也放在Intent中一同带过去)
如果在Intent中用Uri,则由系统决定MIME类型,因为Uri的不同协议可以映射到一定的MIME类型吧。
但如果你不用Uri,则最好自己调用Intent.setType来设置类型(Type),这样就能更好指定接收的应用程序,不会出现view一个地图的动作被一个文本编辑器打开。
再说 Intent中的Uri:
Intent中的Uri指定了一个协议(可以被解析为Type),而且协议后面还带有数据,这个数据就是被发送的数据,相当于Intent中的Extra,
也就是说 Uri指定了两个部分: Type和Extra


在开始发射Intent之前可以检测一下系统上是否有可以接收你Intent的程序,检测代码如:

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

如果系统上不存在能够接收你Intent的程序,你可以提示用户下载这样的程序。

(注:PackageManager 是用来解析安装在设备上的所有应用程序的manifest.xml文件的,它可以解析这个文件中相关的内容)



如果系统上有多个程序可以打开此Intent,系统会出现一个对话框提示用户选择,而且对话框的下面可以设置一个默认打开的程序;
默认打开有时候是好事,有时候也是坏事,你自己可以决定一个“选择列表”,而不用系统提供的对话框,且这个选择列表是不能设置“默认”的,代码如下:

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 chooser
Intent chooser = Intent.createChooser(intent, title);
startActivity(chooser);
2 Getting a Result from an Activity
如果你的程序调用Camera获得一张图片,那么Camera应该把这张图片返回给你,让你来使用,这时你就要从别的Activty得到结果,这可以通
过startActivityForResult() (instead of startActivity()) 来实现,同时你的应用程序需要在onActivityResult() 中接收结果。 当然前提是你所请求的APP能够返回一个结果,这个结果是通过Intent返回的,所以你最好使用“explict Intent”以确保所请求的程序能够返还给你正确的结果。
protected void onActivityResult(int requestCode, int resultCode, Intent data)
其中 requestCode代表你的请求码,resultCode代表是否正确返回结果,data则是返回的数据

3 Allowing Other Apps to Start Your Activity
Intent: ACTION_SEND  用于分享

对你的程序声明<intent-filter>,如下

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
	<!-- category很少被用,不过你的程序必须声明为DEFAULT,不然系统不会自动选择你 -->
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
        <data android:mimeType="image/*"/>
    </intent-filter>
</activity>
因为你的程序要被其它的程序“开始”,所以在你的代码中要处理这些,你最好在 onCreate或onStart中处理,如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    // Get the intent that started this activity
    Intent intent = getIntent();
    Uri data = intent.getData();

    // Figure out what to do based on the intent type
    if (intent.getType().indexOf("image/") != -1) {
        // Handle intents with image data ...
    } else if (intent.getType().equals("text/plain")) {
        // Handle intents with text ...
    }
}
你的应用程序可以返回结果给调用者,如下代码:

Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result); //注意方式
finish(); //注意,自己的Activity不需要在生存

无论调用者是用startActivity还是 startActivityForResult,你都可以用上述方式进行回复,如果它用startActivity,则系统会把这个结
果“忽略”。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值