传智播客揭秘Android(安卓)6.0之Direct Share
前言: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权限,并且指定IntentFilterAction为SERVICE_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对象时定义了直接分享对象的name,icon,extras,还有componentName,这里componentName就是当选择该直接分享对象时要启动的component
在该Demo中,就是分享界面的Activity
ComponentNamecomponentName=newComponentName(getPackageName(),
SendMessageActivity.class.getCanonicalName());
看到的界面也就是
2.2将Activity暴露给ChooserTargetService
只完成ChooserTargetService还不行,还必须将接收Actionandrod.intent.action.SEND的Activity暴露给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>
它的原理是系统在响应SEND的Intent时,会检测符合要求的Activity是否暴露给ChooserTargetService,如果暴露了则把ChooserTargetService方法onGetChooserTargets返回的ChooserTarget显示给用户,否则就不显示,只显示可分享的应用。
更多相关文章
- Android(安卓)Q (十六) Android(安卓)Q 行为变更:所有应用
- Android(安卓)QQ第三方登录 分享
- 分享Android(安卓)recovery updater-script进度条函数的使用经验
- Android(安卓)微信分享,无需那么麻烦。
- 使用内容提供器跨应用分享你的数据(1)
- Android原生分享功能的思考与实现
- 欢迎加入Java和Android架构知识星球
- 【Rayeager PX2分享】修改安卓开机后进入主屏幕流程分析
- 分享:Android(安卓)应用有哪些常见,浅谈常被利用的安全漏洞?