使用 Intent.createChooser 唤起系統分享菜單,默認顯示所有支持 ACTION_SEND 的應用(Bluetooth、Email、Facebook、Gmail 等)。需求:添加自定義分享目標(如「複製鏈接」、「收藏」),或移除特定項目(如「Share Via Barcode」)。
通過 EXTRA_INITIAL_INTENTS 注入自定義 Intent,使其出現在分享列表頂部。
// 1. 基礎分享 Intent
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, "要分享的文本內容");
// 2. 自定義目標 Intent(如複製到剪切板)
Intent copyIntent = new Intent(Intent.ACTION_SEND);
copyIntent.setType("text/plain");
copyIntent.putExtra(Intent.EXTRA_TEXT, "要分享的文本內容");
copyIntent.setPackage("com.example.myapp"); // 指定自家 App
copyIntent.setClassName("com.example.myapp", "com.example.myapp.CopyShareActivity");
// 3. 構建 Chooser Intent
Intent chooserIntent = Intent.createChooser(shareIntent, "分享到");
// 4. 注入自定義 Intent 數組
Intent[] customIntents = {copyIntent};
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, customIntents);
// 5. 啟動
startActivity(chooserIntent);
無法直接從系統 Chooser 移除特定應用。Android 系統分享菜單由 ResolverActivity 動態構建,基於當前設備安裝的支持該 Action/Type 的所有應用,不提供過濾 API。
PackageManager.queryIntentActivities 獲取所有支持分享的應用信息。RecyclerView + Dialog/BottomSheetDialogFragment 展示自定義列表。Intent.createChooser 或直接 startActivity 目標 Intent。// 獲取所有分享目標
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
List resolveInfos = getPackageManager().queryIntentActivities(shareIntent, 0);
// 過濾並構建數據列表
List targets = new ArrayList<>();
for (ResolveInfo info : resolveInfos) {
String pkg = info.activityInfo.packageName;
if (!pkg.contains("barcode")) { // 過濾條件
targets.add(new ShareTarget(info.loadLabel(pm), pkg, info.activityInfo.name, info.icon));
}
}
// RecyclerView Adapter 中點擊事件
void onItemClick(ShareTarget target) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, shareText);
intent.setComponent(new ComponentName(target.packageName, target.className));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| createChooser + EXTRA_INITIAL_INTENTS | 代碼少、系統 UI 一致、自動處理權限 | 無法移除項、自定義項位置固定頂部 | 僅需添加自家業務入口 |
| 完全自定義 RecyclerView 列表 | 完全可控:增刪改查、自定義 UI、排序、圖標 | 開發量大、需適配各版本系統風格、維護成本高 | 需精確控制分享目標、品牌化 UI |
| 第三方庫 | 平衡開發效率與定製化 | 依賴第三方、體積增加 | 快速實現美觀分享面板 |