目前大部分Android App中都具有分享功能,用户可以将自己喜欢的文章分享到朋友圈或微博。Android系统本身具有分享功能,但是功能比较简单,通常无法满足需求,本文将介绍如何自定义分享功能。
首先介绍一下如何使用系统自带的分享功能。
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "喜欢我就点我吧!");
intent.putExtra(Intent.EXTRA_SUBJECT, "分享一下");
startActivity(Intent.createChooser(intent, "分享"));
以上代码就是常见的分享功能的代码,你会发现:虽然代码量小、实现简单,但是没办法自定义可用程序列表的样式和顺序,以及无法剔除掉我们想屏蔽的程序。总之,缺点多多。想要做一个高大上的分享功能,这时候就需要自定义分享功能。
自定义分享功能最核心的代码就是获取可用程序列表,我们可以使用一下代码来获取:
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, text);
PackageManager pm = App.getContext().getPackageManager();
final List<ResolveInfo> list = pm.queryIntentActivities(shareIntent, 0);
其中前三行代码与前面类似,构造好shareIntent之后,通过PackageManager的queryIntentActivities方法获取可用程序列表,然后我们就可以根据自己的需要来设计我们的分享功能样式,对可用程序进行自定义排序等操作。
最后重要的一步就是处理用户选择某个程序后的操作。在上一步我们已经获取到一个可用程序列表,也就是一个ResolveInfo的List,根据这个List我们就可以拿到用户选择的程序的Package Name和Activity Name,从而构造出跳转的Intent。
ActivityInfo activity = list.get(index).activityInfo;
ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
Intent newIntent = (Intent) shareIntent.clone();
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
newIntent.setComponent(name);
startActivity(newIntent);
其中关键就是需要给Intent添加FLAG_ACTIVITY_NEW_DOCUMENT和FLAG_ACTIVITY_MULTIPLE_TASK这两个Flag,否则你会发现点击后只能跳转到相应的应用,而无法跳转到对应的Activity。
总结
自定义分享功能最关键的代码就是获取可用程序列表以及对用户选择后点击事件处理逻辑。