黑马程序员技术交流社区

标题: 揭秘Android 6.0 之 Direct Share(直接分享) [打印本页]

作者: 柳柳桑    时间: 2015-11-24 08:37
标题: 揭秘Android 6.0 之 Direct Share(直接分享)

揭秘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显示给用户,否则就不显示,只显示可分享的应用。


作者: 耀阳圣尊    时间: 2015-11-24 09:35
赞一个
作者: 我有个少年梦    时间: 2015-11-24 12:43
加油 不错哦
作者: 洋葱头头    时间: 2015-11-24 12:49
棒棒的 柳柳姐
作者: chenxianzai    时间: 2015-11-24 21:43
同步很快啊,都android6.0同步上了,加油黑马
作者: 听你说    时间: 2015-11-24 21:55
安卓现在发展的挺快的啊
作者: 夜空的星    时间: 2015-11-24 23:11
我们一起加油Android
作者: 她呆萌可爱    时间: 2015-11-25 00:16
好厉害,现在还是门外汉
作者: 董棁    时间: 2015-11-25 08:04
赞一个~~~~~
作者: eddy1820    时间: 2015-11-25 15:46
不錯,感謝分享
作者: 听你说    时间: 2015-11-25 16:03
谢谢分享,让我们的知识得到扩展
作者: ……_JKQqB    时间: 2015-11-25 16:13
不错不错!
作者: 梦想家Eva    时间: 2015-11-25 19:59
     赞一个   不错哦
作者: 长刀研    时间: 2015-11-25 21:42
赞一个.
作者: li2622480    时间: 2015-11-25 22:09
加油 不错哦
作者: xiaoziyk    时间: 2015-11-25 23:36
有没有比较全面的细致的总结
作者: 光哥    时间: 2015-11-27 14:10
加油,不错啊!
作者: 小布丁当    时间: 2015-11-27 22:05
都到6了  我的还在4号呢
作者: a784161433    时间: 2015-11-27 23:28
赞赞赞赞赞赞
作者: 超级宝贝乐爷    时间: 2015-11-28 00:16
那么快更新了果断看一看!!!!!!!!!!!!!!!!!11
作者: 664631215    时间: 2015-11-28 08:53
干的漂亮
作者: 草上飞f    时间: 2015-11-29 00:02
很好的贴~~~~~~~~~~~~~~~~~~~~~
作者: 及其胡来    时间: 2015-11-30 10:58
厉害 就怕和时代接不上轨
作者: 草上飞f    时间: 2015-11-30 13:02
好帖!!!!
作者: 人丑却保守    时间: 2015-12-1 22:15
初学者 看不懂..
作者: 夏天的泡沫    时间: 2015-12-2 00:23
谢谢分享
作者: anuo    时间: 2015-12-2 09:06
留着以后看吧,学的也是这一块。加油
作者: wyasln    时间: 2015-12-2 10:26
5.0还没用上了,6.0就来了
作者: 草上飞f    时间: 2015-12-5 23:54
顶!!!!!
作者: zhangfan    时间: 2015-12-7 23:26
没学到这  。。但已 got!
作者: @别闹    时间: 2015-12-8 21:28
感谢你的分享!谢谢!
作者: xiaoaonuanhu    时间: 2015-12-8 23:03
这个代码看不懂呢。
作者: chenxunlei    时间: 2015-12-9 19:30
赞赞赞赞赞
作者: pllaoyao    时间: 2015-12-9 22:27
学习了。谢谢
作者: 啦啦啦啦啦啦啦    时间: 2015-12-10 00:11
好棒, 好棒
作者: 段江波    时间: 2015-12-11 22:22
跟上节奏 赞一个
作者: 武鹏    时间: 2015-12-14 23:26
很是不错的给力哦-
作者: 15846574191    时间: 2015-12-14 23:40
感谢分享!
作者: 武鹏    时间: 2015-12-15 00:02
很是不错的哦--很给力-
作者: 周亚飞    时间: 2015-12-15 00:19
安卓马上开班先马克
作者: pllaoyao    时间: 2015-12-15 01:07
学习学习.........
作者: oscar_tao    时间: 2015-12-15 21:09
顶一个!
作者: song881224    时间: 2015-12-16 00:08
勤劳的人最可爱!
作者: 陈凯旋    时间: 2015-12-17 14:00
感谢分享!!!
作者: zhongjilingzhu    时间: 2015-12-17 18:02
很是不错的哦--很给力-!!!
作者: lh951329230    时间: 2015-12-17 21:56
黑马加油  我也加油
作者: 洪志豪1994    时间: 2015-12-18 22:22
虽然不懂,但感觉很赞!
作者: 韦丹艳58    时间: 2016-1-12 22:25
哎哟!不错哟!
作者: shihao    时间: 2016-1-23 16:58

很好很强大
作者: tangshenshen    时间: 2016-3-13 23:14
给个大大赞。。。。。。。
作者: mycoder    时间: 2016-3-14 22:39
需要学习的东西还有很多
作者: mycoder    时间: 2016-3-14 22:41
需要学习的东西很多很多
作者: debuggerx01    时间: 2016-3-15 00:27
新手表示没看出来分享对象是由谁来确定和管理的……
作者: cmz456123    时间: 2016-4-25 12:55
666666666666




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2