Respostas:
A PendingIntent
é um token que você fornece a um aplicativo externo (por exemplo NotificationManager
, AlarmManager
Tela inicial AppWidgetManager
ou 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 Intent
com suas próprias permissões. Mas se você der um aplicativo externo a PendingIntent
, ele o executará Intent
usando a permissão do aplicativo.
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.
No meu caso, nenhuma das respostas acima nem a documentação oficial do google me ajudaram a entender o conceito de PendingIntent
classe.
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(...)
}
}
Por que PendingIntent é necessário? Eu estava pensando como
Intent
ouIntent
para o mesmo propósito.Por exemploIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
Se eu enviar bluetoothIntent
para 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 PendingIntent
o aplicativo receptor, não é necessário android.permission.BLUETOOTH_ADMIN
ativar o Bluetooth. Fonte .
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);
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
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 ().
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.
PendingIntent
é basicamente um objeto que envolve outro Intent
objeto. 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);
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.
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
PendingIntent
enviou a transmissão porque o aplicativo de música temREAD_EXTERNAL_STORAGE
permissão que o aplicativo de notificação não possui. A notificação é um serviço do sistema (portanto, é um aplicativo estrangeiro).
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.
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.