转发请注明出处:http://blog.csdn.net/qq_28055429/article/details/51442643
搞了好久,还是没搞好,没得到想要的效果,还是总结一下,以供和我一样的新手参考:
ONE: 相关知识
一,Intent的相关属性:
(1)Action: 指Intent将要完成的动作
setAction:设置动作
getAction:获取动作
(2)Data: 指执行动作需要操作的数据,不同的Action有不同的Data
如:在联系人数据库中的一条联系人记录,表现形式为Uri
ACTION_DIAL content://contacts/people/1 :显示电话拨号界面,并填充标识为1的人的信息
ACTION_VIEW tel:10086 :显示电话拨号界面,并填充给定的号码10086
(3)Type: 数据类型,显式指定Intent的数据类型(MIME)
(4)Category: 类别,包含了处理该Intent的组件的种类信息,起着对action的补充说明的作用
如:
CATEGORY_HOME : 表示返回Home界面
CATEGORY_LAUNCHER : 表示Intent的接受者应该在Launcher中作为顶级应用出现
(5)Component : 组件,指定Intent的目标组件的类名称 (指定了这个属性后,Intent的其他属性都是可选的)
Android查找时,若无指定Componet,则在,action,data/type,category,中查找,找到匹配的组件,
若有指定的Componet,则直接使用此指定的Componet组件
(6)Extras: 附近信息,是其他所有附近信息的集合
(7)flag : 该属性用于通知系统如何启动目标Activity , 或者启动之后采取怎样的操作
如:
FLAG_ACTIVITY_NEW_TASK: 通知系统目标Activity作为新的Task进行初始化
二,Intent的两种操作方式:显式与隐式
显式:Intent intent = new Intent(MainActivity.this , SecondActivity.class);
startActivity(intent); 指定了目标(SecondActivity),不需要去解析
隐式:不知道接收者,需要解析
三,Intent解析:
(1)通过查找已注册的AndroidManifest.xml中的所有Intent Filter及其中定义的Intent,最终找到匹配的Intent
若组件没有Intent filters,那么它只能接受显式Intent,
若有,则能同时接受两者
(2)当一个Intent和Intent Filter进行比较时,Android是通过Intent的action, type , category这三个属性进行判断的,具体如下:
Action: IntentFilter中可以有一个或者多个Action用于过滤,而Intent请求中只要有一个匹配其中的action即可;
若IntentFilter没有设置action值,则所有的Intent都会被过滤
Data : IntentFilter也可以设置多个Data , 也可以没有, Data包含的内容主要是URL和数据类型,在对Data进行查找时主要
根据这两点
Category : IntentFilter 也可以设置多个category , 只有当Intent中所有的category 都能匹配到IntentFilter中的category时才能通过 检查
四,注意地方
(1)setType和setData只能有一个生效
(2)如若同时设置setType和setData,可使用用函数setDataAndType
TWO : 开始分享代码
type常用形式:
Text:文本
image/* :支持所有格式图片
text/plain : 纯文本
text/html : HTML文档
text/* : text类型
video/mpeg : MPEG动画
等等,
还有一个(*/*)
代码:
package com.maiyu.simpleonemusic; import java.io.File; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.util.Log; public class Share extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { //可以在此处为三个分享按钮绑定ID并设置监听器,这里不写了 super.onCreate(savedInstanceState); } //(1)分享字符串 public void shareStr(){ //创建分享Intent Intent sharedIntent = new Intent(); //设置动作为Intent.ACTION_SEND sharedIntent.setAction(Intent.ACTION_SEND); //设置为文本类型 sharedIntent.setType("text/*"); sharedIntent.putExtra(Intent.EXTRA_TEXT,"你好聪明" ); //设置要分享的内容 startActivity(Intent.createChooser(sharedIntent, "分享到:")); } //分享图片 public void shareI(){ //File.separator:分割号 String imagePath = Environment.getExternalStorageDirectory() + File.separator + "test.jpg"; //由文件得到uri Uri imageUri = Uri.fromFile(new File(imagePath)); Log.d("share", "uri:" + imageUri); //输出:file:///storage/emulated/0/test.jpg Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri); shareIntent.setType("image/*"); startActivity(Intent.createChooser(shareIntent, "分享到")); } //分享音乐,这里只是可以分享到qq public void shareMusic(){ String url = Environment.getExternalStorageDirectory() + File.separator + "test.mp3"; Intent share = new Intent(Intent.ACTION_SEND); //创建组件, ComponentName component = new ComponentName("com.tencent.mobileqq","com.tencent.mobileqq.activity.JumpActivity"); share.setComponent(component); //设置组件 File file = new File(url);//参数为谋音乐在手机中的路径 System.out.println("file " + file.exists()); share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); share.setType("*/*"); startActivity(Intent.createChooser(share, "分享到")); } }
分享音乐时,只是实现了分享到QQ的平台,
可以用sharesdk来实现别的平台:
具体略,
附注:我也不熟练