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

1.项目演示

下面通过一个Demo程序演示如何进行直接分享。写一个简单的Activity,分享“Hello”给朋友


当点击“Share”按钮时弹出“直接分享目标”,Messenger,DirecShare是可通过它们进行分享的应用(就像6.0之前点击分享弹出的可分享的应用列表),Messenger,DirecShare上面区域即是直接分享目标

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

点击SEND,完成分享

2.项目实现

2.1继承ChooserTargetService

要开启直接分享你必须先定义一个Class继承ChooserTargetService,Manifest中声明这个服务,在该声明中,指定BIND_CHOOSER_TARGET_SERVICE权限,并且指定IntentFilterActionSERVICE_INTERFACE

下面的例子展示了如何在Manifest中声明ChooserTargetService

<service
android:name=".SampleChooserTargetService"
android:label="@string/app_name"
android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
<intent-filter>
<actionandroid:name="android.service.chooser.ChooserTargetService"/>
</intent-filter>
</service>

重写ChooserTargetService的方法onGetChooserTargets()

@Override
publicList<ChooserTarget>onGetChooserTargets(ComponentNametargetActivityName,
IntentFiltermatchedFilter){
ComponentNamecomponentName=newComponentName(getPackageName(),
SendMessageActivity.class.getCanonicalName());
//ThelistofDirectShareitems.Thesystemwillshowtheitemsthewaytheyaresorted
//inthislist.
ArrayList<ChooserTarget>targets=newArrayList<>();
for(inti=0;i<Contact.CONTACTS.length;++i){
Contactcontact=Contact.byId(i);
Bundleextras=newBundle();
extras.putInt(Contact.ID,i);
targets.add(newChooserTarget(
//Thenameofthistarget.
contact.getName(),
//Theicontorepresentthistarget.
Icon.createWithResource(this,contact.getIcon()),
//Therankingscoreforthistarget(0.0-1.0);thesystemwillomititemswith
//lowscoreswhentherearetoomanyDirectShareitems.
0.5f,
//Thenameofthecomponenttobelaunchedifthistargetischosen.
componentName,
//TheextravaluesherewillbemergedintotheIntentwhenthistargetis
//chosen.
extras));
}
returntargets;
}

该方法返回的List中存放的ChooserTarget就是上面看到的“直接分享对象,看下面关键代码

targets.add(newChooserTarget(
//Thenameofthistarget.
contact.getName(),
//Theicontorepresentthistarget.
Icon.createWithResource(this,contact.getIcon()),
//Therankingscoreforthistarget(0.0-1.0);thesystemwillomititemswith
//lowscoreswhentherearetoomanyDirectShareitems.
0.5f,
//Thenameofthecomponenttobelaunchedifthistargetischosen.
componentName,
//TheextravaluesherewillbemergedintotheIntentwhenthistargetis
//chosen.
extras));

创建ChooserTarget对象时定义了直接分享对象的nameiconextras,还有componentName,这里componentName就是当选择该直接分享对象时要启动的component

在该Demo中,就是分享界面的Activity

ComponentNamecomponentName=newComponentName(getPackageName(),
SendMessageActivity.class.getCanonicalName());

看到的界面也就是

2.2将Activity暴露给ChooserTargetService

只完成ChooserTargetService还不行,还必须将接收Actionandrod.intent.action.SENDActivity暴露给ChooserTargetService才可以,通过<meta-data>标签

1,<activity
android:name=".SendMessageActivity"
android:label="@string/app_name"
android:theme="@style/DirectShareDialogTheme">
<intent-filter>
<actionandroid:name="android.intent.action.SEND"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<dataandroid:mimeType="text/plain"/>
</intent-filter>
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value=".SampleChooserTargetService"/>
</activity>

它的原理是系统在响应SENDIntent时,会检测符合要求的Activity是否暴露给ChooserTargetService,如果暴露了则把ChooserTargetService方法onGetChooserTargets返回的ChooserTarget显示给用户,否则就不显示,只显示可分享的应用。


更多相关文章

  1. Android(安卓)Q (十六) Android(安卓)Q 行为变更:所有应用
  2. Android(安卓)QQ第三方登录 分享
  3. 分享Android(安卓)recovery updater-script进度条函数的使用经验
  4. Android(安卓)微信分享,无需那么麻烦。
  5. 使用内容提供器跨应用分享你的数据(1)
  6. Android原生分享功能的思考与实现
  7. 欢迎加入Java和Android架构知识星球
  8. 【Rayeager PX2分享】修改安卓开机后进入主屏幕流程分析
  9. 分享:Android(安卓)应用有哪些常见,浅谈常被利用的安全漏洞?

随机推荐

  1. 看见Java
  2. 掌握Mybatis动态映射,我可是下了功夫的
  3. 使用 Redis 实现一个轻量级的搜索引擎,牛
  4. 学习LINUX的第17天
  5. 使用 Docker 和 Traefik 搭建 WordPress(N
  6. C语言操作符
  7. js模块化操作及购物车案例
  8. IT人生 需要指引(三) 疯狂内卷 何去何从
  9. 初识 jQuery 与$()工厂函数的四种用法,四
  10. 曾经的下片神器回归!下载不限速,无需VIP也