A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


揭秘Android 6.0 之 Direct Share(直接分享)

  前言:Android M提供了新的API,支持快速分享。你可以在应用中定义可以启动特殊Activity的“直接分享目标”(direct share targets ),这些直接分享目标通过分享按钮暴露给用户,这个特性允许用户直接将内容分享给其他应用中的某个人或者某个群组


1、项目演示
下面通过一个Demo程序演示如何进行直接分享。写一个简单的Activity,分享“Hello”给朋友
  当点击“Share”按钮时弹出“直接分享目标”,“Messenger”,”DirecShare”是可通过它们进行分享的应用(就像6.0之前点击分享弹出的可分享的应用列表),“Messenger”,”DirecShare”上面区域即是直接分享目标


  点击一个直接分享目标”Chang”,弹出分享界面


  点击SEND,完成分享


2、项目实现
2.1 继承ChooserTargetService
  要开启直接分享你必须先定义一个Class继承ChooserTargetService,在Manifest中声明这个服务,在该声明中,指定BIND_CHOOSER_TARGET_SERVICE 权限,并且指定Intent Filter  Action为SERVICE_INTERFACE。
  下面的例子展示了如何在Manifest中声明ChooserTargetService:
  1. <service
  2.     android:name=".SampleChooserTargetService"
  3.     android:label="@string/app_name"
  4.     android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
  5.     <intent-filter>
  6.         <action android:name="android.service.chooser.ChooserTargetService" />
  7.     </intent-filter>
  8. </service>
复制代码
  重写ChooserTargetService的方法onGetChooserTargets()
  1. @Override
  2. public List<ChooserTarget> onGetChooserTargets(ComponentName targetActivityName,
  3.                                                IntentFilter matchedFilter) {
  4.     ComponentName componentName = new ComponentName(getPackageName(),
  5.             SendMessageActivity.class.getCanonicalName());
  6.     // The list of Direct Share items. The system will show the items the way they are sorted
  7.     // in this list.
  8.     ArrayList<ChooserTarget> targets = new ArrayList<>();
  9.     for (int i = 0; i < Contact.CONTACTS.length; ++i) {
  10.         Contact contact = Contact.byId(i);
  11.         Bundle extras = new Bundle();
  12.         extras.putInt(Contact.ID, i);
  13.         targets.add(new ChooserTarget(
  14.                 // The name of this target.
  15.                 contact.getName(),
  16.                 // The icon to represent this target.
  17.                 Icon.createWithResource(this, contact.getIcon()),
  18.                 // The ranking score for this target (0.0-1.0); the system will omit items with
  19.                 // low scores when there are too many Direct Share items.
  20.                 0.5f,
  21.                 // The name of the component to be launched if this target is chosen.
  22.                 componentName,
  23.                 // The extra values here will be merged into the Intent when this target is
  24.                 // chosen.
  25.                 extras));
  26.     }
  27.     return targets;
  28. }
复制代码
  该方法返回的List中存放的ChooserTarget就是上面看到的“直接分享对象”,看下面关键代码
  1. targets.add(new ChooserTarget(
  2.         // The name of this target.
  3.         contact.getName(),
  4.         // The icon to represent this target.
  5.         Icon.createWithResource(this, contact.getIcon()),
  6.         // The ranking score for this target (0.0-1.0); the system will omit items with
  7.         // low scores when there are too many Direct Share items.
  8.         0.5f,
  9.         // The name of the component to be launched if this target is chosen.
  10.         componentName,
  11.         // The extra values here will be merged into the Intent when this target is
  12.         // chosen.
  13.         extras));
复制代码
  创建ChooserTarget对象时定义了直接分享对象的name,icon,extras,还有componentName,这里componentName就是当选择该直接分享对象时要启动的component
  在该Demo中,就是分享界面的Activity。
  1. ComponentName componentName = new ComponentName(getPackageName(),
  2.         SendMessageActivity.class.getCanonicalName());
复制代码
  看到的界面也就是

2.2 将Activity暴露给ChooserTargetService
  只完成ChooserTargetService还不行,还必须将接收Action androd.intent.action.SEND的Activity暴露给ChooserTargetService才可以,通过<meta-data>标签
  1. 1,        <activity
  2.     android:name=".SendMessageActivity"
  3.     android:label="@string/app_name"
  4.     android:theme="@style/DirectShareDialogTheme">
  5.     <intent-filter>
  6.         <action android:name="android.intent.action.SEND" />
  7.         <category android:name="android.intent.category.DEFAULT" />
  8.         <data android:mimeType="text/plain" />
  9.     </intent-filter>
  10.     <meta-data
  11.         android:name="android.service.chooser.chooser_target_service"
  12.         android:value=".SampleChooserTargetService" />
  13. </activity>
复制代码
  它的原理是系统在响应SEND的Intent时,会检测符合要求的Activity是否暴露给ChooserTargetService,如果暴露了则把ChooserTargetService方法onGetChooserTargets返回的ChooserTarget显示给用户,否则就不显示,只显示可分享的应用。

53 个回复

倒序浏览
赞一个
回复 使用道具 举报
加油 不错哦
回复 使用道具 举报
棒棒的 柳柳姐
回复 使用道具 举报
同步很快啊,都android6.0同步上了,加油黑马
回复 使用道具 举报
安卓现在发展的挺快的啊
回复 使用道具 举报
我们一起加油Android
回复 使用道具 举报
好厉害,现在还是门外汉
回复 使用道具 举报
董棁 中级黑马 2015-11-25 08:04:36
9#
赞一个~~~~~
回复 使用道具 举报
不錯,感謝分享
回复 使用道具 举报
谢谢分享,让我们的知识得到扩展
回复 使用道具 举报
不错不错!
回复 使用道具 举报
     赞一个   不错哦
回复 使用道具 举报
赞一个.
回复 使用道具 举报
加油 不错哦
回复 使用道具 举报
有没有比较全面的细致的总结
回复 使用道具 举报
光哥 中级黑马 2015-11-27 14:10:28
17#
加油,不错啊!
回复 使用道具 举报
都到6了  我的还在4号呢
回复 使用道具 举报
赞赞赞赞赞赞
回复 使用道具 举报
那么快更新了果断看一看!!!!!!!!!!!!!!!!!11
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马