在某程序中,选择某图片或者文字,点击分享,下方弹出一个选择框。点击分享并且弹出框这是分享主体的操作。弹出框中存在的内容,可供分享的对象,是分享客体。
分享主体与客体的实现均是围绕着Intent.ACTION_SEND这个官方Intent展开。官方给与了一个简单的分享流程,我们随着流程就能实现分享流程。
先上代码,下面是最简单分享主体的代码,只要在应用中调用本应用,就可以弹出分享框。
public static void share() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,”待分享文字”);
context.startActivity(Intent.createChooser(intent, “分享框的标题”));
}
实现分享主体,是需要启动分享客体,所以需要使用Intent来启动,intent里面要包含分享的内容,以及Intent.ACTION_SEND 标识,就可以完成分享。
分享主体实例代码一共4行:
第一行:Intent intent = new Intent(Intent.ACTION_SEND);
本行代码是创建一个action为Intent.ACTION_SEND的Intent。
这一行也可以分成两段来写:
Intent intent = new Intent();
Intent.setAction(Intent.ACTION_SEND);
这第一行代码就定义了这个intent是用来分享内容的。
第二行代码:intent.setType("text/plain");
本行代码是定义分享的内容,这里表示分享的是文字。而可以分享内容还可以分享图片,音乐,乃至所有文件。 无论什么文件均可以通过蓝牙发送,蓝牙发送也属于分享的客体。
"text/plain"就是ClipDescription.MIMETYPE_TEXT_PLAIN。是官方定义的文字type。所以这一行代码,我们也可以写成
intent.setType(ClipDescription.MIMETYPE_TEXT_PLAIN);
如果写成这样,则需要import android.content.ClipDescription;
从MIMETYPE_TEXT_PLAIN这个名字可以看出,我们的setType的对象叫做mimeType。对于类型感兴趣的可以去搜索“mimeType类型大全”对其深入了解。
第三行代码: intent.putExtra(Intent.EXTRA_TEXT , ”待分享文字” );
是很常见的putExtra,往intent放入文字信息。
这里还可以根据需要扩展放入一些intent的参数类容。
比如:intent.putExtra(Intent.EXTRA_SUBJECT, title); // 添加标题
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 添加Flag
第四行代码:context.startActivity(Intent.createChooser(intent, “分享框的标题”)
这一行代码是启动弹出框,并且在点击了弹出框的应用是,还会顺势启动目标应用,并将intent传入应用。
createChooser是用来生成分享列表的。也就是弹出一个框,里面展示着分享客体。
Startactivity是android默认通过intent启动应用的方式,Context就在activity里面,activity里有getApplicationContext方法,可以获取context,同样,需要context的地方都可以用activity的对象代替。
比如,android的应用都是继承至activity,如果在本应用继承至activity的main这个类里面,则可以直接使用startActivity方法,前面不用加context前缀。
以上就是实现分享框架的方法,总结一下,我们需要提供的内容,仅仅是标题和文字类容两个自定义的String,就可以在调用本方法时,成功弹出分享框,分享给所有支持分享的应用。
分享客体:
分享客体是在分享主体的弹出框能够显示出来的app。
分享是一个带action的intent。弹出框显示哪些应用是通过action来搜索“android.intent.action.SEND”
Intent.ACTION_SEND 就是android.intent.action.SEND,这两者没有区别。
所以,如果分享客体想出现在搜索框里,则使用
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
这样在分享主题传入type和action是Intent.ACTION_SEND和"text/plain"时,就能出现本应用。当用户点击我们的应用时,就会启动我们的应用。
获取分享的数据,并处理分享而来的数据:
我们知道应用都是被intent所启动的。启动的时候,会将intent通过startactivity传入被启动应用。
在被启动应用中,使用getIntent() 可以获取被传入的intent。
代码如下:
private void share() {
Intent intent = getIntent();
String action = intent.getAction();
if (!Intent.ACTION_SEND.equals(action)) {
String share = intent.getStringExtra(Intent.EXTRA_TEXT);
setText(share);
}
}
代码中,首先通过getIntent()获取传入的intent。
随后String action = intent.getAction();
判断本次启动是否为因为分享而启动的。如果因为分享而启动,才需要进行分享内容的处理,如果仅仅是点击桌面图标启动,那就是普通启动了。
String share = intent.getStringExtra(Intent.EXTRA_TEXT);
获取数据库传输的文字内容,然后将文字进行自己希望的处理吧。
以上,就是分享功能的基础实现。