
本文详解 Android 应用通过 ACTION_SEND 接收外部分享链接的完整实现,涵盖 Intent Filter 配置、Activity 启动模式适配、数据提取与 UI 填充等关键步骤,解决“分享后 Activity 不触发”或“getIntent() 无法获取数据”的常见问题。
本文详解 android 应用通过 `action_send` 接收外部分享链接的完整实现,涵盖 intent filter 配置、activity 启动模式适配、数据提取与 ui 填充等关键步骤,解决“分享后 activity 不触发”或“`getintent()` 无法获取数据”的常见问题。
在 Android 中,当用户从浏览器、微信、短信等应用点击「分享」→「你的应用」时,系统会尝试以 Intent.ACTION_SEND 启动目标 Activity 并附带共享内容(如文本链接)。但许多开发者发现:Activity 未被拉起、getIntent() 返回空或 getStringExtra(Intent.EXTRA_TEXT) 为 null——这通常源于 Intent Filter 配置不当 或 Activity 启动模式/生命周期处理不严谨。
✅ 正确配置 Intent Filter
你原始的 AndroidManifest.xml 将 MAIN/LAUNCHER 与 SEND 混合在一个
- MAIN + LAUNCHER 必须独立存在(定义启动入口);
- SEND 过滤器必须单独声明,且需显式添加 BROWSABLE 类别(尤其对非 Launcher Activity 至关重要),否则系统可能因安全策略拒绝启动。
✅ 正确写法如下(请替换原
<!-- 必须保留:定义该 Activity 为可启动入口(即使非主屏) -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 单独声明 SEND 支持 -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <!-- 关键! -->
<data android:mimeType="text/plain" />
</intent-filter>? 提示:BROWSABLE 类别告诉系统“该 Activity 可通过外部链接或分享行为安全启动”,是解决“点击分享无响应”的最常见修复点。
✅ 在 Activity 中安全提取分享数据
onCreate() 中直接调用 getIntent() 是可行的,但需注意两点:
- Activity 可能被复用(例如从后台恢复),此时 getIntent() 返回的是首次启动的 Intent,而非最新分享的 Intent;
- URL 校验应使用更健壮的方式,避免仅依赖 Patterns.WEB_URL(它不覆盖所有合法 URL,如含中文路径或特殊端口)。
推荐改写为:
public class GeturlActivity extends AppCompatActivity {
private EditText urlInput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_geturl);
urlInput = findViewById(R.id.urlinput);
handleIntent(getIntent()); // 初始化时处理
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent); // 更新当前 Intent 引用
handleIntent(intent); // 处理新 Intent(如 Activity 已在栈中)
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEND.equals(intent.getAction())
&& "text/plain".equals(intent.getType())) {
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if (!TextUtils.isEmpty(sharedText) && isLikelyUrl(sharedText)) {
urlInput.setText(sharedText);
urlInput.setSelection(sharedText.length()); // 光标置末尾
}
}
}
// 更宽松的 URL 判定(兼容 http/https/www/无协议域名等)
private boolean isLikelyUrl(String input) {
if (TextUtils.isEmpty(input)) return false;
String trimmed = input.trim();
return trimmed.startsWith("http://") ||
trimmed.startsWith("https://") ||
trimmed.startsWith("www.") ||
android.util.Patterns.DOMAIN_NAME.matcher(trimmed).matches();
}
}⚠️ 关键注意事项
- Activity 启动模式:确保 GeturlActivity 在 AndroidManifest.xml 中未设置 android:launchMode="singleInstance" 或 singleTask 以外的限制;若设为 singleTop,务必重写 onNewIntent()(如上所示)。
- 权限与测试:无需额外权限;测试时建议使用 Chrome(地址栏 → 三点菜单 → 分享 → 选择你的 App),避免使用某些屏蔽分享的第三方应用。
- 多类型支持扩展:如需同时接收图片或 HTML,可追加 等,并在代码中分支处理 Intent.EXTRA_STREAM。
- 用户体验优化:可在 EditText 设置 android:inputType="textUri",并启用自动补全与链接高亮。
通过以上配置与代码重构,你的 Activity 将稳定响应外部分享事件,准确捕获并填充 URL,真正实现“一键粘贴分享链接”的流畅体验。










