| page.title=Enviando o usuário para outro aplicativo |
| page.tags=intenções |
| helpoutsWidget=true |
| |
| trainingnavtop=true |
| |
| @jd:body |
| |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| |
| <h2>Esta lição ensina a</h2> |
| <ol> |
| <li><a href="#Build">Criar uma intenção implícita</a></li> |
| <li><a href="#Verify">Confirmar se há um aplicativo para receber a intenção</a></li> |
| <li><a href="#StartActivity">Iniciar uma atividade com uma intenção</a></li> |
| <li><a href="#AppChooser">Mostrar um selecionador de aplicativo</a></li> |
| </ol> |
| |
| <h2>Leia também</h2> |
| <ul> |
| <li><a href="{@docRoot}training/sharing/index.html">Compartilhando dados simples</a></li> |
| </ul> |
| |
| </div> |
| </div> |
| |
| <p>Uma das características mais importantes do Android é a habilidade do aplicativo enviar o usuário para outro aplicativo |
| com base em uma “ação” que gostaria de executar. Por exemplo, se |
| o aplicativo tiver o endereço de um negócio que você gostaria de mostrar em um mapa, não é necessário criar |
| uma atividade no aplicativo que mostre um mapa. Em vez disso, é possível criar uma solicitação para exibir o endereço |
| usando {@link android.content.Intent}. O sistema Android inicia um aplicativo que possa mostrar |
| o endereço em um mapa.</p> |
| |
| <p>Como explicado na primeira lição, <a href="{@docRoot}training/basics/firstapp/index.html">Criando |
| seu primeiro aplicativo</a>, use intenções para navegar entre atividades no aplicativo. Geralmente |
| isso é feito com <em>intenções explícitas</em>, que define o nome exato da classe do |
| componente que deseja iniciar. No entanto, quando desejar que outro aplicativo execute uma ação, como |
| “visualizar um mapa”, use uma <em>intenção implícita</em>.</p> |
| |
| <p>Esta lição mostra como criar uma intenção implícita para uma ação específica e como utilizá-la |
| para iniciar uma atividade que executa a ação em outro aplicativo.</p> |
| |
| |
| |
| <h2 id="Build">Criar uma intenção implícita</h2> |
| |
| <p>Intenções implícitas não declaram o nome da classe do componente a iniciar, mas declaram uma |
| ação a executar. A ação especifica o que deve ser feito, como <em>visualizar</em>, |
| <em>editar</em>, <em>enviar</em> ou <em>obter</em> algo. Geralmente, as intenções incluem dados associados |
| à ação, como o endereço que deseja visualizar ou a mensagem de email a ser enviada. |
| Dependendo da intenção que deseja criar, os dados podem ser {@link android.net.Uri}, |
| um dos outros tipos de dados ou a intenção pode não precisar de dado algum.</p> |
| |
| <p>Se seu dados forem um {@link android.net.Uri}, há um simples construtor {@link |
| android.content.Intent#Intent(String,Uri) Intent()} que pode ser usado para definir a ação e |
| os dados.</p> |
| |
| <p>Este é um exemplo de como criar uma intenção para iniciar uma chamada telefônica usando os dados {@link |
| android.net.Uri} para especificar o número de telefone:</p> |
| |
| <pre> |
| Uri number = Uri.parse("tel:5551234"); |
| Intent callIntent = new Intent(Intent.ACTION_DIAL, number); |
| </pre> |
| |
| <p>Quando o aplicativo invoca a intenção chamando {@link android.app.Activity#startActivity |
| startActivity()}, o aplicativo Telefone inicia uma chamada para o número especificado.</p> |
| |
| <p>Estas são algumas outras intenções e suas ações e pares de dados {@link android.net.Uri} |
| :</p> |
| |
| <ul> |
| <li>Visualizar um mapa: |
| <pre> |
| // Map point based on address |
| Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); |
| // Or map point based on latitude/longitude |
| // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level |
| Intent mapIntent = new Intent(Intent.ACTION_VIEW, location); |
| </pre> |
| </li> |
| <li>Visualizar uma página da Web: |
| <pre> |
| Uri webpage = Uri.parse("http://www.android.com"); |
| Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage); |
| </pre> |
| </li> |
| </ul> |
| |
| <p>Outros tipos de intenções implícitas exigem dados “extras” que fornecem diferentes tipos de dados, |
| como uma cadeia de caracteres. É possível adicionar um ou mais dados extras utilizando vários métodos {@link |
| android.content.Intent#putExtra(String,String) putExtra()}.</p> |
| |
| <p>Por padrão, o sistema determina o tipo MIME adequado que uma intenção exige com base nos dados |
| {@link android.net.Uri} incluídos. Se você não incluir um {@link android.net.Uri} na |
| intenção, sempre utilize {@link android.content.Intent#setType setType()} para especificar o tipo |
| de dado associado à intenção. Definir o tipo de MIME especifica melhor que tipos de |
| atividades receberão a intenção.</p> |
| |
| <p>Estas são mais algumas intenções que adicionam dados extra para especificar a intenção desejada:</p> |
| |
| <ul> |
| <li>Enviar um email com um anexo: |
| <pre> |
| Intent emailIntent = new Intent(Intent.ACTION_SEND); |
| // The intent does not have a URI, so declare the "text/plain" MIME type |
| emailIntent.setType(HTTP.PLAIN_TEXT_TYPE); |
| emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients |
| emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); |
| emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text"); |
| emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment")); |
| // You can also attach multiple items by passing an ArrayList of Uris |
| </pre> |
| </li> |
| <li>Criar um evento de calendário: |
| <pre> |
| Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI); |
| Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30); |
| Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30); |
| calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()); |
| calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()); |
| calendarIntent.putExtra(Events.TITLE, "Ninja class"); |
| calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo"); |
| </pre> |
| <p class="note"><strong>Observação:</strong> esta intenção para evento de calendário é suportada apenas com nível de API |
| 14 e superior.</p> |
| </li> |
| </ul> |
| |
| <p class="note"><strong>Observação:</strong> é importante definir seu {@link |
| android.content.Intent} para ser o mais específico possível. Por exemplo, se você deseja exibir uma imagem |
| usando a intenção {@link android.content.Intent#ACTION_VIEW}, especifique o tipo de MIME do |
| {@code image/*}. Isto evita que aplicativos que podem “exibir” outros tipos de dados (como um aplicativo de mapas) seja |
| acionado pela intenção.</p> |
| |
| |
| |
| <h2 id="Verify">Confirmar se há um aplicativo para receber a intenção</h2> |
| |
| <p>Embora a plataforma do Android garanta que determinadas intenções sejam resolvidas com um dos |
| aplicativos embutidos (como aplicativo de Telefone, Email ou Agenda), sempre inclua uma |
| etapa de confirmação antes de chamar uma intenção.</p> |
| |
| <p class="caution"><strong>Cuidado:</strong> se você invocar uma intenção e não houver aplicativo |
| disponível no dispositivo para tratar a intenção, o aplicativo falhará.</p> |
| |
| <p>Para confirmar se há atividade disponível para responder à intenção, chame {@link |
| android.content.pm.PackageManager#queryIntentActivities queryIntentActivities()} para obter uma lista |
| de atividades que podem tratar a {@link android.content.Intent}. Se o {@link |
| java.util.List} retornado não estiver vazio, a intenção poderá ser usada com segurança. Por exemplo:</p> |
| |
| <pre> |
| PackageManager packageManager = {@link android.content.Context#getPackageManager()}; |
| List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, |
| PackageManager.MATCH_DEFAULT_ONLY); |
| boolean isIntentSafe = activities.size() > 0; |
| </pre> |
| |
| <p>Se <code>isIntentSafe</code> for <code>true</code>, pelo menos um aplicativo responderá à |
| intenção. Se for <code>false</code>, não há aplicativos disponíveis para responder à intenção.</p> |
| |
| <p class="note"><strong>Observação:</strong> faça essa verificação quando a atividade |
| iniciar, caso seja necessário desabilitar a funcionalidade que usa a intenção antes do usuário tentar utilizá- |
| la. Caso conheça um aplicativo específico que possa lidar com a intenção, forneça um link para que o |
| usuário baixe o aplicativo (veja como <a href="{@docRoot}distribute/tools/promote/linking.html">vincular para seus produtos no Google |
| Play</a>).</p> |
| |
| |
| <h2 id="StartActivity">Iniciar uma atividade com uma intenção</h2> |
| |
| <div class="figure" style="width:200px;margin-top:-10px"> |
| <img src="{@docRoot}images/training/basics/intents-choice.png" alt="" /> |
| <p class="img-caption"><strong>Figura 1.</strong> Exemplo de diálogo de seleção que aparece |
| quando mais de um aplicativo pode tratar uma intenção.</p> |
| </div> |
| |
| <p>Quando tiver criado sua {@link android.content.Intent} e definido as informações extras, chame {@link |
| android.app.Activity#startActivity startActivity()} para enviá-la ao sistema. Se o sistema |
| identificar mais de uma atividade que pode tratar a intenção, um diálogo exibirá para que o usuário |
| selecione qual aplicativo usar, como mostrado na figura 1. Se houver apenas uma atividade para tratar a |
| intenção, o sistema a iniciará imediatamente.</p> |
| |
| <pre> |
| startActivity(intent); |
| </pre> |
| |
| <p>Este é um exemplo completo que mostra como criar uma intenção para exibir um mapa, confirmar se há |
| um aplicativo para tratar a intenção e iniciar:</p> |
| |
| <pre> |
| // Build the intent |
| Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); |
| Intent mapIntent = new Intent(Intent.ACTION_VIEW, location); |
| |
| // Verify it resolves |
| PackageManager packageManager = {@link android.content.Context#getPackageManager()}; |
| List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0); |
| boolean isIntentSafe = activities.size() > 0; |
| |
| // Start an activity if it's safe |
| if (isIntentSafe) { |
| startActivity(mapIntent); |
| } |
| </pre> |
| |
| |
| |
| <h2 id="AppChooser">Mostrar um selecionador de aplicativo</h2> |
| |
| <div class="figure" style="width:200px;margin-top:-10px"> |
| <img src="{@docRoot}images/training/basics/intent-chooser.png" alt="" /> |
| <p class="img-caption"><strong>Figura 2.</strong> Um diálogo seletor.</p> |
| </div> |
| |
| <p>Observe que ao iniciar uma atividade passando seu {@link android.content.Intent} para {@link |
| android.app.Activity#startActivity startActivity()} e quando há mais de um aplicativo que responde à |
| intenção, o usuário pode selecionar qual aplicativo usar por padrão (marcando uma caixa de seleção na parte inferior |
| do diálogo, veja a figura 1). Isto é bom quando se executa uma ação para qual o usuário |
| deseja usar o mesmo aplicativo todas as vezes, como quando abre uma página da Web (o usuário |
| geralmente usa apenas um navegador) ou para tirar fotos (o usuário prefere uma câmera).</p> |
| |
| <p>Contudo, se a ação a ser executada puder ser tratada por vários aplicativos e o usuário |
| preferir um aplicativo diferente a cada vez, como a ação “compartilhar” onde os usuários podem ter vários |
| aplicativos para compartilhar um item, você deve exibir explicitamente um diálogo seletor |
| conforme mostrado na figura 2. O diálogo seletor |
| força o usuário a selecionar qual aplicativo usar para a ação todas as vezes (o usuário não pode selecionar |
| um aplicativo padrão para a ação).</p> |
| |
| <p>Para exibir o seletor, crie uma {@link android.content.Intent} usando {@link |
| android.content.Intent#createChooser createChooser()} e transmita para {@link |
| android.app.Activity#startActivity startActivity()}. Por exemplo:</p> |
| |
| <pre> |
| Intent intent = new Intent(Intent.ACTION_SEND); |
| ... |
| |
| // Always use string resources for UI text. |
| // This says something like "Share this photo with" |
| String title = getResources().getString(R.string.chooser_title); |
| // Create intent to show chooser |
| Intent chooser = Intent.createChooser(intent, title); |
| |
| // Verify the intent will resolve to at least one activity |
| if (intent.resolveActivity(getPackageManager()) != null) { |
| startActivity(chooser); |
| } |
| </pre> |
| |
| <p>Isso exibe um diálogo com uma lista de aplicativos que respondem à intenção transmitida ao método {@link |
| android.content.Intent#createChooser createChooser()} e utiliza o texto fornecido como |
| título do diálogo.</p> |
| |
| |
| |