O que é um PendingIntent do Android?

538

Eu sou um novato no Android. Li a documentação do Android, mas ainda preciso de mais esclarecimentos. Alguém pode me dizer o que exatamente PendingIntenté?

Rakesh
fonte

Respostas:

892

A PendingIntenté um token que você fornece a um aplicativo externo (por exemplo NotificationManager, AlarmManagerTela inicial AppWidgetManagerou outros aplicativos de terceiros), que permite que o aplicativo externo use as permissões do seu aplicativo para executar um trecho de código predefinido .

Se você der uma intenção ao aplicativo estrangeiro, ele executará o seu Intentcom suas próprias permissões. Mas se você der um aplicativo externo a PendingIntent, ele o executará Intentusando a permissão do aplicativo.

Lie Ryan
fonte
3
exceto as notificações, onde mais você viu o uso de pendingIntents? Eu acho que vi apenas notificações usá-lo ...
desenvolvedor Android
4
@ Johnny_D: significa o que diz, em geral, você deseja criar um Intent explícito cujo nome do componente é um nome absoluto que se refere inequivocamente a uma de suas próprias classes. Caso contrário, o Intent poderá ser enviado para outro aplicativo, o que poderá causar problemas, uma vez que o Intent estará em execução sob a permissão do seu aplicativo.
Lie Ryan
3
@LieRyan, a permissão do aplicativo aqui é a permissão que especificamos no manifesto? Por exemplo. Permissão de INTERNET?
Diffy
2
Essa "entrega de permissões" não é realmente ruim em termos de segurança? Eu tenho um aplicativo A que dei várias permissões. Então eu tenho o aplicativo B, que usa muito menos permissões. Se o aplicativo A puder iniciar algo no aplicativo B por meio de um PendingIntent (permitindo que todas as permissões de A estejam temporariamente em B), o B não poderá fazer o que puder nos bastidores com essa permissão? Por exemplo, A pode ter permissão para ler os contatos do usuário, mas B não. Se A enviar um PendingIntent para B, B poderá ler os contatos e fazer algo malicioso (como enviá-lo para um servidor).
Tiago
6
@Tiago: No seu caso, se um Aplicativo A privilegiado fornecer ao Aplicativo B uma intenção pendente para que B possa enviá-lo quando quiser ler os dados de um contato. É responsabilidade de A perguntar ao usuário quais dados de contato ele deseja fornecer a B e fornecer apenas esses dados a B. Intenção pendente é um mecanismo de escalonamento de privilégios e, como qualquer mecanismo de escalonamento de privilégios, com grande poder, é uma grande responsabilidade. É de responsabilidade do usuário decidir se o aplicativo B é confiável para os dados de contato que o usuário selecionou.
Lie Ryan
48

Intenção pendente é um token que você fornece a algum aplicativo para executar uma ação em nome dos seus aplicativos, independentemente de seu processo de inscrição estar ativo ou não.

Eu acho que a documentação é suficientemente detalhada: Documentos de intenção pendente .

Pense em casos de uso para Intenções Pendentes, como (Broadcasting Intents, planejando alarmes) e a documentação se tornará mais clara e significativa.

Samuh
fonte
Acho que Intent também é um tipo de token que damos a algum outro aplicativo para executar uma ação em nome do aplicativo. Portanto, a única diferença entre uma intenção pendente e uma intenção é a vida do processo de aplicação?
CopsOnRoad # 1 de
40

No meu caso, nenhuma das respostas acima nem a documentação oficial do google me ajudaram a entender o conceito de PendingIntentclasse.

E então encontrei este vídeo, Google I / O 2013, além da sessão Blue Dot . Neste vídeo, o ex-googler Jaikumar Ganesh explica o que PendingIntenté, e foi isso que me deu uma visão geral disso.

Abaixo está apenas a transcrição do vídeo acima ( das 15:24 ).

Então, qual é a intenção pendente?

É um token que o processo do seu aplicativo fornecerá ao processo de localização e o processo de localização o usará para ativar seu aplicativo quando ocorrer um evento de interesse . Portanto, isso basicamente significa que seu aplicativo em segundo plano nem sempre precisa estar em execução. Quando algo de interesse acontecer, nós o acordaremos. Isso economiza muita bateria.

Essa explicação fica mais clara com esse trecho de código (incluído no slide da sessão).

PendingIntent mIntent = PendingIntent.getService(...);

mLocationClient.requestLocationUpdates(locationRequest, mIntent);

public void onHandleIntent(Intent intent) {   
    String action = intent.getAction();   
    if (ACTION_LOCATION.equals(action)) {       
        Location location = intent.getParcelableExtra(...)   
    }
}
김준호
fonte
Concordo, é bastante simples e claro de entender. Mas isso não nos diz nada sobre a permissão que PendingIntent concede a outro aplicativo.
CopsOnRoad #
35

Por que PendingIntent é necessário? Eu estava pensando como

  1. Por que o próprio aplicativo de recebimento não pode criar o Intentou
  2. Por que não podemos usar um simples Intentpara o mesmo propósito.

Por exemploIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Se eu enviar bluetoothIntentpara outro aplicativo, que não tem permissão android.permission.BLUETOOTH_ADMIN, esse aplicativo de recebimento não poderá ativar o Bluetooth startActivity(bluetoothIntent).

A limitação é superada usando PendingIntent. Com PendingIntento aplicativo receptor, não é necessário android.permission.BLUETOOTH_ADMINativar o Bluetooth. Fonte .

Kiran
fonte
3
Seu exemplo bluetoothIntent é realmente valioso. Obrigado
Nicks
1
@Kiran - Se o aplicativo de recebimento pode ativar o Bluetooth (usando Pending Intent), por que o aplicativo não incluiu essa permissão no manifesto? É como se estivesse fazendo um aplicativo que pode fazer uma ligação, mas não estou incluindo a permissão CALL_PHONE, porque quero que outro aplicativo me envie uma Intenção Pendente para fazer essa ligação. É isso que você quer dizer?
CopsOnRoad
1
@CopsOnRoad O aplicativo de recebimento do PendingIntent pode ser um aplicativo geral que recebe qualquer solicitação e executa a solicitação em nome do solicitante. Seu papel é apenas um intermediário, portanto, não possui todas as permissões. Um exemplo desse tipo de aplicativo intermediário é o gerenciador de notificações, que pode iniciar qualquer aplicativo desejado a partir de uma notificação, sem possuir a permissão.
Xiao-Feng Li
21

Intenção pendente é uma intenção que começará em algum momento no futuro. A intenção normal começa imediatamente quando é passada para startActivity(Intent)ou StartService(Intent).

Arun P
fonte
13

Uma intenção futura que outros aplicativos possam usar.
E aqui está um exemplo para criar um:

Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
Oded Breiner
fonte
8
Voto negativo porque você realmente não explica o que é especial sobre uma intenção que é "futura" ou pode ser usada por outros aplicativos
Vic
@ WhereDatApp.com foi dito por Antoine de Saint Exupéry e traduzido por Lewis Galantière;)
Choletski 20/07/16
@Choletski obrigado, eu não sabia sobre a tradução 👍
Oded Breiner
13

ANÁLOGO TAXI

Intenção

As intenções geralmente são usadas para iniciar os Serviços. Por exemplo:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);

É como quando você pede um táxi:

Myself = CurrentClass
Taxi Driver = ServiceClass

Intenção pendente

Você precisará usar algo como isto:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);

Agora, esse terceiro iniciará o serviço agindo em seu nome. Uma analogia da vida real é a Uber ou a Lyft, ambas empresas de táxi.

Você envia uma solicitação de carona para o Uber / Lyft. Eles então vão em frente e ligam para um de seus motoristas em seu nome.

Portanto:

Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
ARCA
fonte
11

Um PendingIntent é um token que você fornece a outro aplicativo (por exemplo, Notification Manager, Alarm Manager ou outros aplicativos de terceiros), que permite que esse outro aplicativo use as permissões do seu aplicativo para executar um trecho de código predefinido. Para executar uma transmissão por uma intenção pendente, obtenha um PendingIntent via PendingIntent.getBroadcast (). Para executar uma atividade através de uma intenção pendente, você recebe a atividade via PendingIntent.getActivity ().

srinu
fonte
7

O que é uma intenção?

Um Intent é um comando específico no Android que permite enviar um comando ao sistema operacional Android para fazer algo específico. Pense nisso como uma ação que precisa ocorrer. Existem muitas ações que podem ser executadas, como enviar um email, anexar uma foto a um email ou até iniciar um aplicativo. O fluxo de trabalho lógico da criação de uma intenção é geralmente o seguinte: a. Crie a intenção b. Adicionar opções de intenção -> Ex. que tipo de intenção estamos enviando para o SO ou quaisquer atributos associados a essa intenção, como uma sequência de texto ou algo sendo transmitido juntamente com a intenção c. EXECUTAR a intenção

Exemplo da vida real: digamos que eu acordo de manhã e "PRETENDO" ir ao banheiro. Primeiro terei que pensar em ir ao banheiro, mas isso realmente não me leva ao banheiro. Terei que dizer ao meu cérebro para sair da cama primeiro, depois caminhar até o banheiro e depois soltar, depois lavar as mãos e depois limpar as mãos. Depois de saber para onde estou indo, ENVIO o comando para começar e meu corpo entra em ação.

O que são intenções pendentes?

Continuando com o exemplo da vida real, digamos que eu quero tomar banho, mas quero tomar banho depois que escovo os dentes e tomo café da manhã. Então eu sei que não vou tomar banho até pelo menos 30 a 40 minutos. Ainda tenho na cabeça que preciso preparar minhas roupas e depois subir as escadas de volta ao banheiro, depois me despir e depois tomar banho. No entanto, isso não acontecerá até 30 a 40 minutos. Agora tenho uma intenção PENDENTE de tomar banho. Está PENDENTE por 30-40 minutos.

Essa é praticamente a diferença entre uma intenção pendente e uma intenção regular. As intenções regulares podem ser criadas sem uma intenção pendente; no entanto, para criar uma intenção pendente, é necessário ter uma configuração de intenção regular primeiro.

Narendra Motwani
fonte
Gostei muito do simples e do exemplo, entendi muito bem com essas palavras.
Josema
Eu estou contente que este post é útil para você Josema
Narendra Motwani
isso é exatamente o mesmo que a explicação de Shakeeb Ayaz acima. quem copiou de quem? :)
likejudo
5

PendingIntenté basicamente um objeto que envolve outro Intentobjeto. Em seguida, ele pode ser passado para um aplicativo estrangeiro no qual você concede ao aplicativo o direito de executar a operação, ou seja, execute a intenção como se fosse executada a partir do processo do seu próprio aplicativo (mesma permissão e identidade). Por motivos de segurança, você sempre deve passar intenções explícitas para um PendingIntent em vez de estar implícito.

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);
Gowtham Subramaniam
fonte
4

Em um idioma fácil,
1. Uma descrição de uma ação de Intenção e Destino a ser executada. Primeiro você precisa criar uma intenção e depois passar uma classe java específica que deseja executar para a intenção.
2. Você pode chamar a classe java que é sua classe de ação de classe por PendingIntent.getActivity, PendingIntent.getActivities (Contexto, int, Intent [], int), PendingIntent.getBroadcast (Contexto, int, Intenção, int) e PendingIntent. getService (Contexto, int, Intenção, int); Aqui você vê o Intent que vem da etapa 1
3. Lembre-se de que ... Ao atribuir um PendingIntent a outro aplicativo, você concede o direito de executar a operação especificada.

Foi isso que aprendi depois de uma longa leitura.

Omar Faroque Anik
fonte
3

Um PendingIntent envolve a Intenção geral com um token que você fornece ao aplicativo estrangeiro para executar com sua permissão. Por exemplo:

A notificação do seu aplicativo de música não pode reproduzir / pausar a música se você não PendingIntentenviou a transmissão porque o aplicativo de música tem READ_EXTERNAL_STORAGEpermissão que o aplicativo de notificação não possui. A notificação é um serviço do sistema (portanto, é um aplicativo estrangeiro).

Ashish Rawat
fonte
ótimo exemplo!
Likejudo
2

Como o próprio nome sugere .. PendingIntent

você pode pendurá-lo (depois de algum tempo). Funciona como a outra intenção. É uma maneira de entregar sua tarefa a outro aplicativo para executar em seu nome.

Zar E Ahmer
fonte
1
Você pode dar um exemplo da vida real para isso?
CopsOnRoad
0

Uma intenção pendente especifica uma ação a ser tomada no futuro. Ele permite que você passe um Intent futuro para outro aplicativo e permita que o aplicativo execute esse Intent como se tivesse as mesmas permissões que o seu aplicativo, independentemente de seu aplicativo ainda estar presente quando o Intent for invocado.

É um token que você fornece a um aplicativo externo que permite que o aplicativo externo use as permissões do seu aplicativo para executar um trecho de código predefinido.

Se você der uma intenção ao aplicativo estrangeiro, e esse aplicativo enviar / difundir a intenção que você deu, eles executarão a intenção com suas próprias permissões. Porém, se você der ao Intent Pending Intent uma aplicação estrangeira criada usando sua própria permissão, esse aplicativo executará o Intent contido usando a permissão do seu aplicativo.

Para executar uma transmissão por uma intenção pendente, obtenha um PendingIntent via PendingIntent.getBroadcast (). Para executar uma atividade através de uma intenção pendente, você recebe a atividade via PendingIntent.getActivity ().

É uma ação de intenção que você deseja executar, mas posteriormente. Pense nisso colocando uma intenção no gelo. O motivo é necessário porque um Intent deve ser criado e iniciado a partir de um Contexto válido em seu aplicativo, mas há certos casos em que um não está disponível no momento em que você deseja executar a ação porque você está tecnicamente fora do contexto do aplicativo (o dois exemplos comuns estão lançando uma atividade de uma notificação ou um BroadcastReceiver.

Ao criar um PendingIntent que você deseja usar para iniciar, digamos, uma Atividade enquanto tiver o Contexto para fazê-lo (de dentro de outra Atividade ou Serviço), você pode passar esse objeto para algo externo para iniciar parte do seu aplicativo em seu nome.

Um PendingIntent fornece um meio para os aplicativos funcionarem, mesmo após a saída do processo. É importante observar que, mesmo depois que o aplicativo que criou o PendingIntent foi morto, esse Intent ainda pode ser executado. Uma descrição de uma ação de intenção e destino a ser executada com ela. As instâncias dessa classe são criadas com getActivity (Contexto, int, Intenção, int), getBroadcast (Contexto, int, Intenção, int), getService (Contexto, int, Intenção, int); o objeto retornado pode ser entregue a outros aplicativos para que eles possam executar a ação descrita em seu nome posteriormente.

Ao atribuir um PendingIntent a outro aplicativo, você concede o direito de executar a operação especificada como se o outro aplicativo fosse você mesmo (com as mesmas permissões e identidade). Dessa forma, você deve ter cuidado com a criação do PendingIntent: geralmente, por exemplo, o Intent base que você fornece terá o nome do componente explicitamente definido como um de seus próprios componentes, para garantir que ele seja finalmente enviado para lá e para nenhum outro lugar.

Um próprio PendingIntent é simplesmente uma referência a um token mantido pelo sistema que descreve os dados originais usados ​​para recuperá-lo. Isso significa que, mesmo que o processo de seu aplicativo proprietário seja interrompido, o próprio PendingIntent permanecerá utilizável de outros processos que lhe foram fornecidos. Se o aplicativo de criação recuperar novamente o mesmo tipo de PendingIntent (mesma operação, mesma ação de intenção, dados, categorias e componentes e mesmos sinalizadores), ele receberá um PendingIntent representando o mesmo token, se ainda for válido, e poderá chame assim cancel () para removê-lo.

vikseln
fonte
0

Intenção pendente é uma intenção que fornece toda a permissão para outro aplicativo para executar determinadas obras. Quando a atividade principal é destruída, o sistema operacional Android recupera a permissão.

Neimer
fonte