转发请注明出处: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来实现别的平台:
具体略,
附注:我也不熟练