我意识到你问这个问题已经有一段时间了,Android 在这段时间里发生了很大的变化。我不确定您是否仍在寻找答案,但如果您还在寻找答案,您可以使用新Intent.createChooser()
方法执行此操作,该方法需要第三个PendingIntent.getIntentSender()
参数和一个BroadcastReceiver
. 这是你如何做到的:
Intent sendMailIntent = new Intent(Intent.ACTION_SEND);
sendMailIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.Share_Mail_Subject));
sendMailIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.Share_Mail_Text));
sendMailIntent.setType("text/plain");
Intent receiver = new Intent(this, BroadcastTest.class);
receiver.putExtra("test", "test");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT);
Intent chooser = Intent.createChooser(intent, "test", pendingIntent.getIntentSender());
startActivity(chooser);
请注意,我的receiver
意图的目标是BroadcastTest
扩展类BroadcastReceiver
。当用户从选择器中选择一个应用程序时,将调用onReceive
in 的方法,如果用户按下返回,则不会调用该方法。这样,您可以检查用户是否确实发送了电子邮件/短信/推文,或者他们是否回击。例如,如果这是我的课:BroadcastTest
onReceive
BroadcastTest
public class BroadcastTest extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
for (String key : intent.getExtras().keySet()) {
Log.d(getClass().getSimpleName(), " " + intent.getExtras().get(key));
}
}
}
ComponentInfo{org.telegram.messenger/org.telegram.ui.LaunchActivity}
如果用户选择了 Telegram 应用程序,您会在日志中看到类似的内容。使用 key android.intent.extra.CHOSEN_COMPONENT
,您应该能够找到用户选择的内容。另外,不要忘记BroadcastReceiver
在清单中声明。
另一种方法是使用PackageManager
并queryIntentActivities()
制作您自己的选择器。这将允许您以编程方式获取用户选择。该方法在此StackOverflow 帖子中进行了描述。
为了解决您关于 的问题startActivityForResult
,从 Android 的源代码中,您可以看到Activity
选择的选项Intents
根本没有setResult()
。因此,如果您尝试在 中捕获结果代码onActivityResult
,它将始终为 0 ( RESULT_CANCELED
)。因此,使用startActivityForResult
,您无法确定用户是选择了选项还是按下了返回。