Как PendingIntent запускает намерение? - PullRequest
3 голосов
/ 08 апреля 2019

Например, у нас есть.

PendingIntent pi= PendingIntent.getActivity(context, requestCode, intent, FLAG);

Когда мы передаем наш объект pi другому классу или другому приложению, мы знаем, что намерение, заключенное в pi, будет инициировано позднее этим классом илиapp Right?

Я не понимаю, как это будет срабатывать?

Когда мы используем намерение запустить компонент вручную / немедленно, мы вызываем метод, соответствующий точному типу компонента (startActivity(intent), startService(intent)и т. д.) и, как я знаю, не существует такого метода, как startAnyComponent(intent).

Спасибо за вашу помощь.

PS Я думаю, что может быть простой способпроверяя объекты класса, когда намерение является явным

    Intent intent = new Intent(context, clazz):

В этом случае система может проверить, если clazz.isAssignableFrom(Service.class), и вызвать startService(intent).

Но для неявных намерений я не могу понять, что происходит.

1 Ответ

1 голос
/ 10 апреля 2019

Когда вы получаете PendingIntent, вы звоните либо getActivity(), getBroadcast() или getService().Когда создается PendingIntent, тип Intent включается в PendingIntent, чтобы он знал, является ли Intent для Activity, BroadcastReceiver или Service.

Позже, когда используется PendingIntent, делается вызов для получения IntentSender от PendingIntent.Чтобы на самом деле отправить Intent, вызывается IntentSender.sendIntent().IntentSender знает, как был создан PendingIntent, и поэтому знает, должен ли он использовать startActivity(), sendBroadcast() или startService() для правильной отправки Intent.

ПРИМЕЧАНИЕ:

Относительно вашего предположения о том, как это может работать, используя явные Intent s: это не может работать, потому что обычно приложение, которое фактически отправляет Intent, не имеет доступа к коду вашего приложенияи поэтому не может загружать ваши классы и не может использовать Class.isAssignableFrom(), чтобы определить тип Intent.

...