Я понимаю, что это было довольно долгое время, так как вы задали этот вопрос и 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
в BroadcastTest
, и если пользователь нажимает назад, onReceive
не будет вызываться. Таким образом, вы можете проверить, действительно ли пользователь отправил электронную почту/sms/твит или если они нажали назад. Например, если это мой 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}
в журнале, если пользователь выбрал приложение Телеграмма. Используя ключ android.intent.extra.CHOSEN_COMPONENT
, вы сможете найти то, что выбрал пользователь. Кроме того, не забудьте объявить BroadcastReceiver
в вашем манифесте.
Другой способ - использовать PackageManager
и queryIntentActivities()
, чтобы сделать свой собственный выбор. Это позволит вам программно получить выбор пользователя. Метод описан в статье this StackOverflow.
Для решения вашего вопроса о startActivityForResult
, от источника Android, вы можете увидеть, что Activity
, который выбирает среди Intents
не setResult()
вообще. Таким образом, если вы попытаетесь поймать код результата в onActivityResult
, он всегда будет 0 (RESULT_CANCELED
). Таким образом, используя startActivityForResult
, вы не можете определить, выбрал ли пользователь параметр или нажал обратно.