Professional Documents
Culture Documents
ANTERIORPRXIMA
Um projeto Android contm todos os arquivos que compem o cdigo fonte para o seu aplicativo Android. As ferramentas do SDK do Android se torna mais fcil para iniciar um novo projeto Android com um conjunto de diretrios de projeto padro e arquivos. Esta lio mostra como criar um novo projeto ou usando Eclipse (com o plugin ADT) ou usando as ferramentas do SDK a partir de uma linha de comando. Nota: Voc j deve ter o Android SDK instalado, e se voc estiver usando o Eclipse, voc tambm deve ter o plug-in ADTinstalado (verso 21.0.0 ou superior). Se voc no tiver esses, siga o guia de instalao do SDK Android antes de comear esta lio.
1. Clique em Novo
na barra de ferramentas.
2. Na janela que aparece, abra o Android pasta, selecione Projeto Aplicativo para Android e clique em Prxima .
o o o
Nome do aplicativo o nome do aplicativo que aparece para os usurios. Para este projeto, usar "My First App". Nome do Projeto o nome do diretrio do projeto eo nome visvel no Eclipse. Nome do pacote o namespace do pacote para seu aplicativo (seguindo as mesmas regras que os pacotes na linguagem de programao Java). Seu nome de pacote deve ser nico em todos os pacotes instalados no sistema Android. Por esta razo, geralmente melhor se voc usar um nome que comea com o nome de domnio reverso da sua organizao ou entidade editora.Para este projeto, voc pode usar algo como "com.example.myfirstapp". No entanto, voc no pode publicar seu aplicativo no Google Play usando o "com.example" namespace. Mnimo Necessrio SDK a verso menor do Android que o aplicativo suporta, indicado usando o nvel API . Para suportar tantos dispositivos quanto possvel, voc deve definir isso para o menor verso disponvel que permite que seu aplicativo para fornecer seu conjunto de recursos do ncleo. Se alguma caracterstica de sua aplicao s possvel em verses mais recentes do Android e no crtico para o conjunto de recursos do ncleo do aplicativo, voc pode ativar o recurso apenas quando executado nas verses que suportam (como discutido na Coadjuvante diferentes verses da plataforma ). Deixe este conjunto para o valor padro para este projeto. Alvo SDK indica a verso mais recente do Android (tambm usando o nvel API ) com o qual voc j testou com a sua aplicao. medida que novas verses do Android se tornam disponveis, voc deve testar o seu aplicativo na nova verso e atualizar este valor para corresponder ao nvel API mais recente, a fim de tirar proveito dos novos recursos da plataforma.
Com compilar a verso da plataforma com a qual voc ir compilar o seu aplicativo. Por padro, isso definido como a ltima verso do Android disponvel no seu SDK. (Deve ser o Android 4.1 ou superior, se voc no tem essa verso disponvel, voc deve instalar um usando o Gerenciador de SDK ). Voc ainda pode criar seu aplicativo para suportar as verses mais antigas, mas a definio da meta de construo para a verso mais recente permite ativar novos recursos e otimizar seu aplicativo para uma grande experincia de usurio nos dispositivos mais recentes. Tema especifica o Android estilo UI para aplicar para o seu aplicativo. Voc pode deixar isso sozinho.
Clique em Prxima . 4. Na prxima tela para configurar o projeto, deixe as selees padro e clique em Avanar . 5. A prxima tela pode ajudar a criar um cone do lanador para o seu aplicativo. Voc pode personalizar um cone de vrias maneiras ea ferramenta gera um cone para todas as densidades de tela. Antes de publicar o aplicativo, voc deve ter certeza que seu cone atende s especificaes definidas no Iconografia guia de design. Clique em Prxima . 6. Agora voc pode selecionar um modelo de atividade de que para comear a construir sua aplicao. Para este projeto, selecione BlankActivity e clique Prxima . 7. Deixe todos os detalhes para a atividade em seu estado padro e clique em Finish . Seu projeto Android agora est configurado com alguns arquivos padro e voc est pronto para comear a construir o app. Continue para a prxima lio .
2. Execute:
alvos lista android
Imprime uma lista das plataformas Android disponveis que voc baixou para o seu SDK. Encontrar a plataforma com a qual voc deseja compilar o seu aplicativo. Anote o ID de destino. Recomendamos que voc escolha a verso mais alto possvel. Voc ainda pode criar seu aplicativo para suportar as verses mais antigas, mas a definio da meta de construo para a verso mais recente permite que voc otimize o seu aplicativo para os dispositivos mais recentes. Se voc no v todos os alvos indicados, voc precisa instalar alguns usando a ferramenta Android SDK Manager. Veja Adicionando plataformas e pacotes . 3. Execute:
4. android projeto Criar - <target-id> alvo - o nome MyFirstApp \ 5. - Caminho <path-to-workspace> / MyFirstApp - MainActivity atividade \ 6. - Pacote com.example.myfirstapp
Substitua <target-id> com um ID da lista de alvos (a partir do passo anterior) e substituir <path-toworkspace> com o local em que voc deseja salvar seus projetos Android. Seu projeto Android agora est configurado com vrias configuraes padro e voc est pronto para comear a construir o app. Continue para a prxima lio . Dica: Adicione as plataforma-tools / , bem como as ferramentas / diretrio de seu PATH varivel de ambiente.
Se voc seguiu a lio anterior para criar um projeto Android, que inclui um conjunto padro de arquivos de origem "Hello World" que permitem que voc execute imediatamente o app. Como voc executar seu aplicativo depende de duas coisas: se voc tiver um dispositivo Android-powered real e se voc estiver usando o Eclipse. Esta lio mostra como instalar e executar o aplicativo em um dispositivo real e no emulador Android, e em ambos os casos, tanto com as ferramentas de linha de comando Eclipse ou. Antes de executar o aplicativo, voc deve estar ciente de alguns diretrios e arquivos no projeto Android:
AndroidManifest.xml
O arquivo de manifesto descreve as caractersticas fundamentais da aplicao e define cada um de seus componentes. Voc vai aprender sobre vrias declaraes nesse arquivo enquanto voc l mais aulas de treinamento.
Um dos elementos mais importantes seu manifesto deve incluir a <uses-sdk> elemento. Isso declara a compatibilidade do seu aplicativo com diferentes verses do Android usando o Android: minSdkVersion e android: targetSdkVersion atributos. Para o seu primeiro aplicativo, ele deve ser parecido com isto:
<Manifestar xmlns: android = "http://schemas.android.com/apk/res/android" ... > <Uses-sdk android: minSdkVersion = "8" android: targetSdkVersion = "17" /> ... </ Manifest>
Voc deve sempre definir o android: targetSdkVersion o mais alto possvel e testar seu aplicativo na verso plataforma correspondente. Para mais informaes, leia Apoiar diferentes verses da plataforma .
src /
Diretrio para as principais arquivos de origem do seu aplicativo. Por padro, ele inclui uma atividade de classe que executado quando o aplicativo iniciado usando o cone do aplicativo.
res /
Contm vrios sub-diretrios para recursos de aplicativos . Aqui esto apenas alguns exemplos:
drawable-hdpi /
Diretrio para objetos drawable (como bitmaps) que so projetados para telas de alta densidade (hdpi). Outros diretrios drawable contm ativos projetadas para outras densidades de tela.
layout /
Diretrio para outros arquivos XML que contm um conjunto de recursos, tais como cordas e definies de cores. Quando voc compilar e executar o aplicativo Android padro, o padro Activity classe inicia e carrega um arquivo de layout que diz "Ol Mundo". O resultado no nada excitante, mas importante que voc entenda como executar seu aplicativo antes de voc comear a desenvolver.
Na maioria dos dispositivos rodando Android 3.2 ou mais, voc pode encontrar a opo emConfiguraes> Aplicaes> Desenvolvimento . No Android 4.0 e mais recentes, em Configuraes> Opes do desenvolvedor . Nota: No Android 4.2 e mais recentes, as opes do desenvolvedor est oculta por padro. Para torn-lo disponvel, v para Configuraes> Sobre o telefone e
toque Construir nmero sete vezes. Retorne tela anterior para encontrar opes desenvolvedor . Para executar o aplicativo a partir de Eclipse: 1. Abra um dos arquivos do seu projeto e clique em Executar na barra de ferramentas.
2. No Executar como janela que aparece, selecione Aplicativo para Android e clique em OK . Eclipse instala o aplicativo em seu dispositivo conectado e comea-lo. Ou para executar o aplicativo a partir de uma linha de comando: 1. Altere os diretrios para a raiz do seu projeto Android e executar:
ant debug
2. Certifique-se que o Android SDK platform-tools / diretrio est includo no seu PATH varivel de ambiente, em seguida, execute:
adb install bin / MyFirstApp-debug.apk
3. No seu dispositivo, localize MyFirstActivity e abri-lo. assim que voc compilar e executar o seu aplicativo Android em um dispositivo! Para iniciar o desenvolvimento, continue para a prxima lio .
Executar no Emulator
Se voc estiver usando Eclipse ou a linha de comando, para executar seu aplicativo no emulador, voc precisa primeiro criar um dispositivo virtual Android (AVD). Um AVD uma configurao do dispositivo para o emulador Android que permite modelar diferentes dispositivos.
Para criar um AVD: 1. Lanar o Android Virtual Device Manager: a. Em Eclipse, clique em Android Virtual Device Manager a partir da barra de ferramentas.
2. No Gerenciador de dispositivos Android Virtual painel, clique emNovo . 3. Preencha os detalhes para o AVD. D-lhe um nome, um alvo plataforma, um tamanho de carto SD, e uma pele (HVGA o padro). 4. Clique em Criar AVD . 5. Selecione o novo AVD do Android Virtual Device Manager e clique em Iniciar . 6. Aps o emulador inicializado, desbloquear a tela do emulador. Para executar o aplicativo a partir de Eclipse: 1. Abra um dos arquivos do seu projeto e clique em Executar Eclipse instala o aplicativo no seu AVD e comea-lo. Ou para executar o aplicativo a partir da linha de comando: 1. Altere os diretrios para a raiz do seu projeto Android e executar:
ant debug
na barra de ferramentas.
2. No Executar como janela que aparece, selecione Aplicativo para Android e clique em OK .
2. Certifique-se que o Android SDK platform-tools / diretrio est includo no seu PATH varivel de ambiente, em seguida, execute:
adb install bin / MyFirstApp-debug.apk
3. No emulador, localize MyFirstActivity e abri-lo. assim que voc compilar e executar o seu aplicativo Android no emulador! Para iniciar o desenvolvimento, continue para a prxima lio .
A interface grfica do usurio para um aplicativo Android construdo usando uma hierarquia de Ver e ViewGroupobjetos. Visualizao de objetos so geralmente widgets de interface do usurio, como botes ou campos de texto eViewGroup objetos so vista containers invisveis que definem como os pontos de vista de crianas so colocadas para fora, tais como em uma grade ou uma lista vertical.
Android fornece um vocabulrio XML que corresponde s subclasses de Ver e ViewGroup para que voc possa definir a sua UI em XML usando uma hierarquia de elementos de interface do usurio.
Layouts alternativos
Declarando seu layout UI em XML em vez de cdigo em tempo de execuo til por vrias razes, mas especialmente importante para que voc possa criar diferentes layouts para diferentes tamanhos de tela. Por exemplo, voc pode criar duas verses de um layout e dizer ao sistema para usar um em telas "pequenas" e outra nas telas "grandes". Para mais informaes, consulte a classe sobreApoiar diferentes dispositivos .
Figura 1. Ilustrao de como ViewGroup objetos formam ramos no layout e conter outros Visualizao
de objetos.
Nesta lio, voc vai criar um layout em XML que inclui um campo de texto e um boto. Na aula seguinte, voc vai responder quando o boto pressionado, enviando o contedo do campo de texto para outra atividade.
LinearLayout um grupo de ponto de vista (uma subclasse de ViewGroup ), que estabelece os pontos de vista da criana em uma orientao vertical ou horizontal, conforme especificado pelo Android: orientao de atributos. O filho de um LinearLayout aparece na tela na ordem em que aparece no XML.
Os outros dois atributos, Android: layout_width e android: layout_height , so necessrios para todas as vises, a fim de especificar o seu tamanho. Porque o LinearLayout a viso raiz no layout, ele deve preencher a rea de tela inteira que est disponvel para o aplicativo, definindo a largura ea altura de "match_parent" . Este valor diz que a viso deve ampliar sua largura ou altura para corresponder a largura ou a altura da vista principal. Para mais informaes sobre propriedades de layout, consulte o layout de guia.
Isto fornece um identificador exclusivo para a exibio, que pode ser usado para fazer referncia ao objeto de seu cdigo do aplicativo, como para ler e manipular o objeto (voc ver isso na prxima lio). O sinal de arroba ( @ ) necessria quando voc est se referindo a qualquer objeto de recurso do XML. seguido pelo tipo de recurso ( ID neste caso), uma barra, em seguida, o nome do recurso ( edit_message ). The sinal de mais ( + ) antes de o tipo de recurso apenas necessrio quando voc est a definio de um ID recurso para pela primeira vez. Quando voc compilar o aplicativo, as ferramentas do SDK usar o nome de ID para criar uma nova ID do recurso em seu projeto gen / R.java arquivo que se refere
ao EditText elemento. Uma vez que a identificao de recurso declarado uma vez que desta forma, outras referncias para a identificao no necessrio o sinal de mais. Usando o sinal de mais necessrio somente quando a especificao de um novo ID de recurso e no precisava de recursos concretos, tais como cordas ou layouts. Veja o sidebox para obter mais informaes sobre objetos de recurso.
android: layout_width e android: layout_height
Em vez de usar tamanhos especficos para a largura e altura, o "wrap_content" especifica que o valor de exibio deve ser apenas to grande quanto necessrio para ajustar o contedo da vista. Se voc fosse ao invs de usar "match_parent" , ento o EditText elemento que enche o ecr, porque iria coincidir com o tamanho do pai LinearLayout . Para mais informaes, consulte o Layouts guia.
android: dica
Esta uma seqncia de caracteres padro para exibir quando o campo de texto est vazio. Em vez de usar uma string codificada como o valor, o "@ string / edit_message" valor refere-se a um recurso de seqncia definido em um arquivo separado. Porque isso se refere a um recurso concreto (e no apenas um identificador), ele no precisa do sinal. No entanto, porque voc no definiu o recurso de cadeia, no entanto, voc ver um erro do compilador em primeiro lugar. Voc vai corrigir isso na prxima seo, definindo a string. Nota: Este recurso corda tem o mesmo nome que o elemento ID: edit_message . No entanto, as referncias a recursos so sempre por escopo o tipo de recurso (como ID ou corda ), portanto, usando o mesmo nome no causar colises.
Para mais informaes sobre o uso de recursos de cadeia para localizar seu aplicativo para outros idiomas, consulte o Suporte de dispositivos diferentes classes.
Adicionar um boto
Agora adicione um <Button> ao layout, imediatamente aps a <EditText> elemento:
<Boto android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "@ string / button_send"
/>
A altura ea largura so definidos como "wrap_content" de modo que o boto to grande quanto necessrio para ajustar o texto do boto. Este boto no precisa do android: id atributo, porque ele no vai ser referenciada a partir do cdigo de atividade.
Figura 2. The EditText e Boto elementos tm suas larguras definidas para "wrap_content" .
Isso funciona bem para o boto, mas no to bem para o campo de texto, pois o usurio pode digitar algo mais.Ento, seria bom para preencher a largura da tela no utilizada com o campo de texto. Voc pode fazer isso dentro de um LinearLayout com o peso da propriedade, o que voc pode especificar usando o android: layout_weight atributo. O valor do peso um nmero que especifica a quantidade de espao restante cada vista deve consumir, em relao quantidade consumida por vises irmos. Isso funciona mais ou menos como a quantidade de ingredientes de uma receita da bebida: "2 partes de vodka, 1 parte de licor de caf" significa dois teros da bebida vodka. Por exemplo, se d uma exibir um peso de 2 e um outro com peso de 1, a soma 3, ento a primeira vista enche 2/3 do espao remanescente e o segundo ponto de vista enche o resto. Se voc adicionar um terceiro ponto de vista e dar-lhe um peso de 1, ento a primeira vista (com peso 2) agora fica 1/2 o espao restante, enquanto que os dois restantes se cada quarto. O peso padro para todos os pontos de vista 0, ento se voc especificar qualquer valor de peso maior que 0 a apenas um ponto de vista, ento, que a viso preenche o espao que permanece aps todas as opinies so dadas o espao de que necessitam. Assim, para preencher o espao restante em seu layout com o EditTextelemento, dar-lhe um peso de 1 e deixar o boto com nenhum peso.
<EditText android: layout_weight = "1" ... />
A fim de melhorar a eficincia da disposio quando se especificar o peso, deve alterar a largura daEditarTexto para ser zero (0DP). Definir a largura a zero porque melhora o desempenho esquema usando"wrap_content" como a largura requer que o sistema para calcular uma largura que em ltima anlise, porque o valor irrelevante de peso requer outro clculo largura para preencher o espao restante.
<EditText android: layout_weight = "1" android: layout_width = "0DP" ... />
Figura 3. The EditText Widget dado todo o peso layout, assim preenche o espao restante
no LinearLayout .
Aqui est como o seu arquivo de layout completo agora deve ser:
<? xml version = "1.0" encoding = "UTF-8" > <LinearLayout xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: Ferramentas = "http://schemas.android.com/tools" android: layout_width = "match_parent" android: layout_height = "match_parent" android: orientao = "horizontal" > <EditText android: id = "@ + id / edit_message" android: layout_weight = "1" android: layout_width = "0DP" android: layout_height = "wrap_content" android: dica = "@ string / edit_message" /> <Boto android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: text = "@ string / button_send" /> </ LinearLayout>
Este layout aplicado pelo padro Atividade classe que as ferramentas do SDK gerado quando voc criou o projeto, ento agora voc pode executar o aplicativo para ver os resultados:
na barra de ferramentas.
Ou a partir de uma linha de comando, altere os diretrios para a raiz do seu projeto Android e executar:
ant debug adb install bin / MyFirstApp - debug . apk
Continue para a prxima lio para aprender como voc pode responder a pressiona o boto, ler o contedo do campo de texto, iniciar outra atividade, e muito mais.
ANTERIORPRXIMA
Depois de completar a lio anterior , voc tem um aplicativo que mostra uma atividade (uma nica tela), com um campo de texto e um boto. Nesta lio, voc vai adicionar algum cdigo para MainActivity que inicia uma nova atividade quando o usurio clica no boto Enviar.
layout_width = "wrap_content" layout_height = "wrap_content" text = "@ string / button_send" onClick = "sendMessage" />
O android: onClick valor do atributo, "sendMessage" , o nome de um mtodo em sua atividade que o sistema de chamadas quando o usurio clica no boto. Abra o MainActivity classe (localizados no projeto src / directory) e adicionar o mtodo correspondente:
/ ** Chamado quando o usurio clica no boto Enviar * / pblico vazio sendMessage ( Ver vista ) { / / Faz alguma coisa em resposta ao boto }
Dica: Em Eclipse, pressione Ctrl + Shift + O para importar classes em falta (Cmd + Shift + S no Mac). Para que o sistema para corresponder a esse mtodo para o nome do mtodo dado para android: onClick , a assinatura deve ser exatamente como mostrado. Especificamente, o mtodo deve:
Seja pblica Ter um valor de retorno void Ter uma Viso como o nico parmetro (este ser o Ver que foi clicado)
Em seguida, voc vai preencher este mtodo para ler o contedo do campo de texto e entregar o texto para outra atividade.
Um contexto como seu primeiro parmetro ( este usado porque a atividade de classe uma subclasse de Contexto ) A classe do componente de aplicao para o qual o sistema deve entregar a Inteno (neste caso, a actividade que deve ser iniciado)
Nota: A referncia a DisplayMessageActivity ir gerar um erro se voc estiver usando uma IDE, como Eclipse, pois a classe ainda no existe. Ignore o erro de agora, voc vai criar a classe em breve. A inteno no s lhe permite iniciar outra atividade, mas pode levar um pacote de dados para a atividade tambm. Dentro dosendMessage () mtodo, use findViewById () para obter oEditText elemento e adicionar seu valor de texto com a inteno:
Inteno inteno = new Intent ( este , DisplayMessageActivity . classe ); EditText EDITTEXT = ( EditText ) findViewById ( R . id . edit_message ); Cordas mensagem = EDITTEXT . getText . () toString (); inteno . putExtra ( EXTRA_MESSAGE , mensagem );
Nota: Voc precisa agora instrues de importao paraandroid.content.Intent e android.widget.EditText .Voc vai definir o EXTRA_MESSAGE constante em um momento.
Uma Inteno pode levar uma coleo de vrios tipos de dados como pares de valores-chave chamado extras . O putExtra () mtodo leva o nome da chave no primeiro parmetro eo valor do segundo parmetro. Para que a prxima atividade para consultar os dados extras, voc deve definir a chave para o adicional de sua inteno atravs de um constante pblico. Ento adicionar o EXTRA_MESSAGE definio para o incio daMainActivity classe:
pblico classe MainActivity estende Activity { pblico final, static Cordas EXTRA_MESSAGE = ... }
"com.example.myfirstapp.MESSAGE" ;
Em geral, uma boa prtica para definir as chaves para extras inteno usando o nome do pacote do seu aplicativo como um prefixo. Isso garante que eles so nicos, no caso do seu aplicativo interage com outros apps.
Agora voc precisa criar o DisplayMessageActivity classe para que isso funcione.
Para criar uma nova atividade usando Eclipse: 1. Clique em Novo na barra de ferramentas.
2. Na janela que aparece, abra o Androidpasta e selecione Atividade Android .Clique em Prxima . 3. Selecione BlankActivity e clique Prxima. 4. Preencha os dados de atividade:
o o o o o o
Projeto : MyFirstApp Atividade Nome : DisplayMessageActivity Nome de layout : activity_display_message Ttulo : Minha mensagem Pai hierrquica : com.example.myfirstapp.MainActivity Tipo de navegao : Nenhum
Clique em Concluir . Se voc estiver usando uma IDE diferente ou as ferramentas de linha de comando, crie um novo arquivo chamado DisplayMessageActivity.java no projeto src / diretrio, ao lado do originalMainActivity.java arquivo. Abra o DisplayMessageActivity.java arquivo. Se voc usou o Eclipse para criar esta atividade:
A classe j inclui uma implementao do requerido onCreate () mtodo. H tambm uma implementao do onCreateOptionsMenu () mtodo, mas voc no vai precisar dele para este aplicativo para que voc possa remov-lo. H tambm uma implementao de onOptionsItemSelected () que lida com o comportamento para o bar da ao Up comportamento. Mantenha esta do jeito que est.
Porque o ActionBar APIs esto disponveis apenas na FAVO DE MEL (API nvel 11) e superior, voc deve adicionar uma condio ao redor do getActionBar () mtodo para verificar a verso da plataforma atual.Alm disso, voc deve adicionar o @ SuppressLint ("NewApi") tag ao onCreate () mtodo para evitarfiapos erros. O DisplayMessageActivity classe deve agora olhar como este:
pblico classe DisplayMessageActivity estende Activity {
@ SuppressLint ( "NewApi" ) @ Override protegido vazio onCreate ( Bundle savedInstanceState ) { Super . onCreate ( savedInstanceState ); setContentView ( R . disposio . activity_display_message ); / / Certifique-se de que estamos rodando em Honeycomb ou superior para utilizar APIs ActionBar se ( Construir . VERSO . SDK_INT > = Envergadura . VERSION_CODES . FAVO DE MEL ) { / / Mostra o boto na barra de ao. getActionBar . () setDisplayHomeAsUpEnabled ( verdadeiro ); } } @ Override pblico boolean interruptor caso android NavUtils retornar } retornar de } } onOptionsItemSelected ( MenuItem artigo ) ( artigo . getItemId ()) { . R . id . casa : . navigateUpFromSameTask ( este ); verdadeiro ; super . onOptionsItemSelected ( artigo ); {
Se voc usou uma IDE diferente de Eclipse, atualize seu DisplayMessageActivity classe com o cdigo acima. Todas as subclasses de Atividade deve implementar a onCreate () mtodo. O sistema chama isso ao criar uma nova instncia da atividade. Este mtodo o lugar onde voc deve definir o layout da atividade com osetContentView () mtodo e o lugar onde voc deve executar a configurao inicial para os componentes de atividade. Nota: Se voc estiver usando uma IDE diferente de Eclipse, seu projeto no contm oactivity_display_message layout que solicitado pelo setContentView () . Tudo bem, porque voc vai atualizar este mtodo mais tarde e no estar usando esse layout.
Adicion-lo ao manifesto
Todas as atividades devem ser declarados no seu arquivo de manifesto AndroidManifest.xml , usando um<activity> elemento. Quando voc usa as ferramentas do Eclipse para criar a atividade, ele cria uma entrada padro. Se voc estiver usando uma IDE diferente, voc precisa adicionar a entrada de manifestar-se. Deve olhar como este:
<Aplicao ... > ... <Atividade android: name = "com.example.myfirstapp.DisplayMessageActivity" android: label = "@ string / title_activity_display_message" android: parentActivityName = "com.example.myfirstapp.MainActivity" <Meta-dados android: name = "android.support.PARENT_ACTIVITY" android: valor = "com.example.myfirstapp.MainActivity" /> </ Atividade> </ Application>
>
O android: parentActivityName atributo declara o nome da atividade do pai esta atividade dentro da hierarquia lgica do aplicativo. O sistema utiliza esse valor para implementar comportamentos padro de navegao, tais como navegao Up no Android 4.1 (API nvel 16) e superior. Voc pode fornecer os mesmos comportamentos de navegao para as verses mais antigas do Android usando a Biblioteca de Apoio e adicionando o <meta-data> elemento, como mostrado aqui. Nota: O seu SDK Android j deve incluir a mais recente Biblioteca de suporte Android. includo com o pacote ADT, mas se voc estiver usando uma IDE diferente, voc deve t-lo instalado durante os Adicionando Plataformas e Pacotes passo. Ao usar os modelos em Eclipse, a Biblioteca de Apoio automaticamente adicionado ao seu projeto de aplicativo (voc pode ver o arquivo JAR da biblioteca listada em Dependncias Android ). Se voc no estiver usando o Eclipse, voc precisa adicionar manualmente a biblioteca para o seu projeto de seguir o guia para a criao da Biblioteca de Apoio , em seguida, voltar aqui. Se voc est desenvolvendo com o Eclipse, voc pode executar o aplicativo agora, mas no acontece muita coisa. Clicando no boto Enviar comea a segunda atividade, mas ele usa um layout padro "Ol, mundo", previsto pelo modelo. Em breve voc vai atualizar a atividade a vez exibir uma visualizao de texto personalizado, por isso, se voc estiver usando uma IDE diferente, no se preocupe que o aplicativo ainda no ir compilar.
Receba o Intent
Cada atividade invocado por um Intent , independentemente de como o usurio navegou l. Voc pode obter o Intent que comeou sua atividade chamando getIntent () e recuperar os dados contidos nele. No DisplayMessageActivity da classe onCreate () mtodo, se a inteno e extrair a mensagem entregue pelo MainActivity :
Inteno inteno = getIntent (); Cordas mensagem = inteno . getStringExtra ( MainActivity . EXTRA_MESSAGE );
Mostrar a Mensagem
Para mostrar a mensagem na tela, crie um TextView widget e definir o texto usando setText () . Em seguida, adicione o TextView como a viso de raiz o layout da atividade, passando-a para setContentView () . A completa onCreate () mtodo para DisplayMessageActivity agora se parece com isto:
/ / Pega a mensagem da inteno Inteno inteno = getIntent (); Cordas mensagem = inteno . getStringExtra ( MainActivity . EXTRA_MESSAGE ); / / Criar o ponto de vista do texto TextView textView = new TextView ( este ); textView . setTextSize ( 40 ); textView . setText ( mensagem ); / / Definir a viso de texto como o layout da atividade setContentView ( textView ); }
Agora voc pode executar o aplicativo. Quando se abre, digite uma mensagem no campo de texto, clique em Enviar, e aparece a mensagem na segunda atividade.
isso a, voc construiu seu primeiro aplicativo Android! Para saber mais sobre a criao de aplicativos para Android, continuar a seguir as aulas de formao bsica. A prxima turma est Gerenciando o Ciclo de Vida Atividade .
DEPENDNCIAS E PR-REQUISITOS
Como criar um projeto Android (vejaCriando um projeto Android )
EXPERIMENT-LO
Baixe o demo
ActivityLifecycle.zip
Como um usurio navega atravs, de, e de volta para o seu aplicativo, as Atividade instncias na sua transio aplicativo entre os diferentes estados do seu ciclo de vida. Por exemplo, quando sua atividade iniciado pela primeira vez, ele vem para o primeiro plano do sistema e recebe o foco do usurio. Durante este processo, o sistema Android chama uma srie de mtodos de ciclo de vida na atividade em que voc configurar a interface do usurio e outros componentes. Se o usurio executa uma ao que comea uma outra atividade ou muda para outro aplicativo, o sistema chama um outro conjunto de mtodos de ciclo de vida em sua atividade, uma vez que se move para o fundo (onde a atividade no mais visvel, mas a instncia e seu estado permanece intacta ). Dentro dos mtodos de retorno de chamada do ciclo de vida, voc pode declarar como sua atividade se comporta quando as folhas de usurios e re-entra na atividade. Por exemplo, se voc est construindo um player de vdeo streaming, voc pode pausar o vdeo e terminar a conexo de rede quando o usurio muda para outro aplicativo. Quando o usurio retorna, voc pode ligar-se rede e permitir que o usurio reiniciar o vdeo a partir do mesmo local. Esta classe explica importantes mtodos de retorno de chamada do ciclo de vida que cada Atividadeinstncia recebe e como voc pode us-los para que sua atividade faz o que o usurio espera e no consome recursos do sistema quando sua atividade no precisa delas.
Lies
Iniciar uma Atividade Aprenda o bsico sobre o ciclo de vida de atividade, como o usurio pode lanar o seu aplicativo, e como realizar a criao atividade bsica. Pausar e retomar uma atividade Saiba o que acontece quando sua atividade interrompida (parcialmente escondido) e retomado eo que voc deve fazer durante estas mudanas de estado. Interrupo e reincio de actividade Saiba o que acontece quando o usurio deixa completamente sua atividade e retorna a ele. Recriando uma Atividade Saiba o que acontece quando sua atividade destruda e como voc pode reconstruir o estado de atividade, quando necessrio.
EXPERIMENT-LO
Baixe o demo
ActivityLifecycle.zip
Ao contrrio de outros paradigmas de programao no qual os aplicativos so lanados com um main () mtodo, o sistema Android inicia cdigo em um Activity instncia invocando mtodos de retorno especficos que correspondem a fases especficas do seu ciclo de vida. H uma seqncia de mtodos de retorno de chamada que iniciam uma atividade e uma seqncia de mtodos de callback que derrubar uma atividade. Esta lio fornece uma viso geral dos mtodos de ciclo de vida mais importantes e mostra-lhe como lidar com a primeira chamada do ciclo de vida que cria uma nova instncia de sua atividade.
Figura 1. uma ilustrao simplificada do ciclo de vida Actividade expressa como uma pirmide passo. Isto mostra como, para cada callback usado para levar a atividade um passo em direo ao estado retomado no topo, h um mtodo de retorno que leva a atividade um passo para baixo. A atividade tambm pode retornar ao estado retomada a partir do estado de pausa e parou.
Dependendo da complexidade de sua atividade, voc provavelmente no precisa implementar todos os mtodos do ciclo de vida. No entanto, importante que voc entenda cada um e implementar as que asseguram o seu aplicativo se comporta da maneira como os usurios esperam. Implementar os seus mtodos de ciclo de vida de atividade corretamente garante que o seu aplicativo se comporta bem em vrias formas, incluindo que:
No falhar se o usurio recebe uma chamada de telefone ou muda para outro aplicativo enquanto estiver usando o aplicativo. No consome recursos valiosos do sistema, quando o usurio no est usando ativamente. No perder o progresso do usurio se ele deixar o seu aplicativo e retornar a ele em um momento posterior. No falhar ou perder o progresso do usurio quando a tela gira entre a orientao horizontal e vertical.
Como voc vai aprender as seguintes lies, h vrias situaes em que uma atividade transies entre diferentes estados que esto ilustrados na figura 1. No entanto, apenas trs destes estados pode ser esttico.Ou seja, a actividade pode existir em uma de apenas trs estados, por um perodo de tempo prolongado: Retomado Neste estado, a atividade est em primeiro plano eo usurio pode interagir com ele. (Tambm por vezes referido como o estado "running"). Pausada Neste estado, a atividade parcialmente obscurecida por outra atividade a outra atividade que est em primeiro plano semi-transparente ou no cobrir a tela inteira. A atividade fez uma pausa no recebe entrada do usurio e no pode executar qualquer cdigo. Parado Neste estado, a actividade est completamente oculto e no visvel para o utilizador, que considerado no fundo. Enquanto est parado, a instncia de atividade e toda a sua informao de estado, tais como variveis membro mantido, mas no pode executar qualquer cdigo. Os outros estados (criado e iniciado) so transitrios eo sistema se move rapidamente a partir deles para o prximo estado, chamando o prximo mtodo de retorno de chamada do ciclo de vida. Isto , depois de o sistema chama onCreate () , rapidamente chama onStart () , que rapidamente seguido por onResume ().
Isso tudo para o ciclo de vida atividade bsica. Agora voc vai comear a aprender sobre alguns dos comportamentos especficos do ciclo de vida.
Nota: Quando voc cria um novo projeto Android com as ferramentas do Android SDK, os arquivos de projeto padro incluem uma atividade de classe que declarada no manifesto com este filtro. Se tanto o MAIN ao ou LAUNCHER categoria no so declarados para uma de suas atividades, em seguida, o cone do aplicativo no aparecer na lista da tela principal de apps.
A maioria dos aplicativos incluem diversas atividades que permitem ao usurio realizar aes diferentes. Se uma atividade a principal atividade que criado quando o usurio clica no cone do aplicativo ou uma atividade diferente que seu aplicativo iniciado em resposta a uma ao do usurio, o sistema cria a cada nova instncia de Atividade chamando seu onCreate () mtodo. Voc deve implementar o onCreate () mtodo para executar a lgica de inicializao do aplicativo bsico que deve acontecer apenas uma vez durante toda a vida da atividade. Por exemplo, a implementao de onCreate () deve definir a interface do usurio e, possivelmente, instanciar algumas variveis de escopo de classe. Por exemplo, o exemplo a seguir do onCreate () mtodo mostra um cdigo que executa alguma configurao fundamental para a atividade, como declarar a interface do usurio (definido em um arquivo de layout XML), definindo as variveis de membro, e configurar algumas das UI.
TextView mTextView ;
/ / Definir o layout da interface de usurio para esta atividade / / O arquivo de layout definido no projeto res / layout / arquivo main_activity.xml setContentView ( R . disposio . main_activity ); / / Inicializar membro TextView para que possamos manipul-lo mais tarde mTextView = ( TextView ) findViewById ( R . id . text_message ); / / Certifique-se de que estamos rodando em Honeycomb ou superior para utilizar APIs ActionBar se ( Construir . VERSO . SDK_INT > = Envergadura . VERSION_CODES . FAVO DE MEL ) { / / Para a atividade principal, certifique-se o cone do aplicativo na barra de ao / / No se comporta como um boto ActionBar ActionBar = getActionBar (); ActionBar . setHomeButtonEnabled ( falso ); } }
Ateno: Usando o SDK_INT para evitar que o sistema mais velho de de executar novas APIs funciona dessa maneira no Android 2.0 (API nvel 5) e superior. As verses mais antigas vo encontrar uma exceo de tempo de execuo. Uma vez que o onCreate () termina a execuo, o sistema chama o ONSTART () e onResume () mtodos em rpida sucesso. Sua atividade no reside nos estados criados ou iniciados. Tecnicamente, a atividade se torna visvel para o usurio quando onStart () chamado, mas onResume () segue rapidamente ea atividade permanece no estado de retomada at que algo acontece para mudar isso, como quando uma chamada recebida, o usurio navega para outra atividade, ou a tela do dispositivo desliga-se. Nas outras lies que se seguem, voc vai ver como a outra start up mtodos, onStart () e onResume () , so teis durante o ciclo de vida de sua atividade quando usado para retomar a atividade dos interrompido ou parado estados. Nota: O onCreate () mtodo inclui um parmetro chamado savedInstanceState que discutido na ltima lio sobre Recriando uma atividade .
Figura 2. Outra ilustrao da estrutura de ciclo de vida de atividade, com nfase em trs principais callbacks que o sistema chama em seqncia ao criar uma nova instncia da atividade: OnCreate () , ONSTART () , e onResume (). Uma vez que essa seqncia de chamadas de retorno completo, a atividade atinge o estado Resumido onde os usurios podem interagir com a atividade at que se mudar para uma atividade diferente.
Destrua o Activity
Enquanto a primeira chamada do ciclo de vida da atividade onCreate () , seu ltimo retorno onDestroy () . O sistema chama este mtodo em sua atividade como o ltimo sinal de que o seu exemplo atividade est sendo completamente removido da memria do sistema. A maioria dos aplicativos no precisam implementar este mtodo, porque as referncias de classe locais so destrudos com a atividade e sua atividade deve executar a maioria de limpeza durante onPause () e onStop () . No entanto, se sua atividade inclui tpicos de fundo que voc criou durante onCreate () ou outros recursos de longa durao que poderiam vazar memria se no for devidamente fechado, voc deve mat-los durante onDestroy () .
@ Override pblico vazio onDestroy () { Super . onDestroy (); / / Sempre chamar a superclasse / / Stop mtodo de rastreamento que a atividade comeou durante onCreate () android . sistema operacional . Debug . stopMethodTracing (); }
Nota: O sistema chama onDestroy () depois que ele j chamou onPause () e onStop () em todas as situaes, exceto um: quando voc chamar acabamento () de dentro do onCreate () mtodo. Em alguns casos, como quando sua atividade funciona como um tomador de deciso temporria para lanar uma outra atividade, voc pode chamar de acabamento () de dentro do onCreate () para destruir a atividade. Neste caso, o sistema chama imediatamente onDestroy () sem chamar qualquer um dos outros mtodos de ciclo de vida.
EXPERIMENT-LO
Baixe o demo
ActivityLifecycle.zip
Durante a utilizao normal, app, a actividade do primeiro plano , por vezes, obstruda por outros componentes visuais que provocam a actividade de pausa . Por exemplo, quando uma atividade semi-transparente abre (como uma no estilo de um dilogo), a atividade anterior pausas. Enquanto a atividade ainda parcialmente visvel, mas atualmente no a atividade em foco, permanece interrompida. No entanto, uma vez que a atividade totalmente obstruda e no visvel, ele pra (que ser discutido na prxima lio). Como sua atividade entra no estado de pausa, o sistema chama o onPause () mtodo em sua atividade , o que permite parar aces em curso que no deve continuar durante a pausa (como um vdeo) ou persistir alguma informao que deve ser permanentemente salvo em caso o usurio continua a deixar seu aplicativo. Se o usurio retorna sua atividade a partir do estado de pausa, o sistema reinicia-lo e chama oonResume () mtodo. Nota: Quando a sua atividade recebe uma chamada para onPause () , pode ser uma indicao de que a atividade ser interrompida por um momento, o usurio pode retornar o foco sua atividade. No entanto, geralmente a primeira indicao de que o usurio est deixando sua atividade.
Figura 1. Quando uma atividade semi-transparente obscurece sua atividade, o sistema chama onPause () ea atividade de espera no estado de pausa (1). Se o usurio retorna atividade enquanto ele ainda est em pausa, o sistema chamaonResume () (2).
Pare de animaes ou outras aces em curso que poderiam consumir CPU. Confirmar as alteraes no salvas, mas apenas se os usurios esperam que essas mudanas sejam permanentemente salvo quando saem (como um projecto de e-mail). Liberar recursos do sistema, tais como receptores de radiodifuso, alas para sensores (como GPS), ou quaisquer recursos que possam afetar a vida til da bateria, enquanto sua atividade interrompida eo usurio no precisa delas.
Por exemplo, se o seu aplicativo usa a cmera , o onPause () mtodo um bom lugar para liber-lo.
@ Override pblico vazio onPause () { super . onPause (); / / Sempre chamar o mtodo da superclasse primeiro / / Solte a cmera, porque ns no precisamos dele quando fez uma pausa . / / e outras atividades pode precisar us-lo se ( mCamera ! = NULL ) { mCamera . lanamento () mCamera = nulo ; } }
Geralmente, voc deve no usar onPause () para armazenar as alteraes do usurio (como informaes pessoais inseridas em um formulrio) para armazenamento permanente. A nica vez que voc deve manter as alteraes do usurio para armazenamento permanente dentro onPause () quando voc tem certeza de que os usurios esperam que as alteraes sejam salvas automaticamente (como na elaborao de um e-mail). No entanto, deve-se evitar a realizao de trabalhos CPU-intensivo durante onPause () , como escrever para um banco de dados, porque pode atrasar a transio visvel para a prxima atividade (voc deveria executar operaes de desligamento de carga pesada durante onStop () ). Voc deve manter a quantidade de operaes realizadas no onPause () mtodo relativamente simples, a fim de permitir uma transio rpida para o prximo destino do usurio se sua atividade est realmente a ser interrompido. Nota: Quando a atividade estiver em pausa, o Activity instncia mantida residente na memria e recordase quando a atividade recomea. Voc no precisa re-inicializar os componentes que foram criados durante qualquer um dos mtodos de retorno de chamada que antecederam o estado retomado.
Esteja ciente de que o sistema chama este mtodo cada vez que sua atividade vem para o primeiro plano, inclusive quando ele criado pela primeira vez. Como tal, voc deve implementar onResume () para inicializar os componentes que liberam durante onPause () e executar outras inicializaes que devem ocorrer cada vez que a atividade entra no estado de Retomada (como comear animaes e inicializar os componentes utilizados apenas quando a atividade tem usurio Focus). O exemplo a seguir de onResume () a contrapartida do onPause () exemplo acima, ento ele inicializa a cmera que liberado quando a atividade interrompida.
@ Override pblico vazio onResume () { super . onResume (); / / Sempre chamar o mtodo da superclasse primeiro / / Pega o exemplo da cmera como a atividade alcana foco total do usurio se ( mCamera == nulo ) { initializeCamera (); / / local mtodo para lidar com cmera de inicializao } }
EXPERIMENT-LO
Baixe o demo
ActivityLifecycle.zip
Devidamente parar e reiniciar sua atividade um processo importante no ciclo de vida da atividade que garante que seus usurios percebem que seu aplicativo est sempre vivo e no perder o seu progresso. Existem alguns cenrios principais em que a sua actividade parado e reiniciado:
O usurio abre a janela e muda a partir de seu aplicativo para outro aplicativo Apps Recentes. A atividade em seu aplicativo que est atualmente em primeiro plano est parado. Se o usurio retorna para o seu aplicativo a partir do cone da tela inicial lanador ou a janela Apps recentes, a atividade reiniciado. O usurio executa uma ao em seu aplicativo que inicia uma nova atividade. A atividade atual interrompido quando a segunda atividade criada. Se o usurio pressiona a volta do boto, a primeira atividade reiniciado. O usurio recebe um telefonema durante o uso do aplicativo em seu telefone.
A Atividade classe fornece dois mtodos de ciclo de vida, onStop () e onRestart () , que permitem lidar especificamente como sua atividade alas de ser parado e reiniciado. Ao contrrio do estado de pausa, o que
identifica uma obstruo parcial da interface do usurio, o estado parado garante que a interface do usurio no mais visvel e foco do usurio est em uma atividade separada (ou um aplicativo totalmente separado). Nota: Como o sistema mantm sua atividade instncia na memria do sistema quando ele est parado, possvel que voc no precisa para implementar o onStop () e onRestart () (ou mesmo onStart ()mtodos de todo Para a maioria das atividades que so. relativamente simples, a atividade vai parar e reiniciar muito bem e talvez voc s precisa usar onPause () s aces em curso pausa e desligue a partir de recursos do sistema.
Figura 1. Quando o usurio deixa a sua atividade, o sistema chama onStop () para interromper a atividade (1). Se o utilizador retorna ao passo que a actividade est parado, o sistema chama onRestart () (2), rapidamente seguido poronStart () (3) e onResume () (4). Note-se que no importa o cenrio faz com que a atividade de parar, o sistema chama sempre onPause () antes de chamar onStop () .
. A URI para a nota para atualizar os valores , / / O mapa de nomes de colunas e novos valores para aplicar a eles. nulo , / / no so utilizados critrios SELECT. nulo / / No ONDE colunas so usadas. ); }
Quando sua atividade interrompida, a atividade objeto mantido residente na memria e recorda-se quando a atividade recomea. Voc no precisa re-inicializar os componentes que foram criados durante qualquer um dos mtodos de retorno de chamada que antecederam o estado retomado. O sistema tambm controla o estado atual de cada Ver no layout, por isso, se o usurio digitou texto em um EditText widget, que o contedo retido para que voc no precisa para salvar e restaurar. Nota: Mesmo que o sistema destri a sua actividade enquanto ele est parado, ele ainda mantm o estado das Exibir objetos (como o texto em um EditText ) em um Bundle (uma bolha de pares chave-valor) e restaura-se o usurio navega de volta para a mesma instncia da atividade (a prxima lio fala mais sobre o uso de um pacote para salvar outros dados do estado no caso de sua atividade destrudo e recriado).
Criar um dilogo aqui que solicita ao usurio habilitar GPS, e usar uma inteno / / com a ao android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS / / para levar o usurio para a tela de configuraes para permitir GPS ao clicar em "OK" } } @ Substituir protegido vazio onRestart () { super . onRestart (); / / Sempre chamar o mtodo da superclasse primeiro / / atividade a ser reiniciado a partir do estado parado }
Quando o sistema destri sua atividade, ele chama o onDestroy () mtodo para a sua atividade . Porque geralmente voc deve ter liberado a maioria de seus recursos com onStop () , no momento em que voc recebe uma chamada para onDestroy () , no h muito que a maioria dos aplicativos precisa fazer. Este mtodo a sua ltima chance para limpar recursos que poderiam levar a um vazamento de memria, ento voc deve ter certeza de que segmentos adicionais so destrudas e outras aes de longa durao, como mtodo de rastreamento tambm esto parados.
Existem algumas situaes em que sua atividade destruda devido a um comportamento normal aplicativo, como quando o usurio pressiona o Voltar boto ou sua atividade sinaliza sua prpria destruio, chamando acabamento () . O sistema tambm pode destruir a sua actividade se est atualmente parado e no foi usado em um longo perodo de tempo ou primeiro plano a atividade requer mais recursos para que o sistema deve desligar os processos de fundo para recuperar a memria. Quando sua atividade destruda porque o usurio pressionaVoltar ou a atividade termina em si, o conceito de que o sistema de Atividade exemplo, se foi para sempre, porque o comportamento indica que a atividade no mais necessrio. No entanto, se o sistema destri a atividade devido a restries do sistema (ao invs de um comportamento normal app), em seguida, embora o realAtividade exemplo, se foi, o sistema lembra que existia de modo que se o usurio navega de volta para ele, o sistema cria uma nova instncia da actividade, utilizando um conjunto de dados gravados, que descreve o estado da actividade quando foi destrudo. Os dados guardados que o sistema usa para restaurar o estado anterior chamado de "estado da instncia", e uma coleo de pares chave-valor armazenados em um Bundleobjeto. Ateno: Sua atividade ser destrudo e recriado cada vez que o usurio gira a tela. Quando a mudana de orientao da tela, o sistema destri e recria a atividade de plano porque a configurao da tela mudou e sua atividade pode precisar carregar recursos alternativos (tais como o layout).
Por padro, o sistema usa o Bundle estado da instncia para guardar informaes sobre cada Ver objeto em seu layout atividade (como o valor do texto inserido em um EditText objeto). Assim, se sua instncia de atividade destrudo e recriado, o estado do layout restaurado ao seu estado anterior com nenhum cdigo exigido por voc. No entanto, sua atividade pode ter mais informaes sobre o estado que voc gostaria de restaurar, como variveis membros que acompanham o progresso do usurio na atividade. Nota: Para que o sistema Android para restaurar o estado dos pontos de vista em sua atividade, cada vista deve ter uma identificao nica , fornecida pelo android: id atributo. Para salvar dados adicionais sobre o estado de atividade, voc deve substituir o onSaveInstanceState ()mtodo de callback. O sistema chama este mtodo quando o usurio est deixando sua atividade e passa oBundle objeto que ser salvo no caso em que sua atividade destruda de forma inesperada. Se o sistema deve recriar a instncia de atividade mais tarde, ele passa o mesmo Bundle objeto tanto para oonRestoreInstanceState () e onCreate () mtodos.
Figura 2. medida que o sistema comea a parar a sua atividade, ele chama onSaveInstanceState () (1), assim voc pode especificar os dados de estado adicionais que voc gostaria de salvar no caso da Atividade instncia deve ser recriada. Se a actividade destruda e o mesmo deve ser recriado exemplo, o sistema transfere os dados de estado definidos em (1) tanto o onCreate () mtodo (2) e o onRestoreInstanceState () mtodo (3).
Sempre chamar a superclasse para que ele possa salvar a exibio hierarquia estado de super . onSaveInstanceState ( savedInstanceState ); }
Ateno: Sempre chamar a implementao de superclasse onSaveInstanceState () para a implementao padro pode salvar o estado da hierarquia de vista.
Provavelmente inicializar os membros com valores padro para uma nova instncia } ... }
Em vez de restaurar o estado durante onCreate () voc pode optar por implementaronRestoreInstanceState () , que o sistema chama aps a onStart () mtodo. O sistema chamaonRestoreInstanceState () somente se houver um estado salvo para restaurar, assim voc no precisa verificar se o pacote nulo:
pblico vazio onRestoreInstanceState ( Bundle savedInstanceState ) { / / Sempre chamar a superclasse para que ele possa restaurar a vista hierarquia de super . onRestoreInstanceState ( savedInstanceState ); / / Restaurar estados membros da salva
Ateno: Sempre chamar a implementao de superclasse onRestoreInstanceState () para a implementao padro pode restaurar o estado da hierarquia de vista. Para saber mais sobre recriando sua atividade devido a um evento restart em tempo de execuo (como quando a tela gira), leia Tratamento de alteraes de tempo de execuo .
DEPENDNCIAS E PR-REQUISITOS
Android 1.6 ou superior
Dispositivos Android vm em muitos formas e tamanhos em todo o mundo. Com uma ampla gama de tipos de dispositivos, voc tem a oportunidade de alcanar uma audincia enorme com o seu aplicativo. Para ser to bem sucedido quanto possvel no Android, o aplicativo precisa se adaptar a vrias configuraes do dispositivo. Algumas das variaes importantes que voc deve considerar incluem lnguas diferentes tamanhos de tela e verses da plataforma Android. Esta classe ensina como usar os recursos de plataforma bsica que aproveitam recursos alternativos e outras caractersticas que o seu aplicativo pode fornecer uma experincia de usurio otimizada em uma variedade de dispositivos compatveis com o Android, usando um pacote nico aplicativo (APK).
Lies
Apoiar diferentes idiomas Aprenda a suportar vrios idiomas com recursos de cadeia alternativas. Apoiar telas diferentes Saiba como otimizar a experincia do usurio para diferentes tamanhos de tela e densidades. Apoiar diferentes verses da plataforma Aprenda a usar APIs disponveis em novas verses do Android, continuando a apoiar as verses mais antigas do Android.
sempre uma boa prtica para extrair seqncias de interface do usurio a partir de seu cdigo de aplicativo e mant-los em um arquivo externo. Android torna isso fcil com um diretrio de recursos em cada projeto Android.
Se voc criou seu projeto usando o Android SDK Tools (leiaCriando um projeto Android ), as ferramentas de criar um res /diretrio do nvel superior do projeto. Dentro desta res /diretrio so subdiretrios para vrios tipos de recursos. H tambm alguns arquivos padro, como res / valores / strings.xml , que detm os seus valores de seqncia.
Adicionar os valores de cadeia para cada localidade para o arquivo apropriado. Em tempo de execuo, o sistema Android utiliza o conjunto apropriado de recursos de cadeia com base na localidade atualmente definido para o dispositivo do usurio. Por exemplo, a seguir esto alguns arquivos de recursos de cordas diferentes para diferentes idiomas. Ingls (locale padro) / valores / strings.xml :
<? xml version = "1.0" encoding = "UTF-8" > <resources> <corda nome = "title" > My Application </ string> <corda nome = "hello_world" > Ol Mundo! </ string> < / resources>
Espanhol, / values-es/strings.xml :
<? xml version = "1.0" encoding = "UTF-8" > <resources> <corda nome = "title" > Mi Aplicacin </ string> <corda nome = "hello_world" > Hola Mundo! </ string> < / resources>
Francs, / values-fr/strings.xml :
<? xml version = "1.0" encoding = "UTF-8" > <resources> <corda nome = "title" > Aplicao Mon </ string> <corda nome = "hello_world" > Bonjour le monde! </ string> </ resources>
Nota: Voc pode usar o qualificador localidade (ou qualquer qualificador de configurao) em qualquer tipo de recurso, como se voc deseja fornecer verses localizadas do seu drawable bitmap. Para mais informaes, consulte Localizao .
Em outros arquivos XML, voc pode se referir a um recurso de seqncia com a sintaxe @ string / <string_name> sempre que o atributo XML aceita um valor string. Por exemplo:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" />
Android categoriza telas de dispositivos usando duas propriedades gerais: tamanho e densidade. Voc deve esperar que seu aplicativo ser instalado em dispositivos com telas que variam em tamanho e densidade. Como tal, voc deve incluir alguns recursos alternativos que otimizam a aparncia do seu aplicativo para diferentes tamanhos de tela e densidades.
H quatro tamanhos generalizadas: pequeno, normal, grande, extra grande E quatro densidades generalizadas: baixo (LDPI), mdio (MDPI), alto (hdpi), altas adicional (xhdpi)
Para declarar diferentes layouts e bitmaps que voc gostaria de usar para telas diferentes, voc deve colocar esses recursos alternativos em diretrios separados, semelhante forma como voc faz para cordas diferentes idiomas. Tambm estar ciente de que a orientao telas (paisagem ou retrato) considerado uma variao do tamanho da tela, tantos aplicativos devem revisar o layout para otimizar a experincia do usurio em cada orientao.
Os nomes de arquivo devem ter exatamente o mesmo, mas os seus contedos so diferentes, a fim de fornecer uma interface de usurio otimizada para o tamanho da tela correspondente. Basta consultar o arquivo de layout em seu aplicativo, como de costume:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }
O sistema carrega o arquivo de layout do diretrio de layout apropriado com base no tamanho da tela do dispositivo em que o aplicativo est sendo executado. Mais informaes sobre como Android seleciona o recurso apropriado disponvel no Recursos Fornecer guia. Como outro exemplo, aqui est um projecto com uma disposio alternativa para orientao paisagem:
MyProject / res / layout / main.xml layout da terra / main.xml
Por padro, o layout / main.xml arquivo usado para orientao retrato. Se voc deseja fornecer um layout especial para a paisagem, inclusive enquanto em telas grandes, ento voc precisa usar tanto o grande e terra qualificador:
MyProject / res / layout / # default (retrato) main.xml layout terra / # paisagem main.xml layout grande / # grande (retrato) main.xml layout de grande terra / # grande paisagem main.xml
Nota: Android 3.2 e acima suporta um mtodo avanado de definio de tamanhos de tela que permite que voc especifique os recursos para tamanhos de tela com base na largura e altura mnimas em termos de densidade de pixels independentes. Esta lio no cobre esta nova tcnica. Para mais informaes, leiaProjetando para mltiplas telas .
Voc sempre deve fornecer recursos de bitmap que esto devidamente dimensionadas para cada um dos baldes densidade generalizadas: baixa, mdia, alta e extra-alta densidade. Isso ajuda voc a alcanar uma boa qualidade grfica e desempenho em todas as densidades de tela. Para gerar estas imagens, voc deve comear com o recurso natural em formato vetorial e gerar as imagens para cada densidade utilizando a seguinte escala de tamanho:
xhdpi: 2,0
Isto significa que se voc gerar uma imagem de 200x200 para dispositivos xhdpi, voc deve gerar o mesmo recurso em 150x150 para hdpi, 100x100 para MDPI e 75x75 para dispositivos LDPI. Em seguida, coloque os arquivos no diretrio drawable recurso apropriado:
MyProject / res / drawable-xhdpi / awesomeimage.png drawable-hdpi / awesomeimage.png drawable-MDPI / awesomeimage.png drawable-LDPI / awesomeimage.png
Toda vez que voc referncia @ drawable / awesomeimage , o sistema seleciona o bitmap apropriado com base na densidade da tela. Nota: os recursos de baixa densidade (LDPI) nem sempre so necessrias. Quando voc fornece ativos hdpi, as escalas do sistema deles para baixo pela metade para caber corretamente telas LDPI. Para mais dicas e orientaes sobre a criao de cone ativos para sua aplicao, consulte o Guia de design de Iconografia .
Enquanto as verses mais recentes do Android, muitas vezes oferecem grande APIs para o seu aplicativo, voc deve continuar a apoiar as verses mais antigas do Android at mais dispositivos so atualizados. Esta lio mostra como tirar proveito dos mais recentes APIs enquanto continua a apoiar as verses mais antigas tambm.
O painel de verses da plataforma atualizado regularmente para mostrar a distribuio de dispositivos ativos rodando cada verso do Android, com base no nmero de dispositivos que visitam a loja Play Google. Geralmente, uma boa prtica para apoiar cerca de 90% dos dispositivos activos, enquanto que a segmentao do seu aplicativo para a verso mais recente. Dica: A fim de proporcionar os melhores recursos e funcionalidades atravs de vrias verses para Android, voc deve usar a Biblioteca de Apoio Android em seu aplicativo, que permite que voc use vrios recente APIs plataforma em verses mais antigas.
medida que novas verses do Android so liberados, alguns estilo e comportamentos podem mudar. Para permitir que o aplicativo para tirar vantagem dessas mudanas e garantir que seu aplicativo se encaixa no estilo de dispositivo de cada usurio, voc deve definir o targetSdkVersion valor para coincidir com a verso mais recente do Android disponvel.
Nota: Ao analisar os recursos XML, Android ignora atributos XML que no so suportadas pelo dispositivo atual. Ento voc pode usar com segurana os atributos XML que so apenas suportados por verses mais novas sem se preocupar com verses mais antigas quebrando quando se deparam com esse cdigo. Por exemplo, se voc definir o targetSdkVersion = "11" , o aplicativo inclui o ActionBar por padro no Android 3.0 e superior. Para, em seguida, adicionar itens de menu para a barra de ao, voc precisa definirandroid: showAsAction = "ifRoom" em seu menu de recursos XML. seguro fazer isso em um
arquivo XML cross-verso, pois as verses mais antigas do Android simplesmente ignorar o showAsAction atributo (ou seja, voc no precisa de uma verso separada em res/menu-v11 / ).
Para aplicar o seu prprio tema personalizado definido em / res / valores / styles.xml :
<Atividade android: theme = "@ estilo / CustomTheme" >
Para aplicar um tema para todo o seu aplicativo (todas as atividades), adicione o android: theme atributo <application> elemento:
<Aplicao android: theme = "@ estilo / CustomTheme" >
Para saber mais sobre a criao e utilizao de temas, leia os estilos e temas -guia.
DEPENDNCIAS E PR-REQUISITOS
Conhecimento bsico do ciclo de vida de atividades (ver Gesto do Ciclo de Vida de Atividade ) Experimente construir layouts XML
EXPERIMENT-LO
Baixe o exemplo
FragmentBasics.zip
Para criar uma interface de usurio dinmica e multi-painel no Android, voc precisa encapsular componentes de interface do usurio e comportamentos de atividade em mdulos que voc pode trocar para dentro e fora de suas atividades. Voc pode criar esses mdulos com o fragmento de classe, que se comporta mais ou menos como uma atividade aninhada que pode definir o seu prprio layout e gerir o seu prprio ciclo de vida. Quando um fragmento especifica o seu prprio layout, ele pode ser configurado em diferentes combinaes com outros fragmentos dentro de uma atividade para modificar a configurao do layout para diferentes tamanhos de tela (uma pequena tela pode mostrar um fragmento de cada vez, mas um grande ecr pode mostrar dois ou mais). Esta classe mostra como criar uma experincia de usurio dinmica com fragmentos e otimizar a experincia do usurio de seu aplicativo para dispositivos com diferentes tamanhos de tela, tudo ao mesmo tempo continuar a oferecer suporte a dispositivos que executam verses to antiga quanto o Android 1.6.
Lies
Usando Biblioteca de suporte a Android Aprenda a usar APIs quadro mais recente em verses anteriores do Android atravs do agrupamento Biblioteca de Apoio do Android em seu aplicativo. Criando um Fragmento Aprenda a construir um fragmento e implementar comportamentos bsicos dentro de seus mtodos de retorno de chamada. A construo de uma interface flexvel Aprenda a construir o seu aplicativo com layouts que proporcionam configuraes fragmento diferentes para diferentes telas. Comunicando-se com outros fragmentos Saiba como configurar os caminhos de comunicao a partir de um fragmento para a atividade e outros fragmentos.
O Android Support Library fornece um arquivo JAR com uma biblioteca API que permite que voc use alguns dos mais recentes APIs Android em seu aplicativo durante a execuo em verses anteriores do Android. Por exemplo, a biblioteca de suporte fornece uma verso do Fragmento APIs que voc pode usar no Android 1.6 (API nvel 4) e superior.
Esta lio mostra como configurar seu aplicativo para usar a biblioteca de suporte, a fim de usar os fragmentos para construir uma UI aplicativo dinmico.
Para configurar seu projeto: 1. Faa o download do pacote de suporte Android usando o Gerenciador de SDK. 2. Criar um libsdiretrio no nvel superior do seu projeto Android. 3. Localize o arquivo JAR para a biblioteca que deseja usar e copi-lo para aslibs / diretrio. Por exemplo, a biblioteca que suporta o nvel API 4 ou superior est localizado na <sdk> / extras/android/support/v4/android-support-v4.jar . 4. Atualize seu arquivo de manifesto para definir o nvel mnimo API para 4 eo nvel API alvo para a verso mais recente:
<Uses-sdk android: minSdkVersion = "4" android: targetSdkVersion = "15" />
A Biblioteca de suporte inclui uma variedade de APIs que ou foram adicionadas nas verses recentes do Android ou no existem na plataforma em tudo e simplesmente fornecer suporte adicional para voc no desenvolvimento de caractersticas especficas da aplicao. Voc pode encontrar toda a documentao de referncia da API para a biblioteca de suporte na plataforma docs em android.support.v4. * .
Ateno: Para ter certeza de que voc no usa acidentalmente novas APIs em uma verso mais antiga do sistema, ter certeza de que voc importar o Fragmento de classes e APIs relacionados doandroid.support.v4.app pacote:
importao android . apoio . v4 . aplicativo . Fragmento ; importao android . apoio . v4 . aplicativo . FragmentManager ; ...
Ao criar uma atividade que abriga fragmentos enquanto estiver usando a biblioteca de suporte, voc tambm deve se estender a FragmentActivity classe em vez da tradicional atividade de classe. Voc vai ver o cdigo de exemplo para o fragmento e atividade na prxima lio.
Criando um Fragmento
ANTERIORPRXIMA
EXPERIMENT-LO
Baixe o exemplo
FragmentBasics.zip
Voc pode pensar em um fragmento de uma seo modular de uma atividade, que tem o seu prprio ciclo de vida, recebe os seus prprios eventos de entrada, e que voc pode adicionar ou remover enquanto a atividade est em execuo (como uma espcie de "sub atividade", que voc pode reutilizar em diferentes atividades). Esta lio mostra como estender oFragmento classe usando a biblioteca de suporte para seu aplicativo continua sendo compatvel com dispositivos que executam verses do sistema to antigo quanto o Android 1.6. Nota: Se voc optar por outras razes que o nvel API mnimo o seu aplicativo exige 11 ou superior, voc no precisa usar a biblioteca de suporte e em vez disso pode usar o quadro construdo em Fragmento de classes e APIs relacionadas.Esteja ciente de que esta lio se concentra em usar as APIs da Biblioteca de Apoio, que utilizam uma assinatura pacote especfico e os nomes da API, por vezes, um pouco diferentes do que as verses includas na plataforma.
Uma diferena na criao de um fragmento que voc deve usar o onCreateView () callback para definir o layout. Na verdade, este o nico retorno que voc precisa, a fim de obter um fragmento de corrida. Por exemplo, aqui est um fragmento simples que especifica o seu prprio layout:
Inflar o layout para este fragmento retorno inflater . inflar ( R . disposio . article_view , recipiente , ); } }
falso
Assim como uma atividade, um fragmento deve implementar outros retornos de chamada do ciclo de vida que permitem que voc gerencie seu estado, uma vez que adicionado ou removido da atividade e como as transies de atividade entre seus estados de ciclo de vida. Por exemplo, quando a actividade do onPause () chamado de mtodo, quaisquer fragmentos na atividade tambm receber uma chamada para OnPause () . Mais informaes sobre o ciclo de vida fragmento e os mtodos de retorno de chamada est disponvel noFragments guia do desenvolvedor.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <fragment android:name="com.example.android.fragments.HeadlinesFragment" android:id="@+id/headlines_fragment" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.android.fragments.ArticleFragment"
Dica: Para obter mais informaes sobre a criao de layouts para diferentes tamanhos de tela, leia Apoiar diferentes tamanhos de tela . Eis como uma atividade aplica esta disposio:
import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news_articles); } }
Nota: Quando voc adicionar um fragmento de um layout de atividade, definindo o fragmento no arquivo XML de layout, voc no pode remover o fragmento em tempo de execuo. Se voc pretende trocar seus fragmentos dentro e para fora durante a interao do usurio, voc deve adicionar o fragmento atividade quando a atividade inicia pela primeira vez, como mostrado na prxima lio.
EXPERIMENT-LO
Baixe o exemplo
FragmentBasics.zip
Ao projetar seu aplicativo para suportar uma ampla gama de tamanhos de tela, voc pode reutilizar os seus fragmentos em diferentes configuraes de layout para otimizar a experincia do usurio com base no espao disponvel na tela. Por exemplo, em um dispositivo celular que poderia ser apropriada para exibir apenas um fragmento de cada vez para uma interface de usurio de painel nico. Por outro lado, voc pode querer definir fragmentos de lado a lado em um tablet que tem um tamanho de tela maior para exibir mais informaes para o usurio.
Figura 1. Dois fragmentos, exibidos em diferentes configuraes para a mesma atividade em diferentes tamanhos
de tela.Em uma tela grande, os dois fragmentos caber lado a lado, mas em um aparelho celular, apenas um fragmento se encaixa em um momento assim os fragmentos devem substituir um ao outro como o usurio navega.
O FragmentManager classe fornece mtodos que permitem que voc adicionar, remover e substituir fragmentos de uma atividade em tempo de execuo, a fim de criar uma experincia dinmica.
Dentro de sua atividade, chamada getSupportFragmentManager () para obter uma FragmentManagerusando o suporte APIs Library. Em seguida, chamar beginTransaction () para criar umFragmentTransaction e chamar add () para adicionar um fragmento. Voc pode executar a transao fragmento mltiplo para a atividade usando o mesmo FragmentTransaction. Quando voc estiver pronto para fazer as mudanas, voc deve chamar commit () . Por exemplo, aqui est como adicionar um fragmento ao layout anterior:
Verifique se a atividade est usando a verso de layout com / / o FrameLayout fragment_container se ( findViewById ( R . id . fragment_container ) ! = nulo ) / / / / / / se } / / Cria uma instncia de ExampleFragment HeadlinesFragment firstFragment = new HeadlinesFragment ();
No entanto, se estamos sendo restaurado a partir de um estado anterior, ento ns don 't precisa fazer nada e deve retornar ou ento ns pode acabar com fragmentos sobrepostos. ( savedInstanceState =! nulo ) { retorno ;
/ / Em caso esta atividade foi iniciada com instrues especiais de uma inteno, / / passar extras da inteno de o fragmento como argumentos firstFragment . setArguments ( getIntent (). getExtras ()); / / Adicionar o fragmento do 'fragment_container'
Porque o fragmento foi adicionado ao FrameLayout recipiente em tempo de execuo, em vez de defini-la no layout da atividade com um <fragment> elemento a atividade pode remover o fragmento e substitu-lo por um diferente.
Nota: Quando voc remover ou substituir um fragmento e adicione a transao para a pilha de volta, o fragmento que removida parado (no destrudo). Se o usurio navega de volta para restaurar o fragmento, ele reinicia. Se voc no adicionar a transao para a pilha de volta, em seguida, o fragmento destruda quando removidos ou substitudos. Exemplo de substituio de um fragmento com outro:
/ / Cria o fragmento e dar-lhe um argumento que especifica o artigo que deveria
Substitua o que est na vista fragment_container com este fragmento, / / e adicione a transao para a pilha de volta para que o usurio possa navegar de volta transao . substituir ( R . id . fragment_container , newFragment ); transao . addToBackStack ( nulo ); / / commit a transao transao . cometer ();
O addToBackStack () mtodo tem um parmetro de cadeia opcional que especifica um nome exclusivo para a transao. O nome no necessrio a menos que voc planeja para executar operaes de fragmentos avanados usando o FragmentManager.BackStackEntry APIs.
EXPERIMENT-LO
Baixe o exemplo
FragmentBasics.zip
A fim de reutilizar os componentes de interface fragmento, voc deve construir cada um como um componente completamente auto-suficiente, modular que define o seu prprio layout e comportamento. Depois de ter definido estes fragmentos reutilizveis, voc pode associ-los com uma atividade e conect-los com a lgica do aplicativo para realizar a interface de usurio composta em geral. Muitas vezes, voc vai querer um fragmento para se comunicar com o outro, por exemplo, para alterar o contedo com base em um evento de usurio. Toda a comunicao Fragment-to-fragmento feito atravs da atividade associada. Dois fragmentos nunca deve se comunicar diretamente.
Isso garante que a atividade recipiente implementou / / a interface de callback. Se no, ele lana uma
Agora, o fragmento pode entregar mensagens para a atividade chamando o onArticleSelected () mtodo (ou outros mtodos na interface) utilizando o mCallback instncia do OnHeadlineSelectedListenerinterface. Por exemplo, o mtodo a seguir no fragmento chamado quando o usurio clica em um item da lista. O fragmento usa a interface de retorno de chamada para entregar o caso para a atividade principal.
@ Override pblico vazio onListItemClick ( ListView l , { / / Envia o evento para a atividade de acolhimento mCallback . onArticleSelected ( posio ); }
Ver v ,
int posio ,
longa id )
Implementar a interface
Para receber retornos de chamada de eventos a partir do fragmento, a atividade que o hospeda deve implementar a interface definida na classe fragmento. Por exemplo, a seguinte actividade implementa a interface a partir do exemplo acima.
O usurio selecionou o ttulo de um artigo do HeadlinesFragment / / Faa algo aqui para exibir esse artigo } }
O usurio selecionou o ttulo de um artigo do HeadlinesFragment / / Faa algo aqui para exibir o que
Se o artigo frag est disponvel, estamos na disposio de dois painis ... / / Chama um mtodo no ArticleFragment para atualizar seu contedo articleFrag . updateArticleView ( posio ); mais { / / Caso contrrio, estamos em um layout de painel e deve trocar frags ... / / cria fragmento e dar-lhe um argumento para o selecionado
Substitua o que est na vista fragment_container com este fragmento, / / e adicione a transao para a pilha de volta para que o usurio possa navegar de volta transao . substituir ( R . id . fragment_container , newFragment ); transao . addToBackStack ( nulo ); / / commit a transao transao . cometer (); } } }
Salvando dados
COMEAR
DEPENDNCIAS E PR-REQUISITOS
Android 1.6 (API de nvel 4) ou superior Familiaridade com o Mapa colees de valores-chave Familiaridade com o arquivo I / O API Java Familiaridade com bancos de dados SQL
A maioria dos aplicativos Android precisa salvar os dados, mesmo que apenas para guardar informaes sobre o estado do aplicativo durante onPause () para que o progresso do usurio no est perdida. A maioria dos aplicativos no-triviais tambm precisa salvar as configuraes do usurio, e alguns aplicativos precisam gerenciar grandes quantidades de informaes em arquivos e bancos de dados. Esta classe apresenta as principais opes de armazenamento de dados em Android, incluindo:
Salvando pares de valores-chave de tipos de dados simples em um arquivo de preferncias compartilhada Salvando arquivos arbitrrios no sistema de arquivos do Android Utilizando bancos de dados gerenciados pelo SQLite
Lies
Salvando conjuntos de chaves-Valor Aprenda a usar um arquivo de preferncias compartilhada para armazenar pequenas quantidades de informao em pares chave-valor. Salvando arquivos Aprenda a salvar um arquivo bsico, como para armazenar longas seqncias de dados que geralmente so lidos em ordem. Salvando dados em bancos de dados SQL Aprenda a usar um banco de dados SQLite para ler e gravar dados estruturados.
Se voc tem um conjunto relativamente pequeno de valores-chave que voc deseja salvar, voc deve usar oSharedPreferences APIs. A SharedPreferences objeto aponta para um arquivo contendo pares de valores-chave e fornece mtodos simples de ler e escrever. CadaSharedPreferences arquivo gerenciado pelo framework e podem ser privados ou compartilhados. Esta classe mostra como usar o SharedPreferences APIs para armazenar e recuperar valores simples. Nota: Os SharedPreferences APIs so apenas para leitura e escrita de pares chave-valor e no se deve confundi-los com o Preference APIs, que ajudam a construir uma interface de usurio para as configuraes de aplicativos (embora eles usam SharedPreferences como a sua execuo para salvar as configuraes do aplicativo ).Para obter informaes sobre como usar o Preference APIs, consulte o Configuraes guia.
identificados pelo nome, o que voc especificar com o primeiro parmetro. Voc pode chamar isso de qualquer contexto de sua aplicao.
getPreferences () - Utilize este a partir de uma atividade , se voc precisa usar apenas um arquivo de
preferncia compartilhada para a atividade. Porque este recupera um arquivo de preferncia compartilhada padro que pertence atividade, voc no precisa fornecer um nome. Por exemplo, o seguinte cdigo executado dentro de um fragmento . Ele acessa o arquivo de preferncias compartilhada que identificado pela seqncia de recurso R.string.preference_file_key e abre-a usando o modo privado para que o arquivo est acessvel apenas por sua aplicao.
Context context = getActivity(); SharedPreferences sharedPref = context.getSharedPreferences( getString(R.string.preference_file_key), Context.MODE_PRIVATE);
Ao nomear seus arquivos de preferncias compartilhados, voc deve usar um nome que exclusivamente identificvel para o seu aplicativo, como "com.example.myapp.PREFERENCE_FILE_KEY" Alternativamente, se voc precisa apenas de um arquivo de preferncia compartilhada para sua atividade, voc pode usar os getPreferences () mtodo:
SharedPreferences sharedPref = getActivity . () getPreferences ( Context . MODE_PRIVATE );
Ateno: Se voc criar um arquivo de preferncias compartilhada com MODE_WORLD_READABLE ouMODE_WORLD_WRITEABLE , quaisquer outros aplicativos que sabem o identificador de arquivo pode acessar seus dados.
Passe as chaves e valores que voc quer escrever com mtodos como putInt () e putString () . Em seguida, chamar commit () para salvar as alteraes. Por exemplo:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putInt(getString(R.string.saved_high_score), newHighScore); editor.commit();
Salvando arquivos
ANTERIORPRXIMA
Android usa um sistema de arquivos que semelhante aos sistemas de arquivos baseados em disco em outras plataformas. Esta lio descreve como trabalhar com o sistema de arquivos do Android para ler e escrever arquivos com oarquivo APIs. Um arquivo objeto adequado para ler ou escrever grandes quantidades de dados em start-to-finish fim, sem pular ao redor. Por exemplo, bom para arquivos de imagem ou qualquer coisa trocados em uma rede. Esta lio mostra como executar tarefas relacionadas com o arquivo bsicas em seu aplicativo. A lio pressupe que voc esteja familiarizado com os conceitos bsicos do sistema de arquivos Linux e de entrada / sada APIs de arquivos padro emjava.io .
Todos os dispositivos Android tm duas reas de armazenamento de arquivos: "internos" e armazenamento "externo". Estes nomes vm desde os primeiros dias do Android, quando a maioria dos dispositivos oferecido construdo em memria no-voltil (memria interna), alm de um meio de armazenamento removvel, como um carto micro SD (armazenamento externo). Alguns dispositivos de dividir o espao de armazenamento permanente em parties e "internos" "externas", por isso mesmo, sem um meio de armazenamento removvel, h sempre dois espaos de armazenamento e do comportamento API o mesmo se o armazenamento externo removvel ou no. As listas a seguir um resumo dos fatos sobre cada espao de armazenamento. Armazenamento interno:
sempre disponvel. Arquivos salvos aqui so acessveis apenas por seu aplicativo, por padro. Quando o usurio desinstala o aplicativo, o sistema remove todos os arquivos do seu aplicativo de armazenamento interno.
O armazenamento interno melhor quando voc quer ter certeza de que nem o usurio nem outros aplicativos podem acessar seus arquivos. Armazenamento externo:
No sempre disponvel, porque o utilizador pode montar o armazenamento externo como armazenamento USB e, em alguns casos, remov-lo a partir do dispositivo. lido por todos, para que os arquivos salvos aqui pode ser lido fora de seu controle. Quando o usurio desinstala o aplicativo, o sistema remove os arquivos do seu aplicativo a partir daqui apenas se voc salv-los no diretrio de getExternalFilesDir () .
O armazenamento externo o melhor lugar para arquivos que no requerem restries de acesso e para arquivos que voc deseja compartilhar com outros aplicativos ou permitir que o usurio acesse com um computador. Dica: Embora os aplicativos so instalados na memria interna por padro, voc pode especificar oandroid: installLocation atributo no seu manifesto para que o seu aplicativo pode ser instalado em armazenamento externo. Usurios apreciam esta opo quando o tamanho da APK muito grande e eles tm um espao de armazenamento externo que maior do que o armazenamento interno. Para mais informaes, consulte App Install Location .
Ateno: Atualmente, todas as aplicaes tm a capacidade de ler o armazenamento externo sem uma permisso especial. No entanto, isso vai mudar em uma verso futura. Se seu aplicativo precisa ler o armazenamento externo (mas no escrever para ele), ento voc ter que declarar oREAD_EXTERNAL_STORAGE permisso. Para garantir que sua aplicao continua a funcionar como esperado, voc deve declarar essa permisso agora, antes que a alterao tenha efeito.
/>
No entanto, se o seu aplicativo usa o WRITE_EXTERNAL_STORAGE permisso, ento implicitamente tem permisso para ler o armazenamento externo tambm. Voc no precisa de nenhuma permisso para salvar arquivos no armazenamento interno. Sua aplicao sempre tem permisso para ler e gravar arquivos em seu diretrio de armazenamento interno.
aplicativo. No se esquea de apagar cada arquivo, uma vez que no mais necessrio e implementar um limite de tamanho razovel para a quantidade de memria que voc usa em um determinado momento, como 1MB. Se o sistema comea a ficar sem armazenamento, pode apagar seus arquivos de cache sem aviso prvio. Para criar um novo arquivo em um desses diretrios, voc pode usar o File () construtor, passando oarquivo fornecido por um dos mtodos acima que especifica o diretrio de armazenamento interno. Por exemplo:
Arquivo arquivo = new Arquivo ( contexto . getFilesDir (), nome );
Alternativamente, voc pode chamar openFileOutput () para obter um FileOutputStream que grava em um arquivo no seu diretrio interno. Por exemplo, aqui como escrever um texto para um arquivo:
Cordas filename = "myfile" ; cordas corda = "Ol
Ou, se voc precisa armazenar alguns arquivos, voc deve usar createTempFile () . Por exemplo, o seguinte mtodo extrai o nome do arquivo a partir de uma URL e cria um arquivo com esse nome no diretrio de cache interna do seu app:
Nota: o diretrio de armazenamento interno do seu aplicativo especificado pelo nome do pacote do aplicativo em um local especial do sistema de arquivos do Android. Tecnicamente, outro aplicativo pode ler seus arquivos internos, se voc definir o modo de arquivo a ser lido. No entanto, o outro aplicativo tambm precisa saber o nome do pacote de aplicativos e nomes de arquivos. Outros aplicativos no pode navegar pelos seus diretrios internos e no tem ler ou escrever acesso, a menos que voc defina explicitamente os arquivos a serem lidos ou escritos. Ento, enquanto voc usa MODE_PRIVATE para seus arquivos no armazenamento interno, eles nunca so acessveis a outros aplicativos.
Como o armazenamento externo pode no estar disponvel, por exemplo, quando o usurio tenha instalado o armazenamento para um PC ou tenha retirado o carto SD que fornece o armazenamento externo, voc deve sempre verificar se o volume est disponvel antes de acess-lo. Voc pode consultar o estado de armazenamento externo atravs do telefone getExternalStorageState () . Se o estado retornado igual aMEDIA_MOUNTED , ento voc pode ler e gravar seus arquivos. Por exemplo, os seguintes mtodos so teis para determinar a disponibilidade de armazenamento:
/ * Verifica se o armazenamento externo est disponvel para ler e escrever
Embora o armazenamento externo modificvel pelo usurio e outros aplicativos, existem duas categorias de arquivos que voc pode salvar aqui: Arquivos pblicos Os arquivos que deveriam estar disponveis livremente para outros aplicativos e para o usurio. Quando o usurio desinstala o aplicativo, esses arquivos devem permanecer disponveis para o usurio. Por exemplo, fotografias tiradas pelo seu aplicativo ou outros arquivos baixados.
Arquivos privados Arquivos que legitimamente pertencem a sua aplicao e deve ser suprimido quando o usurio desinstala o aplicativo. Embora esses arquivos so tecnicamente acessveis pelo usurio e outros aplicativos, pois eles esto no armazenamento externo, que so arquivos que realisticamente no fornecem valor para o usurio fora do seu aplicativo. Quando o usurio desinstala o aplicativo, o sistema exclui todos os arquivos no diretrio privado externo de seu aplicativo. Por exemplo, recursos adicionais baixado por seu aplicativo ou arquivos de mdia temporrios. Se voc deseja salvar os arquivos pblicos no armazenamento externo, use ogetExternalStoragePublicDirectory () mtodo para obter um arquivo que representa o diretrio apropriado no armazenamento externo. O mtodo recebe um argumento que especifica o tipo de arquivo que voc deseja salvar, para que possam ser organizadas de forma lgica com outros arquivos pblicos, comoDIRECTORY_MUSIC ou DIRECTORY_PICTURES . Por exemplo:
pblico Arquivo getAlbumStorageDir ( cordas albumName ) / / Pega o diretrio para imagem pblica do usurio {
Se voc deseja salvar os arquivos que so privados de seu aplicativo, voc pode adquirir o diretrio apropriado chamando getExternalFilesDir () e passando-lhe um nome que indica o tipo de diretrio que voc gostaria. Cada diretrio criado dessa forma adicionado a um diretrio pai que encapsula todos os arquivos externos de armazenamento do seu aplicativo, o que os exclui do sistema quando o usurio desinstala o aplicativo. Por exemplo, aqui est um mtodo que voc pode usar para criar um diretrio para um lbum de fotos individual:
pblico Arquivo getAlbumStorageDir ( Context contexto , Cordas albumName ) { / / Pega o diretrio para fotos privadas do aplicativo
Se nenhum dos nomes de sub-diretrios pr-definidos adequar seus arquivos, voc pode chamar em vezgetExternalFilesDir () e passar nulo . Isso retorna o diretrio raiz para o diretrio privado de seu aplicativo no armazenamento externo. Lembre-se que getExternalFilesDir () cria um diretrio dentro de um diretrio que excludo quando o usurio desinstala o aplicativo. Se os arquivos que voc est salvando devem permanecer disponveis depois que o usurio desinstala o app-como quando seu aplicativo uma cmera e que o usurio vai querer manter as fotos, voc deve usar getExternalStoragePublicDirectory () .
Independentemente de voc usar getExternalStoragePublicDirectory () para arquivos que so compartilhados ou getExternalFilesDir () para arquivos que so privadas de sua aplicao, importante que voc use nomes de diretrio fornecidas por constantes API como DIRECTORY_PICTURES . Estes nomes de diretrio garantir que os arquivos so tratados corretamente pelo sistema. Por exemplo, os arquivos salvos emDIRECTORY_RINGTONES so categorizados pelo scanner de mdia do sistema como ringtones em vez de msica.
Excluir um arquivo
Voc deve sempre apagar arquivos que voc no precisa mais. A maneira mais simples de apagar um arquivo ter a referncia de chamada arquivo aberto delete () em si mesmo.
myFile . excluir ();
Se o arquivo salvo na memria interna, voc tambm pode pedir o contexto para localizar e excluir um arquivo chamando deleteFile () :
myContext . deleteFile ( fileName );
Todos os arquivos salvos na memria interna Todos os arquivos que voc salvou no armazenamento externo usando getExternalFilesDir () .
No entanto, voc deve excluir manualmente todos os arquivos de cache criados com getCacheDir () em uma base regular e tambm apagar regularmente outros arquivos que voc no precisa mais.
Salvando dados em um banco de dados ideal para dados repetidos ou estruturada, tais como informaes de contato.Esta classe assume que voc est familiarizado com bancos de dados SQL em geral, e ajuda voc a comear com bancos de dados SQLite no Android. As APIs que voc vai precisar usar um banco de dados on Android esto disponveis noandroid.database.sqlite pacote.
pblico
FeedReaderContract ()
{}
Assim como os arquivos que voc salvar no dispositivo de armazenamento interno , Android armazena em seu banco de dados privado de espao em disco que est aplicativo associado. Seus dados esto seguros, porque, por padro nesta rea no acessvel a outros aplicativos. Um conjunto til de APIs est disponvel no SQLiteOpenHelper classe. Quando voc usa essa classe para obter referncias para o seu banco de dados, o sistema executa as operaes potencialmente longa durao de criar e atualizar o banco de dados somente quando necessrio, e no durante a inicializao do aplicativo . Tudo que voc precisa fazer chamar getWritableDatabase () ou getReadableDatabase () . Nota: Porque eles podem ser de longa durao, no se esquea que voc chama getWritableDatabase ()ou getReadableDatabase () em uma discusso de fundo, como com AsyncTask ou IntentService . Para usar SQLiteOpenHelper , criar uma subclasse que substitui o onCreate () , ONUPGRADE () e onOpen () mtodos de callback. Voc tambm pode querer implementar onDowngrade () , mas no necessrio. Por exemplo, aqui est uma implementao do SQLiteOpenHelper que usa alguns dos comandos mostrados acima:
pblico classe FeedReaderDbHelper extends SQLiteOpenHelper { / / Se voc alterar o esquema de banco de dados, voc deve incrementar o banco de dados
Esta base de dados apenas um cache de dados on-line, pelo que a sua poltica de atualizao / / para simplesmente descartar os dados e comear
Inserir a nova linha, retornando o valor da chave primria da nova linha longo newRowId ; newRowId = db . insert ( FeedEntry . TABLE_NAME , FeedEntry . COLUMN_NAME_NULLABLE , valores );
O primeiro argumento para insert () simplesmente o nome da tabela. O segundo argumento fornece o nome de uma coluna em que o quadro pode inserir NULL no caso em que os ContentValues est vazia (se voc, em vez este conjunto de "null" , ento o quadro no ir inserir uma linha quando no h valores).
SQLiteDatabase db = mDbHelper . getReadableDatabase (); / / Define uma projeo que especifica quais colunas do banco de dados / / voc vai realmente usar depois desta
Como voc quer que os resultados classificados na Cursor resultando Cordas sortOrder = FeedEntry . COLUMN_NAME_UPDATED + "DESC" ; Cursor c = db . consulta ( FeedEntry . TABLE_NAME , de projeo , a seleo , selectionArgs , nulo , nulo , sortOrder ); / / A tabela de consulta / / As colunas para retornar / / As colunas para a clusula WHERE / / Os valores para a clusula WHERE / / no do grupo de linhas / / no filtro por grupos de linhas / / A ordem de classificao
Olhar para uma linha no cursor, use um dos Cursor mtodos de movimentao, que voc deve sempre chamar antes de comear a leitura de valores. Geralmente, voc deve comear por vocao MoveToFirst () , que coloca a "posio de leitura" na primeira entrada nos resultados. Para cada linha, voc pode ler o valor de uma coluna, chamando um dos Cursor obter mtodos, como getString () ou getLong () . Para cada um dos mtodos get, voc deve passar a posio de ndice da coluna que voc deseja, que voc pode obter pelo telefonegetColumnIndex () ou getColumnIndexOrThrow () . Por exemplo:
cursor . MoveToFirst (); longo itemId = cursor . getLong ( cursor . getColumnIndexOrThrow ( FeedEntry . _ID ) );
DEPENDNCIAS E PR-REQUISITOS
Conhecimento bsico do ciclo de vida de atividades (consulte Gerenciando o Ciclo de Vida de Atividade )
Um aplicativo Android normalmente tem vrias atividades .Cada atividade apresenta uma interface de usurio que permite ao usurio realizar uma tarefa especfica (por exemplo, visualizar uma mapa ou tirar uma foto). Para levar o usurio a partir de uma atividade para outra, o aplicativo deve usar umIntent para definir a "inteno" de seu aplicativo para fazer alguma coisa. Quando voc passar um Intent para o sistema com um mtodo como startActivity () , o sistema utiliza ainteno de identificar e iniciar o componente aplicativo apropriado. Usando intenes ainda permite que seu aplicativo para iniciar uma atividade que est contido em um aplicativo separado. Uma Inteno pode ser explcita , a fim de iniciar um componente especfico (um especfico Atividade exemplo) ou implcita , a fim de iniciar qualquer componente que pode lidar com a ao pretendida (como "tirar uma foto"). Esta classe mostra como usar um Intent para executar algumas interaes bsicas com outros aplicativos, como iniciar outro aplicativo, receber um resultado de que o app, e fazer o seu aplicativo capaz de responder s intenes de outros apps.
Lies
Enviar o usurio para outro aplicativo Mostra como voc pode criar intenes implcitas para lanar outros aplicativos que podem executar uma ao. Conseguir um resultado de uma atividade Mostra como iniciar outra atividade e receber o resultado da atividade. Permitindo que outros aplicativos para iniciar sua atividade Mostra como fazer as atividades em seu aplicativo aberto para uso por outros aplicativos, definindo filtros inteno que declaram as intenes implcitas seu aplicativo aceita.
Um dos recursos mais importantes do Android a capacidade de um aplicativo para enviar o usurio para outro aplicativo baseado em uma "ao" que gostaria de realizar. Por exemplo, se seu aplicativo tem o endereo de um negcio que voc gostaria de mostrar em um mapa, voc no tem que construir uma atividade em seu aplicativo que mostra um mapa. Em vez disso, voc pode criar uma solicitao para exibir o endereo usando um Intent . O sistema Android, em seguida, comea um aplicativo que capaz de mostrar o endereo em um mapa. Como explicado na primeira classe, construir o seu primeiro aplicativo , voc deve usar as intenes para navegar entre as atividades em seu prprio aplicativo. Voc geralmente o fazem com uma inteno explcita , que define o nome da classe exata do componente que voc deseja iniciar. No entanto, quando voc quer ter um aplicativo separado executar uma ao, como "ver um mapa", voc deve usar uma inteno implcita . Esta lio mostra como criar uma inteno implcita de uma ao particular, e como us-lo para iniciar uma atividade que executa a ao em outro aplicativo.
Uri nmero = Uri . parse ( "tel: 5551234" ); Inteno callIntent = new Intent ( Inteno . ACTION_DIAL , nmero );
Quando seu aplicativo chama essa inteno, chamando startActivity () , o app do telefone inicia uma chamada para o nmero de telefone indicado. Aqui esto algumas outras intenes e sua ao e Uri pares de dados:
Ver um mapa:
/ / Ponto Mapa baseado no endereo Uri localizao = Uri . parse ( "geo:? 0,0 q = 1600 + + Amphitheatre Parkway, + montanha + View, Califrnia +" ); / / ou ponto de mapa com base na latitude / longitude / / Uri location = Uri.parse ("geo:? 37,422219, -122,08364 z = 14") / / z param zoom nvel Inteno mapIntent = new Intent ( Inteno . ACTION_VIEW , localizao );
Outros tipos de intenes implcitas exigem dados "extras" que oferecem diferentes tipos de dados, como uma string. Voc pode adicionar uma ou mais partes de dados adicionais utilizando as diversas putExtra ()mtodos. Por padro, o sistema determina o tipo MIME apropriado exigido por uma inteno baseada na Uri dados que est includo. Se voc no incluir um Uri na inteno, voc deve geralmente usar SetType () para especificar o tipo de dados associados com a inteno. Definindo o tipo MIME especifica ainda que os tipos de atividades devem receber a inteno. Aqui esto mais algumas intenes que agregam dados adicionais para especificar a ao desejada:
"Secret dojo" );
Nota: Esta inteno para um evento no calendrio compatvel apenas com nvel API 14 e superior.
Nota: importante que voc defina sua inteno de ser o mais especfico possvel. Por exemplo, se voc quiser exibir uma imagem usando o ACTION_VIEW inteno, voc deve especificar um tipo MIME de image / * . Isso evita que aplicativos que podem "ver" outros tipos de dados (como um aplicativo de mapa) de ser desencadeada pela inteno.
Se isIntentSafe verdadeiro , ento pelo menos um aplicativo ir responder inteno. Se for falsa , ento no h qualquer apps para lidar com o intento. Nota: Voc deve executar essa verificao quando sua atividade comea pela primeira vez em caso de necessidade de desativar o recurso que usa a inteno antes de o utilizador tentar us-lo. Se voc souber de um aplicativo especfico que pode lidar com a inteno, voc tambm pode fornecer um link para o usurio baixar o aplicativo (veja como a ligao para o seu produto no Google Play ).
Figura 1. Exemplo de caixa de dilogo de seleo que aparece quando mais de um aplicativo pode lidar com uma inteno.
Depois de ter criado sua Inteno e definir a informao extra, chamarstartActivity () para envi-lo para o sistema. Se o sistema identifica mais de uma atividade que pode lidar com a inteno, ele exibe uma caixa de dilogo para que o usurio selecione qual aplicativo usar, como mostrado na figura 1. Se houver apenas uma actividade que manipula a inteno, o sistema comea imediatamente.
startActivity ( inteno );
Aqui est um exemplo completo que mostra como criar uma inteno de ver um mapa, verifique se existe um app para lidar com a inteno, ento inicie-o:
/ / Construir o
Verific-lo
Figura 2. Exemplo de caixa de dilogo selecionador que aparece quando voc usa createChooser () para garantir que o usurio sempre mostrada uma lista de aplicativos que respondem a sua inteno.
Observe que quando voc iniciar uma atividade, passando a sua Intenopara startActivity () e h mais de um aplicativo que responde inteno, o usurio pode selecionar qual aplicativo usar como padro (selecionando a caixa de seleo na parte inferior da caixa de dilogo; ver figura 1). Isso bom quando executar uma ao para que o usurio geralmente quer usar o mesmo aplicativo de cada vez, como quando se abre uma pgina web (usurios provavelmente usar apenas um navegador da Web) ou tirar uma foto (os usurios provavelmente preferem uma cmera).No entanto, se a ao a ser executada pode ser tratado por vrios aplicativos eo usurio pode preferir um aplicativo diferente de cada vez, como uma ao de "share", para o qual os usurios podem ter vrias aplicaes atravs do qual eles podem compartilhar um item, voc deve mostrar explicitamente um dilogo selecionador, o que obriga o usurio selecione qual aplicativo usar para a ao de cada vez (o usurio no pode selecionar um aplicativo padro para a ao).
Para mostrar o seletor, criar um Intent usando createChooser () e pass-lo para startActivity () . Por exemplo:
Inteno inteno = ... new Intent ( Inteno . ACTION_SEND );
/ / Sempre usar os recursos de cadeia para texto UI. Isso diz algo como "Compartilhe essa foto com" Cordas title = getResources (). getText ( R . corda . chooser_title ); / / Criar e iniciar o seletor de Inteno chooser = Inteno . createChooser ( inteno , ttulo ); startActivity ( seletor );
Isso exibe uma caixa de dilogo com uma lista de aplicativos que respondem inteno passado para ocreateChooser () mtodo e usa o texto fornecido como o ttulo de dilogo.
Iniciar outra atividade no tem que ser s de ida. Voc tambm pode iniciar uma outra atividade e receber um resultado de volta. Para receber o resultado, liguestartActivityForResult () (em vez de startActivity ()). Por exemplo, seu aplicativo pode iniciar um aplicativo da cmera e receber a foto capturada como resultado. Ou, voc pode iniciar o aplicativo de pessoas para que o usurio selecione um contato e voc receber os dados de contato como resultado. Naturalmente, a actividade que responde deve ser concebida para retornar um resultado. Quando isso acontecer, ele envia o resultado como outro Inteno objeto. Sua atividade recebe no onActivityResult ()callback. Nota: Voc pode usar as intenes explcitas ou implcitas quando voc chamar startActivityForResult () . Ao iniciar uma de suas prprias atividades para receber um resultado, voc deve usar uma inteno explcita de assegurar que voc receba o resultado esperado.
Comece o Activity
No h nada especial sobre a Inteno objeto que voc usa quando se inicia uma atividade para um resultado, mas voc precisa passar um argumento inteiro adicional para o startActivityForResult () mtodo.
O argumento inteiro um "cdigo de pedido", que identifica o seu pedido. Quando voc recebe o resultadoInteno , o callback fornece o mesmo cdigo de pedido para que seu aplicativo pode identificar corretamente o resultado e determinar a forma de lidar com isso. Por exemplo, aqui como comear uma atividade que permite ao usurio escolher um contato:
static final, int PICK_CONTACT_REQUEST = 1 ; / / A pedido
Receber o resultado
Quando o usurio feito com a atividade e retorna posteriormente, o sistema chama de sua atividadeonActivityResult () mtodo. Este mtodo inclui trs argumentos:
O cdigo de pedido passado para startActivityForResult () . Um cdigo de resultado especificado pela segunda atividade. Isto tanto RESULT_OK se a operao foi bem sucedida ou RESULT_CANCELED se o usurio desistiu ou a operao falhou por algum motivo. Uma Inteno que carrega os dados do resultado.
Por exemplo, aqui est como voc pode manipular o resultado para a "pegar um contato" inteno:
@ Override protegido vazio onActivityResult ( int requestCode , int resultCode , Inteno de dados ) { / / Verifica qual solicitao estamos respondendo a se ( requestCode == PICK_CONTACT_REQUEST ) { / / Certifique-se que o pedido foi bem sucedido se ( resultCode == RESULT_OK ) { / / O usurio escolheu um contato. / / Uri dados do Inteno identifica que o contato foi selecionado. / / Faa algo com o contato aqui (exemplo maior abaixo) } } }
Neste exemplo, o resultado Inteno retornado por contatos do Android ou APP Pessoas oferece um contedoUri que identifica o contato do usurio selecionado. A fim de lidar com sucesso o resultado, voc deve entender o que o formato do resultado Inteno ser. Fazer isso fcil quando a atividade retornando um resultado uma de suas prprias atividades. Apps includo com a plataforma Android oferecer sua prpria APIs que voc pode contar para os dados de resultado especfico.Por exemplo, as pessoas app (aplicativo Contatos em algumas verses mais antigas) sempre retorna um resultado com o contedo URI que identifica o contato selecionado, eo app Camera retorna um Bitmap em"dados" extra (consulte a classe sobre a captura de fotos ).
Recuperar o nmero de telefone o nmero da coluna int coluna = cursor . getColumnIndex ( telefone . NMERO ); Cordas nmero = cursor . getString ( coluna ); / / Faa algo com o nmero de telefone ... } } }
Nota: Antes de Android 2.3 (nvel API 9), realizando uma consulta no Contatos Provider (como a mostrada acima) requer que seu aplicativo declarar a READ_CONTACTS permisso (ver Segurana e permisses ). No entanto, comeando com o Android 2.3, os contatos / app Pessoas concede seu aplicativo uma permisso temporria para ler o Contatos Provider quando ele retorna um resultado. A permisso temporria aplica-se apenas para o contato especfico solicitado, ento voc no pode consultar um contato diferente daquele especificado pela inteno de Uri , a menos que voc declare o READ_CONTACTS permisso.
As duas lies anteriores focado em um lado da histria: a partir de atividade de outro aplicativo do seu aplicativo. Mas se o seu aplicativo pode executar uma ao que pode ser til para outro aplicativo, o aplicativo deve estar preparado para responder s solicitaes de ao de outros apps. Por exemplo, se voc criar um aplicativo social que pode compartilhar mensagens ou fotos com amigos do usurio, no seu melhor interesse para apoiar o ACTION_SEND inteno para que os usurios podem iniciar uma ao de "share" de outro aplicativo e lanar seu aplicativo para executar a ao . Para permitir que outros aplicativos para iniciar a sua atividade, voc precisa adicionar um <intentfilter>elemento em seu arquivo de manifesto para o correspondente <activity> elemento. Quando o aplicativo instalado em um dispositivo, o sistema identifica os filtros de inteno e adiciona as informaes de um catlogo interno de intenes suportado por todos os aplicativos instalados. Quando um aplicativo chama startActivity () ou startActivityForResult () , com a inteno implcita, o sistema encontra que a atividade (ou atividades) pode responder inteno.
Em seu filtro de inteno, voc pode declarar quais os critrios que sua atividade aceita, declarando cada uma delas com elementos XML correspondentes aninhados no <intentfilter> elemento. Por exemplo, aqui est uma atividade com um filtro de inteno que manipula o ACTION_SEND inteno quando o tipo de dados texto ou uma imagem:
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
Cada inteno de entrada especifica apenas uma ao e um tipo de dados, mas no h problema em declarar vrias instncias do <action> , <category> e <data> elementos em cada <intent-filter> . Se quaisquer dois pares de ao e os dados so mutuamente exclusivos em seus comportamentos, voc deve criar filtros inteno separadas para especificar quais aes so aceitveis quando emparelhado com que tipos de dados. Por exemplo, suponha que sua atividade lida com texto e imagens, tanto para o ACTION_SEND eACTION_SENDTO intenes. Neste caso, voc deve definir dois filtros inteno separados para as duas aes porque a ACTION_SENDTO inteno de utilizar os dados de Uri para especificar o endereo do destinatrio usando o envio ou sendto esquema de URI. Por exemplo:
<Atividade android: name = "ShareActivity" > ! <- filtro para o envio de texto; aceita ao SENDTO com esquemas URI sms
filtrar por enviar mensagens de texto ou de imagens; aceita ENVIAR ao e texto ou imagem dados
Nota: Para receber as intenes implcitas, voc deve incluir o CATEGORY_DEFAULT categoria no filtro de inteno. Os mtodos startActivity () e startActivityForResult () tratar todos os efeitos como se continha o CATEGORY_DEFAULT categoria. Se voc no declar-lo, sem intenes implcitas ir resolver a sua atividade. Para mais informaes sobre envio e recebimento de ACTION_SEND intenes que realizam comportamentos de compartilhamento social, ver a lio sobre o recebimento de contedo de outros aplicativos .
Obter a inteno que comeou essa atividade Inteno inteno = getIntent (); Uri dados = inteno . getData (); / / Descobrir o que fazer com base no tipo de inteno se ( inteno . getType . () indexOf ( "image /" ) ! = - 1 ) { / / Pega intenes com dados de imagem ... } mais se ( inteno . getType (). iguais ( "text / plain" )) { / / Pega intenes com o texto ... } }
Retornar um resultado
Se voc quiser retornar um resultado para a atividade que invocou o seu, basta ligar para SetResult () para especificar o cdigo de resultado e resultado Intent . Quando a operao feita e que o usurio deve retornar atividade original, ligue para terminar () para fechar (e destruir) sua atividade. Por exemplo:
/ / Cria a inteno de entregar algum tipo de resultado
Voc sempre deve especificar um cdigo de resultado com o resultado. Geralmente, tanto RESULT_OK ouRESULT_CANCELED . Voc pode, ento, fornecer dados adicionais com uma inteno , conforme necessrio. Nota: O resultado est definido para RESULT_CANCELED por padro. Assim, se o usurio pressionar o Voltaboto antes de completar a ao e antes de definir o resultado, a atividade original recebe o resultado "cancelada". Se voc s precisa retornar um nmero inteiro que indica uma das vrias opes de resultado, voc pode definir o cdigo de resultado para qualquer valor maior que 0. Se voc usar o cdigo
de resultado para entregar um inteiro e voc no precisa incluir a Intent , voc pode chamar SetResult () e passar apenas um cdigo de resultado. Por exemplo:
SetResult ( RESULT_COLOR_RED ); acabamento ();
Neste caso, pode haver apenas um pequeno nmero de resultados possveis, de modo que o cdigo de resultado um nmero inteiro definido localmente (superior a 0). Isso funciona bem quando voc est retornando um resultado de uma atividade em seu prprio aplicativo, pois a atividade que recebe o resultado pode fazer referncia ao constante pblica para determinar o valor do cdigo de resultado. Nota: No h necessidade de verificar se a atividade foi iniciada com startActivity () oustartActivityForResult () . Basta ligar para SetResult () se a inteno que comeou sua atividade poderia esperar um resultado. Se a atividade originria tinha chamado startActivityForResult () , ento o sistema oferece o resultado que voc fornecer para SetResult () , caso contrrio, o resultado ignorado.
Compartilhando contedo
COMEAR
DEPENDNCIAS E PR-REQUISITOS
Android 1.0 ou superior (maiores exigncias quando indicado) A experincia com as intenes e Inteno Filtros
Uma das grandes coisas sobre os aplicativos do Android a sua capacidade de se comunicar e se integrar com os outros.Por que reinventar a funcionalidade que no essencial para a sua aplicao quando j existe em outra aplicao? Esta classe cobre alguns aspectos comuns que voc pode enviar e receber contedo entre aplicativos usando IntenoAPIs eo ActionProvider objeto.
Lies
O envio de contedo para outros Apps Aprenda a configurar seu aplicativo para ser capaz de enviar mensagens de texto e dados binrios para outras aplicaes com intentos. Receber contedo de outros aplicativos Aprenda a configurar seu aplicativo para receber texto e dados binrios de intenes. Adicionando uma Easy Share Ao Saiba como adicionar um "share" item de ao para a sua barra de ao.
1. Enviar texto contedo 2. Enviar contedo binrio 3. Enviar vrias peas de contedo
Quando voc constri uma inteno, voc deve especificar a ao que deseja a inteno de "provocar". Android define uma srie de aes, incluindo ACTION_SEND que, como voc provavelmente pode adivinhar, indica que a inteno enviar dados a partir de uma atividade para outra, mesmo para alm das fronteiras do processo. Para enviar dados para uma outra atividade, tudo que voc precisa fazer especificar os dados e seu tipo, o sistema ir identificar as atividades que recebem compatveis e exibi-las para o usurio (se houver vrias opes) ou iniciar imediatamente a atividade (se houver apenas uma opo). Da mesma forma, voc pode anunciar os tipos de dados que suas atividades de apoio que receberam de outros aplicativos, especificando-os em seu manifesto. Envio e recebimento de dados entre aplicaes com intenes mais comumente usado para compartilhamento social de contedo. Intenes permitem aos usurios compartilhar informaes de forma rpida e fcil, usando seus aplicativos favoritos. Nota: A melhor maneira de adicionar um item de ao social para uma ActionBar usarShareActionProvider , que se tornou disponvel em nvel de API 14. ShareActionProvider discutida na lio sobre a adio de um Easy Share ao .
O uso mais simples e comum do ACTION_SEND ao o envio de contedo de texto a partir de uma atividade para outra. Por exemplo, o aplicativo do navegador embutido pode compartilhar a URL da pgina atualmente exibida como texto com qualquer aplicao. Isso til para compartilhar um artigo ou website com os amigos via e-mail ou redes sociais. Aqui est o cdigo para implementar este tipo de compartilhamento:
o meu texto para enviar. " ); sendIntent . SetType ( "text / plain" ); startActivity ( sendIntent );
Se h um aplicativo instalado com um filtro que combine ACTION_SEND e tipo MIME text / plain, o sistema Android vai execut-lo, se mais de um jogos de aplicao, o sistema exibe uma caixa de dilogo disambiguation (um "seletor"), que permite ao usurio escolher um aplicativo. Se voc chamar Intent.createChooser () para a inteno, o Android ir sempre exibir o seletor. Isto tem algumas vantagens:
Mesmo que o usurio tenha selecionado anteriormente uma ao padro para esse intento, o seletor ainda ser exibida. Se no corresponder aplicaes, o Android exibe uma mensagem do sistema. Voc pode especificar um ttulo para o dilogo Seletor.
A janela resultante mostrado na figura 1. Opcionalmente, voc pode definir alguns extras padro para a inteno: EXTRA_EMAIL , EXTRA_CC , EXTRA_BCC, EXTRA_SUBJECT . No entanto, se receber o pedido no foi projetado para us-los, nada vai acontecer. Voc pode usar extras personalizados, bem como, mas no h nenhum efeito a menos que o aplicativo receptor entende. Normalmente, voc usaria extras personalizados definidos pelo prprio aplicativo de recebimento. Nota: Alguns aplicativos de e-mail, como o Gmail, esperar um String [] para extras como EXTRA_EMAIL eEXTRA_CC , uso putExtra (String, String []) para adicion-los sua inteno.
Observe o seguinte:
Voc pode usar um tipo de MIME "* / *" , mas isso s ir corresponder a atividades que sejam capazes de lidar com fluxos de dados genricos. A aplicao precisa receber permisso para acessar os dados das Uri aponta. H um certo nmero de maneiras de lidar com isto:
o
Gravar os dados em um arquivo no armazenamento externo / shared (como o carto SD), que todos os aplicativos podem ler. Use Uri.fromFile () para criar o Uri que pode ser passado para a inteno partes. No entanto, tenha em mente que nem todas as aplicaes de processamento de um file :/ /estilo Uri . Gravar os dados em um arquivo em seu prprio diretrio de aplicativos usando openFileOutput () com o modo MODE_WORLD_READABLE depois que getFileStreamPath () pode ser usado para retornar umarquivo . Assim como a opo anterior, Uri.fromFile () ir criar um file :/ / estilo Uri para o seu intento partes. Os arquivos de mdia, como imagens, vdeos e udio podem ser digitalizados e adicionados ao sistemaMediaStore usando SCANFILE () . O onScanCompleted () callback retorna um contedo :/ / estiloUri adequado para incluir na sua inteno partes. As imagens podem ser inseridas no sistema MediaStore usando InsertImage () que ir retornar umcontedo :/ / estilo Uri adequado para incluso num inteno partes. Armazenar os dados em seu prprio ContentProvider , certifique-se de que outros aplicativos tm a permisso correta para acessar o seu provedor (ou use permisses por URI ).
o o
Como antes, certifique-se o disposto URIs apontam para dados que um aplicativo de recebimento pode acessar.
Assim como o aplicativo pode enviar dados para outros aplicativos, ele tambm pode facilmente receber dados de aplicativos. Pense em como os usurios interagem com a sua aplicao, e quais os tipos de dados que voc deseja receber de outros aplicativos. Por exemplo, um aplicativo de rede social seria, provavelmente, interessado em receber o contedo do texto, como uma URL web interessante, a partir de outro aplicativo. O aplicativo Google+ Android aceita tanto texto eimagens nicas ou mltiplas. Com este aplicativo, o usurio pode facilmente comear um novo post Google+ com fotos da Galeria app Android.
Nota: Para mais informaes sobre filtros de inteno e resoluo de inteno, por favor leia as intenes e Intent Filters Quando outro aplicativo tenta compartilhar qualquer uma dessas coisas atravs da construo de uma inteno e pass-la para startActivity () , a sua candidatura ser listado como uma opo no seletor de inteno. Se o usurio selecionar a sua aplicao, a atividade correspondente ( . ui.MyActivity no exemplo acima) ser iniciado. Cabe ento a voc a lidar com o contedo de forma adequada dentro de seu cdigo e interface do usurio.
fazer a seguir.Tenha em mente que, se essa atividade pode ser iniciado a partir de outras partes do sistema, como o lanador, ento voc ter que levar isso em considerao quando se examina a inteno.
vazio onCreate ( Bundle savedInstanceState ) ... / / Pega a inteno, ao e tipo MIME Inteno inteno = getIntent (); Cordas ao = inteno . getAction (); Cordas tipo = inteno . getType (); se {
} {
( Intent . ACTION_SEND . iguais ( ao ) && tipo ! = NULL ) { se ( "text / plain" . iguais ( tipo )) { handleSendText ( inteno ), texto / / Pega a ser enviado } mais se ( tipo . startsWith ( "image /" )) { handleSendImage ( inteno ); / / Handle nica imagem a ser enviada } mais se ( Intent . ACTION_SEND_MULTIPLE . iguais ( ao ) && tipo ! = NULL ) se
( tipo . startsWith ( "image /" )) { handleSendMultipleImages ( inteno ); / / Lidar com vrias imagens que esto sendo enviados } } mais { / / Lidar com outras intenes, como sendo iniciado a partir da tela inicial } ... } vazio handleSendText ( Inteno inteno ) { Cordas sharedText = inteno . getStringExtra ( Intent . EXTRA_TEXT ); se ( sharedText ! = nulo ) { / / Atualizao da interface do usurio para refletir o texto que est sendo compartilhado } } vazio handleSendImage ( Inteno inteno ) { Uri imageUri = ( Uri ) inteno . getParcelableExtra ( Intent . EXTRA_STREAM ); se ( imageUri ! = nulo ) { / / Atualizao da interface do usurio para refletir a imagem que est sendo compartilhado } } vazio handleSendMultipleImages ( Inteno inteno ) { ArrayList < Uri > imageUris = inteno . getParcelableArrayListExtra ( Intent . EXTRA_STREAM ); se ( imageUris ! = nulo ) { / / Atualizao da interface do usurio para refletir vrias imagens que esto sendo compartilhados } }
Ateno: Tome cuidado extra para verificar os dados de entrada, voc nunca sabe o que algum outro aplicativo pode enviar-lhe. Por exemplo, o tipo MIME errado pode ser definido, ou a imagem a ser enviada pode ser extremamente grande. Alm disso, lembre-se de processar dados binrios em um segmento separado ao invs do principal thread ("UI"). Atualizando a interface do usurio pode ser to simples como preencher um EditText , ou pode ser mais complicado, como a aplicao de um filtro foto interessante para uma imagem. realmente especfico para a sua aplicao o que acontece em seguida.
Execuo de uma aco eficaz e amigvel partes usurio em sua ActionBar ainda mais fcil com a introduo deActionProvider em Android 4.0 (API Nvel 14). UmActionProvider , uma vez ligado a um item de menu na barra de ao, lida com a aparncia eo comportamento desse item.No caso de ShareActionProvider , voc fornece uma inteno de compartilhar e ele faz o resto. Nota: ShareActionProvider est disponvel a partir da API nvel 14 ou superior.
Esta responsabilidade delegados para a aparncia e funo do itemShareActionProvider . No entanto, voc ter que informar o provedor que voc gostaria de compartilhar.
Inflar arquivo de recurso menu. getMenuInflater (). inflar ( R . cardpio . share_menu , cardpio ); / / Localiza MenuItem com ShareActionProvider MenuItem artigo = Menu . FindItem ( R . id . menu_item_share ); / / busca e armazenar ShareActionProvider mShareActionProvider = ( ShareActionProvider ) ponto . getActionProvider (); / / Retorna verdadeiro para exibir o menu de retorno verdadeiro ; } / / Chamada para atualizar a parcela
Voc s precisa definir a inteno partes uma vez durante a criao de seus menus, ou voc pode querer configur-lo e, em seguida, atualiz-lo com as mudanas de interface do usurio. Por exemplo, quando voc ver fotos em tela cheia na App Gallery, a partilha alteraes inteno como voc virar entre as fotos. Para uma discusso mais aprofundada sobre o ShareActionProvider objeto, consulte a Barra de aomanual.
DEPENDNCIAS E PR-REQUISITOS
Android 2.0 (API nvel 5) ou superior Experincia com Mdia de reproduo
Se o seu aplicativo reproduz udio, importante que os usurios podem controlar o udio de uma forma previsvel.Para garantir uma tima experincia de usurio, tambm importante que seu aplicativo gerencia o foco de udio para garantir vrios aplicativos no esto jogando de udio ao mesmo tempo. Aps esta aula, voc ser capaz de construir aplicativos que respondem ao hardware de udio teclas, que pedem foco de udio durante a reproduo de udio, e que respondem adequadamente a mudanas no foco de udio causadas pelo sistema ou outras aplicaes.
Lies
Controlar o volume e reproduo do seu App Saiba como garantir seus usurios podem controlar o volume do seu aplicativo usando o hardware ou software controles de volume e, quando disponvel o play, stop, pause, pular e anteriores de mdia teclas de reproduo. Gerenciando Foco udio Com vrios aplicativos potencialmente reproduzir udio importante pensar sobre como eles devem interagir. Para evitar qualquer aplicativo de msica tocando ao mesmo tempo, o Android usa o foco de udio para moderar a reproduo de udio. Saiba como solicitar o foco de udio, para ouvir uma perda de foco de udio, e como reagir quando isso acontece. Lidar com sada de udio Hardware O udio pode ser jogado a partir de um certo nmero de fontes. Aprenda a descobrir onde o udio est sendo reproduzido e como lidar com um fone de ouvido de ser desconectado durante a reproduo.
A boa experincia do usurio um previsvel um. Se o seu aplicativo reproduz mdias, importante que os usurios podem controlar o volume do seu aplicativo usando o hardware ou os controles do seu dispositivo de volume de software, bluetooth fone de ouvido ou fones de ouvido. Da mesma forma, onde o play, stop, pause, pular apropriado e disponvel, e anteriores de mdia teclas de reproduo deve exercer as respectivas aes no fluxo de udio usado pelo seu aplicativo.
O primeiro passo para a criao de uma experincia de udio previsvel entender qual o fluxo de udio do seu aplicativo ir usar. Android mantm um fluxo de udio em separado para a reproduo de msica, alarmes, notificaes, o toque de chamada recebida, os sons do sistema, o volume durante a chamada, e os tons DTMF. Isso feito principalmente para permitir aos usurios controlar o volume de cada fluxo de forma independente. A maioria destes fluxos so restritos a eventos do sistema, a menos que seu aplicativo um despertador de substituio, voc quase certamente estar jogando o udio usando o STREAM_MUSIC stream.
Use Hardware Teclas de Volume para controlar o volume de udio do seu aplicativo
Por padro, pressionando os controles de volume modificar o volume do fluxo de udio ativo. Se o seu aplicativo no est jogando nada, batendo as teclas de volume para ajustar o volume da campainha. Se voc tem um jogo ou aplicativo de msica, ento as chances so boas de que quando o usurio pressiona as teclas de volume que querem controlar o volume do jogo ou msica, mesmo se eles esto atualmente entre as msicas ou no h msica no atual local do jogo. Voc pode ser tentado a experimentar e ouvir teclas de volume e modificar o volume do fluxo de udio dessa forma. Resista tentao. Android oferece o prtico setVolumeControlStream () mtodo para tecla de volume diretos prensas para o fluxo de udio que voc especificar. Tendo identificado o fluxo de udio a sua aplicao vai usar, voc deve defini-lo como o alvo fluxo de volume.Voc deve fazer este apelo no incio do seu ciclo de vida do aplicativo, porque voc s precisa cham-lo de uma vez durante o ciclo de vida da atividade, voc normalmente deve cham-lo de dentro do onCreate () mtodo (da atividade ou fragmento que controla a mdia). Isso garante que sempre que o aplicativo visvel, os controles de volume funcionam como o usurio espera.
setVolumeControlStream ( AudioManager . STREAM_MUSIC );
A partir deste ponto, pressionando as teclas de volume no dispositivo afetar o fluxo de udio que voc especificar (neste caso, a "msica"), sempre que a atividade-fim ou fragmento visvel.
Usar o hardware de reproduo Teclas de controle para controlar a reproduo de udio do seu aplicativo
Mdia de reproduo botes como play, pause, stop, pular, e anteriores esto disponveis em alguns aparelhos e muitos fones de ouvido conectados ou sem fio. Sempre que um usurio pressiona uma das teclas de hardware, o sistema transmite uma inteno com o ACTION_MEDIA_BUTTON ao. Para responder a mdia cliques no boto, voc precisa registrar um BroadcastReceiver em seu manifesto que escuta essa ao transmitido como mostrado abaixo.
<receiver android:name=".RemoteControlReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver>
A prpria aplicao receptor precisa para extrair qual tecla foi pressionada para causar a transmisso. AInteno inclui esta sob a EXTRA_KEY_EVENT chave, enquanto o KeyEvent classe inclui uma listaKEYCODE_MEDIA_ * constantes estticas que representa cada um dos possveis botes de mdia, comoKEYCODE_MEDIA_PLAY_PAUSE e KEYCODE_MEDIA_NEXT . O trecho a seguir mostra como extrair o boto pressionado e mdia afeta a reproduo de mdia em conformidade.
Porque mltiplas aplicaes pode querer ouvir mdia pressiona o boto, voc tambm deve controlar programaticamente quando seu aplicativo deve receber mdia boto eventos de imprensa. O cdigo a seguir pode ser usado dentro de seu aplicativo para registrar e cancelar o registro com o boto receptor de eventos de mdia usando a AudioManager . Quando registrado, o receptor de transmisso o receptor exclusivo de todos os boto transmisses de mdia.
AudioManager am = mContext . getSystemService ( Context . AUDIO_SERVICE ); ... / / Comece ouvindo pressiona o boto sou . registerMediaButtonEventReceiver ( RemoteControlReceiver ); ... / / Pare para ouvir pressiona o boto sou . unregisterMediaButtonEventReceiver ( RemoteControlReceiver );
Tipicamente, as aplicaes devero cancelar a maioria dos seus receptores, sempre que se tornar inactivo ou invisvel (tal como durante o onStop () de retorno). No entanto, no to simples para reproduo de mdia apps-na verdade, respondendo a mdia botes de reproduo o mais importante quando a aplicao no visvel e, portanto, no pode ser controlado pela interface do usurio na tela.
Uma abordagem melhor registrar e cancelar o registro do boto media receiver evento quando seus ganhos e aplicao perde o foco de udio. Isso abordado em detalhes na prxima lio.
Com vrios aplicativos potencialmente reproduzir udio importante pensar sobre como eles devem interagir. Para evitar qualquer aplicativo de msica tocando ao mesmo tempo, o Android usa o foco de udio para moderar udio somente a reproduo aplicativos que possuem o foco de udio devem reproduzir o udio. Antes de sua aplicao comea a tocar udio deve solicitar e receber, o foco de udio. Da mesma forma, ele deve saber ouvir para uma perda de foco de udio e responder apropriadamente quando isso acontece.
Iniciar a reproduo. }
Depois de terminar a reproduo no se esquea de chamar abandonAudioFocus () . Isso notifica o sistema que voc no precisar mais foco e cancela o registro do associadoAudioManager.OnAudioFocusChangeListener . No caso de abandono foco transitria, isto permite que qualquer app interupted para continuar a reproduo.
/ / Abandono foco de udio quando a reproduo completa sou . abandonAudioFocus ( afChangeListener );
Ao solicitar foco udio transitria voc tem uma opo adicional: se voc deseja ou no ativar "esquivandose".Normalmente, quando um aplicativo de udio bem-comportado perde o foco do audio-lo imediatamente silncios sua reproduo. Ao solicitar um foco de udio transitria que permite que voc diga esquivando outros aplicativos de udio que aceitvel para eles para continuar a jogar, desde que diminuir o seu volume at que o foco retorna para eles.
/ / Pedido foco de udio para reproduo int resultado = sou . requestAudioFocus ( afChangeListener , / / Use o streaming de msica. AudioManager . STREAM_MUSIC , / / Request permanente
Iniciar a reproduo. }
Esquivando particularmente adequado para aplicaes que utilizam o fluxo de udio de forma intermitente, como por direes de conduo sonoros. Sempre que outro aplicativo solicita udio do foco, como descrito acima, a sua escolha entre o foco de udio permanente e transitrio (com ou sem suporte para som) recebida pelo ouvinte se registou ao solicitar foco.
No seguinte trecho de cdigo, fazemos uma pausa na reproduo ou nosso objeto media player se a perda de udio transitria e retom-la quando ns recuperamos o foco. Se a perda for permanente, ele cancela nosso boto media receptor de eventos e para monitorar mudanas de foco de udio.
AudioManager . AUDIOFOCUS_GAIN )
Parar a reproduo } } };
No caso de uma perda temporria de foco de udio onde abaixando permitido, ao invs de pausar a reproduo, voc pode "pato" em vez.
Pato!
Esquivando-se o processo de reduzir o volume de fluxo de sada de udio para fazer udio transitria de outro aplicativo mais fcil de ouvir sem interromper totalmente o udio de seu prprio aplicativo. No seguinte trecho de cdigo reduz o volume do nosso objeto media player quando perdemos temporariamente o foco, ento retorna ao seu nvel anterior, quando recuperar o foco.
} } } };
A perda do foco de udio a transmisso mais importante para reagir, mas no o nico. O sistema emite uma srie de intenes para alert-lo s mudanas na experincia de udio do usurio. A prxima lio demonstra como monitor-los para melhorar a experincia geral do usurio.
Mdia de reproduo
Os usurios tm uma srie de alternativas quando se trata de apreciar o udio dos seus dispositivos Android. A maioria dos dispositivos tm um alto-falante embutido, de fones de ouvido para fones de ouvido com fio, e muitos tambm recurso de conectividade Bluetooth e suporte para udio A2DP.
Pause o
Captura de Fotos
COMEAR
DEPENDNCIAS E PR-REQUISITOS
Android 1.5 (API nvel 3) ou superior Um dispositivo com uma cmara
EXPERIMENT-LO
Baixe o exemplo
PhotoIntentActivity.zip
O mundo era um lugar sombrio e inexpressivo antes de rich media tornou-se predominante. Lembre-se Gopher? Ns no, tampouco. Para a sua aplicao para se tornar parte da vida de seus usurios, dar-lhes uma maneira de colocar suas vidas a ele. Usando as cmeras on-board, o aplicativo pode permitir que os usurios para aumentar o que vem ao seu redor, faa avatares nicos, procure zombies ao virar da esquina, ou simplesmente compartilhar suas experincias. Esta classe faz com que voc clicar em rpido com algumas maneiras super-fceis de alavancar aplicaes de cmera existentes. Em lies posteriores, voc mergulhar mais fundo e aprender a controlar o hardware da cmera diretamente.
Lies
Tirar fotos Simplesmente Alavancagem outras aplicaes e capturar fotos com apenas algumas linhas de cdigo. Gravar vdeos Simplesmente Alavancagem outras aplicaes e gravar vdeos com apenas algumas linhas de cdigo. Controlar a cmera Controlar o hardware da cmera diretamente e implementar seu prprio aplicativo de cmera.
EXPERIMENT-LO
Baixe o exemplo
PhotoIntentActivity.zip
Esta lio explica como tirar fotos usando um aplicativo de cmera existente. Suponha que voc est implementando uma multido proveniente servio de meteorologia que faz um mapa do tempo mundial, misturando imagens de o cu tomado por dispositivos que executam seu aplicativo cliente. Integrando fotos apenas uma pequena parte do seu aplicativo. Voc quer tirar fotos com o mnimo de barulho, no reinventar a cmera. Felizmente, a maioria dos dispositivos com Android j tem pelo menos um aplicativo de cmera instalado. Nesta lio, voc aprende como faz-lo tirar uma foto para voc.
/>
Se o seu aplicativo usa, mas no necessita de uma cmera para funcionar, adicione android: required = "false" para o tag. Ao fazer isso, o Google Play permitir que dispositivos sem uma cmera para fazer o download do aplicativo. ento a sua responsabilidade de verificar a disponibilidade da cmera em tempo de execuo, chamando hasSystemFeature (PackageManager.FEATURE_CAMERA) . Se a cmera no estiver disponvel, ento voc deve desativar os recursos de cmera.
startActivityForResult(takePictureIntent, actionCode); }
Parabns: com esse cdigo, o aplicativo ganhou a capacidade de fazer outro aplicativo de cmera fazer o seu lance! Claro que, se nenhum aplicativo compatvel est pronto para pegar a inteno, ento o seu aplicativo vai cair como um mergulho fase fracassada. Aqui est uma funo para verificar se um aplicativo pode manipular a sua inteno:
public static boolean isIntentAvailable(Context context, String action) { final PackageManager packageManager = context.getPackageManager(); final Intent intent = new Intent(action); List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; }
Ver a foto
Se o simples feito de tirar uma foto no o ponto culminante da ambio de seu aplicativo, ento voc provavelmente vai querer tirar a imagem de volta a partir do aplicativo de cmera e fazer alguma coisa com ele. A aplicao Camera Android codifica a foto em troca da Inteno entregue onActivityResult () como um pequeno Bitmap nos extras, sob a chave "dados" . O cdigo a seguir recupera esta imagem e exibe-lo em umImageView .
private void handleSmallCameraPhoto(Intent intent) { Bundle extras = intent.getExtras(); mImageBitmap = (Bitmap) extras.get("data"); mImageView.setImageBitmap(mImageBitmap); }
Nota: Esta imagem em miniatura a partir de "dados" pode ser bom para um cone, mas no muito mais. Lidar com uma imagem em tamanho normal leva um pouco mais de trabalho.
Salvar a foto
A aplicao Camera Android salva uma foto no tamanho completo se voc lhe der um arquivo para salvar em.Voc deve fornecer um caminho que inclui o volume de armazenamento, a pasta eo nome do arquivo. Existe uma maneira fcil de obter o caminho para as fotos, mas ele s funciona em Android 2.2 (API nvel 8) e, mais tarde:
getAlbumName() );
Para os nveis API anteriores, voc tem que fornecer o nome do diretrio de fotos mesmo.
Nota: O componente do caminho PICTURES_DIR apenas Pictures / , o local padro para as fotos compartilhadas no armazenamento externo / shared.
throws
IOException
private void galleryAddPic() { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(mCurrentPhotoPath); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); }
Determine quanto para diminuir a imagem int ScaleFactor = Math . min ( photoW / targetW , photoH / targetH ); / / decodificar o arquivo de imagem em um bitmap para preencher o tamanho
EXPERIMENT-LO
Baixe o exemplo
PhotoIntentActivity.zip
Esta lio explica como capturar vdeo usando aplicativos de cmera existentes. O aplicativo tem um trabalho a fazer, e integrando vdeos apenas uma pequena parte dela. Voc quer gravar vdeos com o mnimo de barulho, e no reinventar a filmadora. Felizmente, a maioria dos dispositivos com Android j tem um aplicativo de cmera que grava vdeo. Nesta lio, voc faz isso para voc.
/>
Se o seu aplicativo usa, mas no necessita de uma cmera para funcionar, adicione android: required = "false" para o tag. Ao fazer isso, o Google Play permitir que dispositivos sem uma cmera para fazer o download do aplicativo. ento a sua responsabilidade de verificar a disponibilidade da cmera em tempo de execuo, chamando hasSystemFeature (PackageManager.FEATURE_CAMERA) . Se a cmera no estiver disponvel, ento voc deve desativar os recursos de cmera.
uma boa idia para se certificar existe um aplicativo para lidar com a sua inteno antes de invoc-lo. Aqui est uma funo que verifica se h aplicativos que podem lidar com a sua inteno:
public static boolean isIntentAvailable(Context context, String action) { final PackageManager packageManager = context.getPackageManager(); final Intent intent = new Intent(action); List<ResolveInfo> list =
Ver o vdeo
A aplicao Camera Android retorna o vdeo no Inteno entregue onActivityResult () como um Uriapontando para o local vdeo no armazenamento. O cdigo a seguir recupera este vdeo e exibe-lo em umVideoView .
private void handleCameraVideo(Intent intent) { mVideoUri = intent.getData(); mVideoView.setVideoURI(mVideoUri); }
Controlar a cmera
ANTERIORPRXIMA
Nesta lio, vamos discutir como controlar o hardware da cmera diretamente usando as APIs do framework. Controlar diretamente a cmera do dispositivo requer um cdigo muito mais do que pedir fotos ou vdeos a partir de aplicativos de cmera existentes. No entanto, se voc quiser construir uma aplicao de cmara especializada ou algo totalmente integrado em sua interface do usurio de aplicativos, esta lio mostra como voc.
cmera pode ser adiada para o onResume () mtodo para facilitar a reutilizao de cdigo e manter o fluxo de controle simples. Chamando Camera.open () lana uma exceo se a cmera j est em uso por outro aplicativo, de modo que envolv-la em um try bloco.
para abrir
Desde nvel API 9, o quadro cmera suporta mltiplas cmeras. Se voc usar a API legado e chamar open ()sem um argumento, voc comea a primeira cmera traseira.
Classe pr-visualizao
Para comear com a exibio de um preview, voc precisa classe visualizao. A pr-visualizao requer uma execuo do android.view.SurfaceHolder.Callback interface, que usado para transmitir dados de imagem a partir do hardware para a cmara de aplicao.
Instale um SurfaceHolder.Callback por isso ser notificado quando a superfcie / / subjacente criado e
A classe de visualizao deve ser passado para a Cmara objeto antes de a pr-visualizao de imagens ao vivo pode ser iniciado, como mostrado na prxima seo.
Chame startPreview () para iniciar a atualizao superfcie de visualizao. Visualizao deve ser iniciado antes que voc pode tirar uma foto. * / mCamera . startPreview (); } }
Chame startPreview () para iniciar a atualizao superfcie de visualizao. Visualizao deve ser iniciado antes que voc pode tirar uma foto. * / mCamera . startPreview (); }
Reinicie o Pr-Visualizao
Depois que a foto tirada, voc deve reiniciar a visualizao que o usurio possa tirar outra foto. Neste exemplo, o recomeo feito por sobrecarregar o boto do obturador.
/ * Importante:. lanamento Call () para liberar a cmera para uso por outros aplicativos candidaturas devero liberar a cmera imediatamente em onPause () (e re-open () em onResume ()). * / mCamera . lanamento (); mCamera = } } nulo ;
No incio da aula, esse procedimento tambm fazia parte do setCamera () mtodo, para inicializar uma cmera sempre comea com parar a visualizao.
DEPENDNCIAS E PR-REQUISITOS
Android 2.1 (API Nvel 7) ou superior Biblioteca de Apoio
EXPERIMENT-LO
Baixe o exemplo
BitmapFun.zip
Aprenda a usar as tcnicas comuns para processar e carregarBitmap objetos de uma forma que mantm os componentes a sua interface de usurio (UI) gil e evita exceder seu limite de memria do aplicativo. Se voc no tiver cuidado, bitmaps podem consumir rapidamente o seu oramento memria disponvel levando a um acidente de aplicao devido temida exceo: java.lang.OutOfMemoryError: bitmap tamanho excede o oramento VM . H uma srie de razes pelas quais o carregamento bitmaps em seu aplicativo Android complicado:
Os dispositivos mveis normalmente tm limitado os recursos do sistema. Dispositivos Android podem ter to pouco como 16MB de memria disponvel para uma nica aplicao. O Android Documento Definio de Compatibilidade (CDD), Seo 3.7. Compatibilidade Virtual Machine d a memria da aplicao mnima exigida para vrios tamanhos de tela e densidades. As candidaturas devem ser otimizados para executar sob este limite mnimo de memria. No entanto, tenha em mente muitos dispositivos so configurados com limites mais altos. Bitmaps pegar um monte de memria, especialmente para imagens ricas, como fotografias. Por exemplo, a cmera no Galaxy Nexus tira fotos de at 2592x1936 pixels (5 megapixels). Se a configurao de bitmap usado ARGB_8888 (o padro do Android 2.3 em diante), ento carregar esta imagem na memria leva cerca de 19MB de memria (2592 * 1936 * 4 bytes), imediatamente esgotar o limite per-app em alguns dispositivos. Android aplicativo UI freqentemente requerem vrios bitmaps para serem carregados de uma s vez.Componentes como ListView , GridView e ViewPager geralmente incluem vrios bitmaps na tela ao mesmo tempo com muito mais potencial off-screen pronto para mostrar ao toque de um dedo.
Lies
Carregar bitmaps grandes eficiente Esta lio percorre decodificao grandes bitmaps sem exceder o limite de memria por aplicao. Bitmaps processamento off o segmento Processamento Bitmap (redimensionamento, o download de uma fonte remota, etc) nunca deve ter lugar no principal segmento. Esta lio percorre processamento bitmaps em uma discusso de fundo usandoAsyncTask e explica como lidar com questes de concorrncia. Cache de bitmaps Esta lio percorre usando uma memria e cache de bitmap em disco para melhorar a capacidade de resposta e fluidez de sua UI ao carregar vrios bitmaps. Gerenciando a Memria Bitmap Esta lio explica como gerenciar a memria bitmap para maximizar o desempenho do seu aplicativo. Exibindo bitmaps em sua UI Esta lio traz tudo junto, mostrando-lhe como carregar vrios bitmaps em componentes como ViewPagere GridView usando um thread em segundo plano e cache de bitmap.
EXPERIMENT-LO
Baixe o exemplo
BitmapFun.zip
As imagens vm em todas as formas e tamanhos. Em muitos casos, so maiores do que o necessrio para uma interface de utilizador da aplicao tpica (UI). Por exemplo, o aplicativo Gallery sistema exibe fotos tiradas com a cmera do seu dispositivos Android que so tipicamente resoluo muito maior do que a densidade da tela do seu dispositivo. Tendo em conta que voc est trabalhando com memria limitada, o ideal que voc apenas deseja carregar a verso de baixa resoluo na memria. A verso de baixa resoluo deve corresponder ao tamanho do componente de interface do usurio que exibe. Uma imagem com uma resoluo maior no fornece qualquer benefcio visvel, mas ainda ocupa memria preciosa e incorre em sobrecarga adicional de desempenho devido ao adicional sobre a escala real. Esta lio percorre decodificao grandes bitmaps sem exceder o limite de memria por aplicao carregar uma verso menor subamostrada na memria.
Para evitar java.lang.OutOfMemory excees, verifique as dimenses de um bitmap antes de decodific-lo, a menos que voc absolutamente confiar na fonte para fornec-lo com os dados da imagem previsivelmente porte que se encaixa confortavelmente dentro da memria disponvel.
Agora que as dimenses da imagem sejam conhecidos, eles podem ser usados para decidir se a imagem completa deve ser carregado para a memria ou se uma verso subamostrada devem ser carregados em seu lugar. Aqui esto alguns fatores a considerar:
Uso de memria estimado de carregar a imagem completa na memria. Quantidade de memria que voc est disposto a comprometer-se carregar esta imagem dada quaisquer outros requisitos de memria de sua aplicao. As dimenses do alvo ImageView ou componente de interface que a imagem est a ser carregado para. Tamanho da tela e densidade do dispositivo atual.
Por exemplo, no vale a pena uma imagem de 1024x768 pixels carregar na memria, se ele acabar por ser exibido em uma miniatura de 128x96 pixels em um ImageView . Para dizer o descodificador subamostra a imagem, o carregamento de uma verso menor na memria, definirinSampleSize a verdade em sua BitmapFactory.Options objeto. Por exemplo, uma imagem com resoluo de 2048x1536 que decodificado com um inSampleSize de 4 produz um bitmap de aproximadamente 512x384. Carregar isto em memria usa 0.75MB ao invs de 12MB para a imagem completa (assumindo uma configurao de bitmap de ARGB_8888 ). Aqui est um mtodo para calcular o valor de um tamanho de amostra com base na largura e altura alvo:
pblico static int calculateInSampleSize ( BitmapFactory . Opes de opes , / / Raw altura e largura de
int reqWidth ,
int reqHeight )
Escolha a menor proporo que o valor inSampleSize, isso vai garantir a / / a imagem final com ambas as dimenses maiores do que ou iguais altura / / solicitado e largura. inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio ; } retorno inSampleSize ; }
Nota: Usando potncias de 2 para inSampleSize valores mais rpido e mais eficiente para o decodificador.No entanto, se voc pretende armazenar em cache as verses redimensionadas na memria ou no disco, normalmente ainda vale a decodificao com as dimenses de imagem mais apropriadas para economizar espao. Para usar este mtodo, primeiro decodificao com inJustDecodeBounds definido para verdadeiro , passar as opes e, em seguida, atravs de decodificar novamente usando o novo inSampleSize valor einJustDecodeBounds definido para falso :
pblico esttico Bitmap decodeSampledBitmapFromResource ( Recursos res , int reqWidth , int reqHeight ) { int Resid ,
Calcular inSampleSize opes . inSampleSize = calculateInSampleSize ( opes , reqWidth , reqHeight ); bitmap / / Decode com conjunto inSampleSize opes . inJustDecodeBounds = false ; retorno BitmapFactory . decodeResource ( res , resid , opes ); }
Este mtodo faz com que seja fcil de carregar um mapa de bits de tamanho arbitrariamente grande numImageView que exibe uma miniatura de 100x100 pixels, como mostrado no seguinte exemplo de cdigo:
mImageView . setImageBitmap ( decodeSampledBitmapFromResource ( getResources (), R . id . myimage , ));
100 ,
100
Pode seguir um processo semelhante para descodificar bitmaps de outras fontes, substituindo o apropriado * BitmapFactory.decode mtodo, conforme necessrio.
EXPERIMENT-LO
Baixe o exemplo
BitmapFun.zip
Os * BitmapFactory.decode mtodos, discutidos nas grande carga Bitmaps eficiente lio, no deve ser executado no thread principal UI se a fonte de dados lido do disco ou local de rede (ou mesmo qualquer outra fonte de memria). O tempo que esta demora a carregar dados imprevisvel e depende de uma variedade de factores (velocidade de leitura a partir do disco ou da rede, o tamanho da imagem, a energia do processador, etc.)Se uma dessas tarefas bloqueia o segmento de interface do usurio, o sistema sinaliza sua aplicao como no-responsivos eo usurio tem a opo de fech-la (ver Projetando para Receptividade para mais informaes). Esta lio percorre processamento bitmaps em uma discusso de fundo usando AsyncTask e mostra-lhe como lidar com questes de concorrncia.
Use um AsyncTask
O AsyncTask classe fornece uma maneira fcil de executar algum trabalho em uma discusso de fundo e publicar os resultados de volta no segmento. Para us-lo, criar uma subclasse e substituir os mtodos fornecidos. Aqui est um exemplo de carregar uma imagem grande em uma ImageView usando AsyncTask edecodeSampledBitmapFromResource () :
Use um WeakReference para garantir a ImageView pode ser lixo coletado imageViewReference = new WeakReference < ImageView > ( imageView ); } image / Decode / in
O WeakReference ao ImageView garante que o AsyncTask no impede que o ImageView e nada faz referncia de ser lixo coletado. No h nenhuma garantia da ImageView ainda est em torno de quando a tarefa for concluda, ento voc deve tambm verificar a referncia na OnPostExecute () . O ImageView pode no existir mais, se por exemplo, o usurio navega para longe da atividade ou se uma alterao de configurao acontece antes que a tarefa terminar. Para comear a carregar o bitmap de forma assncrona, basta criar uma nova tarefa e execut-lo:
public void loadBitmap(int resId, ImageView imageView) { BitmapWorkerTask task = new BitmapWorkerTask(imageView); task.execute(resId); }
O blog Multithreading para o desempenho ainda discute lidar com a concorrncia, e oferece uma soluo onde o ImageView armazena uma referncia ao mais recente AsyncTask que mais tarde pode ser verificado quando a tarefa for concluda. Utilizando um mtodo semelhante, a AsyncTask a partir da seco anterior podem ser estendido a seguir um padro similar. Criar um dedicado Drawable subclasse para armazenar uma referncia de volta para a tarefa do trabalhador.Neste caso, um BitmapDrawable utilizado para que uma imagem de substituio pode ser exibida noImageView enquanto a tarefa completa:
static class AsyncDrawable extends BitmapDrawable { private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference; public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) { super(res, bitmap); bitmapWorkerTaskReference = new WeakReference<BitmapWorkerTask>(bitmapWorkerTask); } public BitmapWorkerTask getBitmapWorkerTask() { return bitmapWorkerTaskReference.get(); } }
Antes de executar o BitmapWorkerTask , voc cria uma AsyncDrawable e vincul-lo ao alvo ImageView :
public void loadBitmap(int resId, ImageView imageView) { if (cancelPotentialWork(resId, imageView)) { final BitmapWorkerTask task = new BitmapWorkerTask(imageView); final AsyncDrawable asyncDrawable = new AsyncDrawable(getResources(), mPlaceHolderBitmap, task); imageView.setImageDrawable(asyncDrawable); task.execute(resId); } }
O cancelPotentialWork mtodo referenciado no exemplo de cdigo acima verifica se outra tarefa em execuo j est associado com o ImageView . Se assim for, ele tenta cancelar a tarefa anterior, chamandocancelar () . Num pequeno nmero de casos, os dados do novo tarefa corresponde a tarefa existente e necessita de mais nada para acontecer. Aqui a implementao de cancelPotentialWork :
Cancelar tarefa anterior bitmapWorkerTask . cancelar ( verdadeiro ); mais { / / O mesmo trabalho j est em andamento retorno falso ;
} } / / Nenhuma tarefa associada com o ImageView, ou uma tarefa existente foi cancelada retorno verdadeiro ; }
Um mtodo auxiliar, getBitmapWorkerTask () , usado anteriormente para recuperar a tarefa associada a um determinado ImageView :
private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) { if (imageView != null) { final Drawable drawable = imageView.getDrawable(); if (drawable instanceof AsyncDrawable) { final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; return asyncDrawable.getBitmapWorkerTask(); } } return null; }
O ltimo passo atualizar OnPostExecute () em BitmapWorkerTask para que ele verifica se a tarefa for cancelada e se a tarefa atual corresponde a um associado com o ImageView :
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { ... @Override protected void onPostExecute(Bitmap bitmap) { if (isCancelled()) { bitmap = null; } if (imageViewReference != null && bitmap != null) { final ImageView imageView = imageViewReference.get(); final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); if (this == bitmapWorkerTask && imageView != null) { imageView.setImageBitmap(bitmap); } } } }
Esta aplicao est agora adequado para utilizao em ListView e GridView de componentes, bem como de quaisquer outros componentes que reciclam seus pontos de vista da criana. Basta ligar para LoadBitmaponde voc normalmente definir uma imagem para o seu ImageView . Por exemplo, em um GridView execuo este seria no getView () mtodo do adaptador de apoio.
Cache de bitmaps
ANTERIORPRXIMA
EXPERIMENT-LO
Baixe o exemplo
BitmapFun.zip
Carregar um nico bitmap em sua interface de usurio (UI) simples, porm as coisas ficam mais complicadas se voc precisa carregar um conjunto maior de imagens de uma vez. Em muitos casos (por exemplo, com componentes como ListView, GridView ou ViewPager ), o nmero total de imagens no ecr combinado com imagens que pode deslocar rapidamente para a tela essencialmente ilimitado. O uso da memria mantido baixo com componentes como este atravs da reciclagem os pontos de vista da criana medida que se movem para fora da tela. O coletor de lixo tambm libera seus bitmaps carregados, supondo que voc no manter todas as referncias de vida longa. Isso tudo bom e bem, mas a fim de manter um fluido e rpido-carregamento da interface do usurio que voc deseja evitar o tratamento continuamente essas imagens cada vez que voltar na tela. A memria e cache de disco, muitas vezes pode ajudar aqui, permitindo que os componentes para recarregar rapidamente imagens processadas. Esta lio percorre usando uma memria e cache de bitmap em disco para melhorar a capacidade de resposta e fluidez de sua UI ao carregar vrios bitmaps.
A memria cache oferece acesso rpido a bitmaps, ao custo de ocupar memria do aplicativo valioso. OLruCache classe (tambm disponvel na Biblioteca de suporte para o uso de volta API Nvel 4) particularmente adequado para a tarefa de cache de bitmaps, mantendo os objetos referenciados recentemente em uma forte referncia LinkedHashMap e expulsar o membro menos recentemente usado antes do cache excede o seu designado tamanho. Nota: No passado, a implementao de cache de memria popular foi um SoftReference ouWeakReference cache de bitmap, no entanto isso no recomendado. A partir do Android 2.3 (Nvel API 9), o coletor de lixo mais agressivo com a coleta de referncias soft / fraco que os torna bastante ineficaz. Alm disso, antes de Android 3.0 (API Nvel 11), os dados de suporte de um mapa de bits foi armazenado na memria nativa, que no libertada de uma forma previsvel, potencialmente provocando uma aplicao que exceda brevemente os seus limites de memria e de coliso. A fim de seleccionar um tamanho apropriado para um LruCache , um certo nmero de factores que devem ser tidos em considerao, por exemplo:
Como memria intensiva o resto de sua atividade e / ou aplicao? Quantas imagens estaro na tela ao mesmo tempo? Quantos precisam estar disponveis pronto para entrar na tela? Qual o tamanho da tela ea densidade do dispositivo? Uma alta dispositivo extra tela densidade (xhdpi) como Galaxy Nexus vai precisar de um cache maior para manter o mesmo nmero de imagens na memria em comparao com um dispositivo como Nexus S (hdpi). Quais as dimenses e configurao so os bitmaps e, portanto, o quanto de memria cada um vai pegar? Com que frequncia que as imagens ser acessado? Ser que algum ser acessados com mais frequncia do que outros? Se assim for, talvez voc pode querer manter alguns itens sempre na memria ou at mesmo ter vrios LruCache objetos para diferentes grupos de bitmaps. Voc pode equilibrar qualidade contra a quantidade? Por vezes, pode ser mais til para armazenar um maior nmero de mapas de bits de menor qualidade, potencialmente, o carregamento de uma verso de maior qualidade, em outra tarefa em segundo plano.
No h tamanho ou frmula que combina com todas as aplicaes especficas, at voc para analisar o seu uso e chegar a uma soluo adequada. Um cache que muito pequena provoca uma sobrecarga adicional sem nenhum benefcio, um cache que muito grande pode mais uma vez causar java.lang.OutOfMemoryexcees e deixar o resto de sua pouca memria aplicativo para trabalhar com ele. Aqui est um exemplo de criao de uma LruCache para bitmaps:
Obter mxima de memria disponvel VM, ultrapassando este valor ir lanar uma exceo / / OutOfMemory. Armazenado em kilobytes como LruCache leva uma / / int em seu construtor. ltima int MaxMemory = ( int ) ( Runtime . getRuntime (). MaxMemory () / 1024 ); / / Use 1/8th da memria disponvel para esta memria
Nota: Neste exemplo, um oitavo da memria do aplicativo alocado para o cache. Em um dispositivo normal de / hdpi isto um mnimo de cerca de 4MB (32/8). A tela cheia GridView preenchido com as imagens de um dispositivo com resoluo de 800x480 usaria cerca de 1.5MB (800 * 480 * 4 bytes), ento isso seria armazenar em cache um mnimo de cerca de 2,5 pginas de imagens na memria. Ao carregar um bitmap em um ImageView , o LruCache verificada pela primeira vez. Se uma entrada for encontrada, ela ser imediatamente utilizado para atualizar o ImageView , caso contrrio, uma discusso de fundo gerado para processar a imagem:
public void loadBitmap(int resId, ImageView imageView) { final String imageKey = String.valueOf(resId); final Bitmap bitmap = getBitmapFromMemCache(imageKey); if (bitmap != null) { mImageView.setImageBitmap(bitmap); } else { mImageView.setImageResource(R.drawable.image_placeholder); BitmapWorkerTask task = new BitmapWorkerTask(mImageView);
task.execute(resId); } }
O BitmapWorkerTask tambm precisa ser atualizado para adicionar entradas no cache de memria:
classe BitmapWorkerTask ... / imagem / Decode em estende AsyncTask < Integer , Vcuo , Bitmap > {
Acabado de inicializao mDiskCacheLock . notifyAll (); } retornar nulo ; } } class BitmapWorkerTask ... image / / Decode em estende
Vcuo ,
Bitmap >
Verifique cache de disco no fundo fio Bitmap bitmap = getBitmapFromDiskCache ( ImageKey ); se ( bitmap == nulo ) { / / No foi encontrado no cache de disco / / Processo como normal final, Bitmap bitmap = decodeSampledBitmapFromResource ( getResources (), params [ 0 ], 100 , 100 ));
Adicionar ao cache de memria, como antes se ( getBitmapFromMemCache ( chave ) == NULL ) mMemoryCache . colocar ( chave , bitmap ); } / / Alm disso, adicione a disco
Cria um subdiretrio nico do diretrio designado cache do aplicativo. Tenta usar externo / / mas se no for montado, cai de volta no armazenamento interno. pblico esttico Arquivo getDiskCacheDir ( Context contexto , Cordas uniqueName ) / / Verifique se a mdia est montado ou armazenamento built-in, em caso afirmativo, e tentar usar externo o cache dir / / caso contrrio usar cache interno
Nota: Mesmo inicializar o cache de disco requer operaes de disco e, portanto, no deve ter lugar no segmento principal. No entanto, isso no significa que h uma chance de que o cache acessada antes da inicializao. Para resolver isso, na implementao acima, um objeto de bloqueio garante que o aplicativo no l a partir do cache do disco at que o cache foi inicializado. Enquanto a memria cache verificado no segmento de interface do usurio, o cache de disco verificado no segmento de plano de fundo. Operaes de disco nunca deve ter lugar no segmento. Quando o processamento de imagem est completa, o mapa de bits final adicionado memria cache de disco e para utilizao futura.
Para testar isso, tente rodar um dispositivo com e sem reteno do fragmento . Voc deve perceber pouco ou nenhum lag como as imagens preencher a atividade quase que instantaneamente da memria quando voc mantm o cache. Quaisquer imagens que no so encontrados no cache de memria so esperanosamente disponvel no cache de disco, se no, eles so processados como de costume.
EXPERIMENT-LO
Baixe o exemplo
BitmapFun.zip
Alm das etapas descritas no cache bitmaps , h coisas especficas que voc pode fazer para facilitar a coleta de lixo e reutilizao de bitmap. A estratgia recomendada depende de qual verso (s) do Android que voc est alvejando. OBitmapFun amostra aplicativo includo com esta classe mostra como projetar seu aplicativo para trabalhar de forma eficiente em diferentes verses do Android. Para preparar o terreno para esta lio, aqui est como o gerenciamento de memria do Android bitmap evoluiu:
No Android 2.2 Android (API nvel 8) e inferior, quando ocorre a coleta de lixo, fios de seu aplicativo ficar parado. Isso faz com que um atraso que pode prejudicar o desempenho.Android 2.3 adiciona coleta de lixo simultnea, o que significa que a memria recuperada logo aps um bitmap no mais referenciado. No Android 2.3.3 (API nvel 10) e inferior, os dados de pixel de apoio para um mapa de bits so armazenados na memria nativa. separado do prprio bitmap, que armazenada na pilha Dalvik. Os dados de pixel na memria nativa no liberado de uma maneira previsvel, podendo causar um aplicativo para ultrapassar brevemente os seus limites de memria e de coliso. partir do Android 3.0 (API Nvel 11), os dados de pixel armazenado na pilha Dalvik juntamente com o associado bitmap.
As sees a seguir descrevem como otimizar o gerenciamento de memria bitmap para diferentes verses do Android.
A contagem de referncia tanto para mDisplayRefCount e mCacheRefCount 0. O bitmap no nulo , e ainda no foi reciclada.
particular int mCacheRefCount = 0 ; particular int mDisplayRefCount = 0 ; ... / / Notificar desenhvel o que o estado exibido mudou. / / manter uma contagem para determinar quando o desenhvel j no est
Verifique se reciclar () pode ser chamado. checkstate (); } / / Avisa o drawable que o estado de cache mudou. / / Manter uma contagem para determinar quando o drawable no est sendo
Verifique se reciclar () pode ser chamado. checkstate (); } privado sincronizado vazio checkstate () { / / Se o cache drawable e exibio ref contagem = 0, e este drawable / / foi apresentado, em seguida,
O mapa de bits deve ser reutilizado com o mesmo tamanho que o contedo de origem (para assegurar que a mesma quantidade de memria seja usado), e no formato PNG (quer como um recurso ou como um fluxo) ou JPEG. A configurao do bitmap reutilizados substitui a configurao de inPreferredConfig , se definido. Voc deve sempre usar o bitmap retornado do mtodo de decodificao, pois no se pode presumir que a reutilizao do bitmap de trabalho (por exemplo, se h uma incompatibilidade de tamanho).
/ / que foi removido do cache de memria. (( RecyclingBitmapDrawable ) oldValue ). setIsCached ( false ); mais { . / / A entrada removida uma BitmapDrawable padro se ( Utils . hasHoneycomb ()) { / / Estamos rodando em Honeycomb ou mais tarde, ento adicionar o / / para um SoftReference definido para possvel uso com inBitmap
bitmap mais tarde. mReusableBitmaps . adicionar ( novo SoftReference < Bitmap > ( oldValue . GetBitmap () )); } } } .... }
O prximo trecho mostra a addInBitmapOptions () mtodo que chamado no trecho acima. Ele procura por um bitmap existente para definir como o valor para inBitmap . Note-se que este mtodo s define um valor para inBitmap se encontrar um par adequado (o seu cdigo nunca deve assumir que um jogo vai ser encontrado):
privadas estticos vazio addInBitmapOptions ( BitmapFactory . Opes opes , ImageCache de cache ) { / / inBitmap s funciona com mutveis bitmaps, para forar o decodificador / / retorno mutveis bitmaps. opes . inMutable = verdadeiro ; se ( esconderijo ! = NULL ) { / / Tente encontrar um bitmap para usar inBitmap. Bitmap inBitmap = esconderijo . getBitmapFromReusableSet ( opes ); se ( inBitmap ! = NULL ) { / / Se um bitmap adequado foi encontrado, defina-o como o valor de / / inBitmap. opes . inBitmap = inBitmap ;
} } }
Verifique que o item pode ser usado para inBitmap. se ( canUseForInBitmap ( artigo , opes )) { bitmap = artigo ; / / Remover dos conjunto reutilizvel por isso no pode ser usado novamente. iterator . remover (); pausa ; } } } } retorno bitmap ; } } mais { / / remover a partir do conjunto se a referncia foi apagada. iterator . remover ();
Finalmente, este mtodo determina se um mapa de bits candidato satisfaz os critrios de tamanho a ser usado para inBitmap :
Retorna true se "candidato" pode ser usado para inBitmap re-uso com / / "targetOptions". retorno candidato . getWidth () == largura && candidato . getHeight () altura ; }
==
EXPERIMENT-LO
Baixe o exemplo
BitmapFun.zip
Esta lio rene tudo de lies anteriores, mostrando-lhe como carregar vrios bitmaps em ViewPager e GridViewcomponentes utilizando um thread em segundo plano e cache de bitmap, ao lidar com a concorrncia e alteraes de configurao.
Contm apenas um
Aqui est uma implementao do detalhes Fragment que detm os ImageView filhos. Isto pode parecer uma abordagem perfeitamente razovel, mas voc pode ver as desvantagens desta implementao? Como poderia ser melhorado?
Espero que voc percebeu o problema: as imagens esto sendo lidos a partir de recursos no segmento interface do usurio, que pode levar a um pedido de suspenso e ser vigor fechado. Usando um AsyncTask conforme descrito no Processamento de bitmaps Off the Tpico UI aula, simples de mover a imagem de carregamento e processamento para uma discusso de fundo:
Clame a ImageDetailActivity para carregar o bitmap em uma discusso de fundo (( ImageDetailActivity ) getActivity ()). LoadBitmap ( RESID , mImageView ); } } }
Qualquer outro tratamento suplementar (como redimensionamento ou imagens buscar a partir da rede) pode ter lugar no BitmapWorkerTask sem afetar a capacidade de resposta da interface do usurio principal. Se a linha de fundo est a fazer mais do que apenas a carga de uma imagem directamente a partir do disco, mas tambm pode ser benfica para adicionar uma memria e / ou o cache de disco, tal como descrito na lioCache bitmaps . Eis as modificaes adicionais para um cache de memria:
Colocando todos estes pedaos juntos d uma resposta ViewPager aplicao com o mnimo de latncia de carregamento de imagens ea capacidade de fazer tanto ou to pouco processamento em segundo plano em suas imagens, se necessrio.
Mais uma vez, o problema com esta implementao que a imagem est sendo definido no segmento.Enquanto isto pode funcionar para pequenas imagens simples (devido ao recurso de carga do sistema e cache), se algum processamento adicional precisa ser feito, a interface do usurio sofre uma parada. Processamento e armazenamento em cache mtodos da seo anterior do mesmo assncrona pode ser implementado aqui. No entanto, tambm preciso cuidado com as questes de simultaneidade como oGridView recicla seus filhos views. Para lidar com isso, usar as tcnicas discutidas nos bitmaps processamento off o segmento lio. Aqui est a soluo actualizao:
Cancelar tarefa anterior bitmapWorkerTask . cancelar ( verdadeiro ); mais { / / O mesmo trabalho j est em andamento retorno falso ;
Nota: O mesmo cdigo podem facilmente ser adaptado para funcionar com ListView bem. Esta implementao permite flexibilidade na forma como as imagens so processadas e carregado, sem impedir a suavidade da interface do usurio. Na tarefa de fundo que voc pode carregar imagens a partir da rede ou redimensionar grandes fotos da cmera digital e as imagens aparecem como as tarefas concluir o processamento. Para um exemplo completo deste e de outros conceitos discutidos nesta lio, consulte o aplicativo de amostra includo.
DEPENDNCIAS E PR-REQUISITOS
Android 2.2 (API Nvel 8) ou superior Experimente a construo de umaplicativo Android
EXPERIMENT-LO
Baixe o exemplo
OpenGLES.zip
O quadro Android oferece muitas ferramentas padro para a criao de interfaces grficas de usurio atraentes, funcionais.No entanto, se voc quer mais controle do que o seu aplicativo desenha na tela, ou se aventurar em grficos tridimensionais, voc precisa usar uma ferramenta diferente. As APIs OpenGL ES fornecido pelo framework Android oferece um conjunto de ferramentas para a exibio de high-end, grficos animados que so limitadas somente por sua imaginao e tambm podem se beneficiar da acelerao de unidades de processamento grfico (GPUs) fornecidas em muitos dispositivos Android. Esta classe percorre os conceitos bsicos de desenvolvimento de aplicaes que usam OpenGL, incluindo a instalao, objetos de desenho, mveis elementos desenhados e respondendo ao toque de entrada. O cdigo de exemplo esta classe usa o OpenGL ES 2.0 APIs, que a verso da API recomendada para uso com dispositivos Android atuais. Para mais informaes sobre as verses do OpenGL ES, consulte o OpenGL guia do desenvolvedor. Nota: Tenha cuidado para no misturar ES chamadas de API OpenGL 1.x com OpenGL ES 2.0 mtodos! As duas APIs no so intercambiveis e tentar us-los juntos s resulta em frustrao e tristeza.
Lies
Construindo um Ambiente OpenGL ES Saiba como configurar uma aplicao Android para ser capaz de desenhar grficos OpenGL. Definindo Shapes Aprenda a definir formas e por que voc precisa saber sobre os rostos e sinuosas. Formas de desenho Aprenda a desenhar formas OpenGL em sua aplicao. Aplicando projeo e Camera Visualizaes Aprenda a usar exibies de projeo e cmera para obter uma nova perspectiva sobre os objetos desenhados. Adicionando Movimento Aprenda a fazer movimento bsico e animao de objetos desenhados com OpenGL. Respondendo a eventos de toque
EXPERIMENT-LO
Baixe o exemplo
OpenGLES.zip
A fim de desenhar grficos com OpenGL ES em seu aplicativo Android, voc deve criar um recipiente vista por eles. Uma das mais simples e direta maneiras de fazer isso implementar tanto a GLSurfaceView e GLSurfaceView.Renderer . AGLSurfaceView um recipiente vista para grficos desenhados com OpenGL e GLSurfaceView.Renderercontrola o que desenhado dentro desse ponto de vista. Para mais informaes sobre essas classes, consulte o OpenGL ESguia do desenvolvedor.
GLSurfaceView apenas uma maneira de incorporar grficos OpenGL ES em sua aplicao. Para uma
visualizao em tela cheia ou quase cheia grficos da tela, uma escolha razovel.Os desenvolvedores que desejam incorporar grficos OpenGL ES em uma pequena parcela de seus layouts deve dar uma olhada em TextureView . Pois, do-it-yourself desenvolvedores reais, tambm possvel construir uma viso OpenGL ES usando SurfaceView , mas isso requer escrever um pouco de cdigo adicional. Esta lio explica como concluir uma implementao mnima de GLSurfaceView e GLSurfaceView.Rendererem uma atividade de aplicao simples.
Se o seu aplicativo usa compresso de textura, voc tambm deve declarar que formatos de compresso voc apoiar para que os dispositivos que no suportam formatos de teses no tente executar o aplicativo:
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
Para obter mais informaes sobre formatos de compresso de textura, consulte o OpenGL guia do desenvolvedor.
Os aplicativos do Android que utilizam o OpenGL ES tm atividades como qualquer outro aplicativo que possui uma interface de usurio. A principal diferena de outras aplicaes o que voc colocar no layout para sua atividade. Enquanto em muitas aplicaes que voc pode usar TextView , Boto e ListView , em um aplicativo que usa OpenGL ES, voc tambm pode adicionar um GLSurfaceView . O exemplo de cdigo a seguir mostra uma implementao mnima de uma atividade que utiliza umGLSurfaceView como seu ponto de vista primrio:
Criar uma instncia GLSurfaceView e configur-lo / / como o ContentView para esta atividade. mGLView = new MyGLSurfaceView ( este ); setContentView ( mGLView ); } }
Nota: OpenGL ES 2.0 requer Android 2.2 (API Nvel 8) ou superior, para se certificar de suas metas do projeto Android que API ou superior.
pblico MyGLSurfaceView ( Context contexto ) { super ( contexto ); / / definir o processador para desenhar sobre a GLSurfaceView setRenderer ( novo MyRenderer ()); } }
Ao usar o OpenGL ES 2.0, voc deve adicionar outra chamada para o seu GLSurfaceView construtor, especificando que voc quer usar a API 2.0:
/ / Criar um contexto OpenGL ES 2.0 setEGLContextClientVersion ( 2 );
Nota: Se voc estiver usando a API OpenGL ES 2.0, certifique-se de declarar isso no seu manifesto do aplicativo. Para mais informaes, consulte Declare OpenGL ES Uso do Manifesto . Uma outra adio opcional para o seu GLSurfaceView implementao para definir o modo de renderizao para desenhar apenas a vista quando h uma mudana em seus dados de desenho usando oGLSurfaceView.RENDERMODE_WHEN_DIRTY configurao:
/ / Processar a vista apenas quando h uma mudana no desenho dados setRenderMode ( GLSurfaceView . RENDERMODE_WHEN_DIRTY );
Essa configurao impede que o GLSurfaceView quadro de ser redesenhado at que voc chamerequestRender () , que mais eficiente para este aplicativo de exemplo.
orientao da tela do dispositivo. Aqui est uma implementao bsica de um renderizador OpenGL ES, que no faz nada mais do que desenhar um fundo cinza no GLSurfaceView :
pblico classe MyGL20Renderer implementa GLSurfaceView . Renderer { {
pblico vcuo onSurfaceCreated ( GL10 no utilizado , EGLConfig configurao ) / / Define a cor de fundo quadro GLES20 . glClearColor ( 0.5f , 0.5f , 0.5f , 1.0f ); } pblico vazio onDrawFrame ( GL10 no utilizado ) { / / Redesenhar cor de fundo GLES20 . glClear ( GLES20 . GL_COLOR_BUFFER_BIT ); } pblico { GLES20 . glViewport ( 0 , } } 0 , largura , altura ); vazio onSurfaceChanged ( GL10 no utilizado , int largura ,
int altura )
Isso tudo que existe para ela! Os exemplos de cdigo acima criar uma aplicao Android simples que exibe uma tela cinza usando OpenGL. Embora esse cdigo no faz nada de muito interessante, criando essas classes, que lanou as bases que voc precisa para comear a desenhar elementos grficos com OpenGL. Nota: Voc pode se perguntar por que esses mtodos tm um GL10 parmetro, quando voc est usando o OpengGL ES APIs 2.0. Estas assinaturas de mtodos so simplesmente reutilizado para as APIs 2.0 para manter o cdigo do framework Android mais simples. Se voc estiver familiarizado com a APIs OpenGL ES, agora voc deve ser capaz de criar um ambiente de OpenGL ES em seu aplicativo e comear a desenhar grficos. No entanto, se voc precisa de um pouco mais de ajuda para comear com OpenGL, de cabea para as prximas aulas para mais algumas dicas.
Definindo Shapes
ANTERIORPRXIMA
Ser capaz de definir formas de ser elaborado no contexto de uma viso OpenGL ES o primeiro passo na criao de sua obra-prima grficos high-end. Desenhando com OpenGL ES pode ser um pouco complicado, sem saber algumas coisas bsicas sobre como OpenGL ES espera que voc definir objetos grficos. Esta lio explica o sistema de coordenadas OpenGL ES em relao a uma tela do dispositivo Android, o bsico de definio de uma forma, rostos de forma, bem como a definio de um tringulo e um quadrado.
Defina um tringulo
OpenGL ES permite definir objetos desenhados usando coordenadas no espao tridimensional. Ento, antes que voc pode desenhar um tringulo, voc deve definir as suas coordenadas. Em OpenGL, a maneira comum de fazer isso definir um conjunto de vrtices de nmeros de ponto flutuante para as coordenadas. Para a mxima eficincia, voc escreve estas coordenadas em um ByteBuffer , que passado para o pipeline de grficos OpenGL ES para processamento.
class Triangle {
privado
FloatBuffer VertexBuffer ;
/ / nmero de coordenadas por vrtice nesta matriz esttica final, int COORDS_PER_VERTEX = 3 ; estticos flutuador triangleCoords [] = { / / para a esquerda: 0.0f , 0.622008459f , 0.0f , / / top - 0.5f , - 0.311004243f , 0.0f , / / inferior esquerdo 0.5f , - 0.311004243f , 0.0f / / inferior direito
}; / / Set de cores com valores de alfa (opacidade), vermelho, verde, azul e flutuar cor [] = { 0.63671875f , 0.76953125f , 0.22265625f , 1.0f }; pblico Triangle () { / / inicializa o buffer de bytes vrtice de forma coordena ByteBuffer bb = ByteBuffer . allocateDirect ( / / (nmero de valores de coordenadas * 4 bytes por float) triangleCoords . comprimento * 4 ); / / use nativo byte ordem do hardware do dispositivo bb . ordem ( ByteOrder . nativeOrder ()); / / cria um buffer de ponto flutuante do ByteBuffer VertexBuffer = bb . asFloatBuffer (); / / adiciona as coordenadas para a FloatBuffer VertexBuffer . colocar ( triangleCoords ); / / definir o buffer para ler a primeira coordenada VertexBuffer . posio ( 0 ); } }
Por padro, o OpenGL ES assume um sistema de coordenadas onde [0,0,0] (X, Y, Z) especifica o centro daGLSurfaceView quadro, [1,1,0] o canto superior direito do quadro e [- 1, -1,0] canto inferior esquerdo do quadro. Para uma ilustrao deste sistema de coordenadas, consulte o OpenGL ES guia do desenvolvedor. Note-se que as coordenadas desta forma so definidos numa ordem anti-horrio. A ordem de desenho importante porque ele define qual o lado da face frontal da forma que voc normalmente quer ter desenhado, eo rosto de volta, que voc pode optar por no desenhar usando o recurso de rosto abater OpenGL ES. Para mais informaes sobre os rostos e abate, consulte o OpenGL ES guia do desenvolvedor.
Definindo tringulos muito fcil em OpenGL, mas que se voc deseja obter um um pouco mais complexo?Digamos, um quadrado? H um certo nmero de maneiras de fazer isso, mas um caminho tpico para desenhar uma forma tal em OpenGL ES usar dois tringulos desenhados em conjunto:
Novamente, voc deve definir os vrtices em uma ordem anti-horrio para ambos os tringulos que representam esta forma, e colocar os valores em um ByteBuffer . A fim de evitar definir as duas coordenadas compartilhadas por cada tringulo duas vezes, usar uma lista de desenho para contar a pipeline de grficos OpenGL ES como desenhar esses vrtices. Aqui est o cdigo para esta forma:
classe
Praa
privado privado
/ / nmero de coordenadas por vrtice nesta matriz esttica ltima int COORDS_PER_VERTEX = 3 ; estticos flutuador squareCoords [] = { - 0.5f , 0.5f , 0.0f , / / superior esquerdo - 0.5f , - 0.5f , 0.0f , / / canto inferior esquerdo 0.5f , - 0.5f , 0.0f , / / inferior direito 0.5f , 0.5f , 0.0f }; / / superior direito privado curto DRAWORDER [] chamar vrtices = { 0 , 1 , 2 , 0 , 2 , 3 }; / / fim de
pblico Praa () { / / inicializa o buffer de bytes vrtice de coordenadas de forma ByteBuffer bb = ByteBuffer . allocateDirect ( / / (nmero de valores de coordenadas * 4 bytes por
inicializar buffer de bytes para a lista de sorteio ByteBuffer dlb = ByteBuffer . allocateDirect ( / / (nmero de valores de coordenadas * 2 bytes por
Este exemplo d uma espiada no que preciso para criar formas mais complexas com OpenGL. Em geral, voc usa colees de tringulos para desenhar objetos. Na prxima lio, voc aprende como desenhar essas formas na tela.
Formas de desenho
ANTERIORPRXIMA
Depois de definir formas a serem desenhadas com OpenGL, voc provavelmente vai querer desenhlos. Desenhar formas com o OpenGL ES 2.0 leva um pouco mais de cdigo do que voc pode imaginar, porque a API fornece uma grande quantidade de controle sobre o processamento pipeline de grficos. Esta lio explica como desenhar as formas que voc definiu na lio anterior usando a API OpenGL ES 2.0.
Inicializar Shapes
Antes de fazer qualquer desenho, voc deve inicializar e carregar as formas que voc pretende desenhar. A menos que a estrutura (as coordenadas originais) das formas que voc usa em sua mudana de programa durante o curso da execuo, voc dever inicializa-la no onSurfaceCreated () mtodo do seu processador para a memria ea eficincia de processamento.
pblico ... vazio onSurfaceCreated ( GL10 no utilizado , EGLConfig configurao ) {
/ / inicializa um tringulo mTriangle = new Triangle (); / / inicializa uma praa mSquare = new Praa (); }
Vertex Shader - OpenGL ES cdigo grfico para renderizar os vrtices de uma forma. Fragment Shader - cdigo OpenGL ES para processar o rosto de uma forma com cores ou texturas. Programa - Um objeto OpenGL ES que contm os shaders que voc deseja usar para desenhar uma ou mais formas.
Voc precisa de pelo menos um shader vertex para desenhar uma forma e um fragmento de shader de cor que forma. Estes shaders devem ser respeitadas e depois adicionada a um programa OpenGL ES, que ento utilizado para desenhar a forma. Aqui est um exemplo de como definir shaders bsicos que voc pode usar para desenhar uma forma:
privado ltima seqncia vertexShaderCode = "atributo vec4 vPosition;" + "void main () {" + "gl_Position = vPosition;" + "}" ; privado ltima seqncia fragmentShaderCode = "mediump bia de preciso;" + "uniforme vec4 vColor"; + "void main () {" + "gl_FragColor = vColor;" + "}" ;
Shaders conter OpenGL Shading Language (GLSL), cdigo que deve ser compilado antes de us-lo no ambiente de OpenGL ES. Para compilar este cdigo, crie um mtodo utilitrio na classe renderer:
pblico static int loadShader ( int tipo , Cordas shaderCode ) {
/ / cria um tipo de shader de vrtice (GLES20.GL_VERTEX_SHADER) / / ou um tipo de shader de fragmento (GLES20.GL_FRAGMENT_SHADER) int shader = GLES20 . glCreateShader ( tipo ); / / adiciona o cdigo fonte para o shader e compil-lo GLES20 . glShaderSource ( shader , shaderCode ); GLES20 . glCompileShader ( shader ); retorno shader ; }
A fim de chamar a sua forma, voc deve compilar o cdigo shader, adicion-los a um objeto de programa OpenGL ES e, em seguida, ligar o programa. Faa isso no construtor do objeto desenhado, por isso feito uma nica vez. Nota: Compilando shaders OpenGL ES e vinculando programas caro em termos de ciclos de CPU e tempo de processamento, de modo que voc deve evitar fazer isso mais de uma vez. Se voc no sabe o contedo de seus shaders em tempo de execuo, voc deve construir o seu cdigo de tal forma que eles s so criados uma vez e, em seguida, armazenados em cache para uso posterior.
criar vazio Programa OpenGL ES GLES20 . glAttachShader ( mProgram , vertexShader ); / / adiciona o shader de vrtice para o programa GLES20 . glAttachShader ( mProgram , fragmentShader ); / / adiciona o shader fragmento de programa GLES20 . glLinkProgram ( mProgram ); / / cria OpenGL executveis do programa ES }
Neste ponto, voc est pronto para adicionar as chamadas reais que atraem a sua forma. Desenho formas com OpenGL ES requer que voc especifique diversos parmetros para dizer o pipeline de renderizao que voc quer desenhar e como desenh-la. Desde opes de desenho podem variar de acordo com a forma, uma boa idia ter suas aulas de forma conter sua prpria lgica de desenho. Criar um draw () mtodo para desenhar a forma. Este cdigo define a posio e cor valores de sombreamento de vrtice da forma e shader de fragmento, e, em seguida, executa a funo de desenho.
pblico vazio draw () { / / Adicionar programa para OpenGL ambiente ES GLES20 . glUseProgram ( mProgram ); / / pega pega para vPosition membro do shader de vrtice mPositionHandle = GLES20 . glGetAttribLocation ( mProgram , / / Ativar um identificador para o vrtices do tringulo GLES20 . glEnableVertexAttribArray ( mPositionHandle ); "vPosition" );
conseguir lidar com a vColor membro fragmento do shader mColorHandle = GLES20 . glGetUniformLocation ( mProgram , cor / / Set para desenhar o tringulo GLES20 . glUniform4fv ( mColorHandle , uma , cor , 0 );
"vColor" );
0 , VertexCount );
Uma vez que voc tem todo esse cdigo no lugar, tirando esse objeto requer apenas uma chamada para o draw () mtodo de dentro do seu renderizador onDrawFrame () mtodo. Quando voc executa o aplicativo, ele deve ser algo parecido com isto:
Existem alguns problemas com este exemplo de cdigo. Primeiro de tudo, ele no est indo para impressionar seus amigos. Em segundo lugar, o tringulo um pouco achatada e muda de forma quando voc muda a orientao da tela do dispositivo. A razo pela qual a forma enviesada devido ao facto de que os vrtices do objeto no foram corrigidos para as propores da rea da tela, onde a GLSurfaceView exibida. Voc pode corrigir esse problema usando uma projeo e viso da cmera na prxima lio. Por ltimo, o tringulo estacionria, que um pouco aborrecido. No Movimento Adicionando lio, voc faz esta forma girar e fazer um uso mais interessante do pipeline de grficos OpenGL ES.
No ambiente OpenGL ES, vistas de projeo e cmera permitem que voc exiba objetos desenhados de uma forma que mais se assemelha ao modo como voc v os objetos fsicos com seus olhos. Esta simulao da viso fsica feito com transformaes matemticas de coordenadas de objetos desenhados:
Projeco - Esta transformao ajusta as coordenadas dos objectos desenhados com base na largura e altura daGLSurfaceView onde so exibidos. Sem esse clculo, objetos desenhados por OpenGL ES so distorcidos pelas propores desiguais da janela de exibio. A transformao de projeo normalmente s tem que ser calculado quando as propores da vista OpenGL so estabelecidos ou alterados na onSurfaceChanged ()mtodo do seu representante. Para mais informaes sobre as projees da OpenGL ES e coordenar mapeamento, consulte coordenadas de mapeamento para objetos desenhados . Cmara Vista - Esta transformao ajusta as coordenadas de objetos desenhados com base em uma posio da cmera virtual. importante notar que o OpenGL ES no define um objeto cmera real, mas em vez disso fornece mtodos utilitrios que simulam uma cmera, transformando a exibio de objetos desenhados. A transformao de viso da cmera pode ser calculado apenas uma vez, quando voc estabelecer suaGLSurfaceView , ou pode mudar dinamicamente com base em aes do usurio ou a funo do aplicativo.
Esta lio descreve como criar uma vista de projeo e cmera e aplic-la a formas desenhadas em suaGLSurfaceView .
int largura ,
int altura )
/ / esta matriz de projeo aplicada ao objeto coordenadas / / no onDrawFrame () mtodo Matrix . frustumM ( mProjMatrix , 0 , - relao , proporo , ); }
- 1 ,
1 ,
3 ,
Este cdigo preenche uma matriz de projeo, mProjMatrix que voc pode combinar com uma transformao cmera de viso no onDrawFrame () mtodo, que apresentado na prxima seo. Nota: S a aplicao de uma transformao de projeo de seus objetos de desenho normalmente resulta em uma exposio muito vazio. Em geral, voc deve tambm aplicar uma transformao de viso da cmera, para que qualquer coisa que aparecer na tela.
- 3 ,
0f ,
0f ,
0f ,
0f ,
/ / Calcular a projeo e vista transformao Matrix . multiplyMM ( mMVPMatrix , 0 , mProjMatrix , / / Desenha forma mTriangle . desenhar ( mMVPMatrix ); }
0 , mVMatrix ,
0 );
/ / obtm lidar com a forma de transformao da matriz mMVPMatrixHandle = GLES20 . glGetUniformLocation ( mProgram , / / Aplicar a projeo e transformao vista GLES20 . glUniformMatrix4fv ( mMVPMatrixHandle , / / desenha o tringulo GLES20 . glDrawArrays ( GLES20 . GL_TRIANGLES , ... } 1 ,
"uMVPMatrix" ); 0 );
falso , mvpMatrix ,
0 , VertexCount );
Depois de ter calculado atravs corretamente e aplicou a projeo e transformaes de vista de cmara, os objetos grficos so desenhados em propores corretas e deve ficar assim:
Agora que voc tem um aplicativo que exibe suas formas em propores corretas, hora de adicionar movimento s suas formas.
Adicionando Movimento
ANTERIORPRXIMA
Desenhar objetos na tela uma caracterstica bastante bsico de OpenGL, mas voc pode fazer isso com outras classes Framwork grficos Android, incluindo Canvas e Drawableobjetos. OpenGL ES oferece recursos adicionais para mover e transformar objetos desenhados em trs dimenses ou de outras formas nicas para criar experincias de usurio atraentes. Nesta lio, voc dar mais um passo em frente para usar OpenGL ES, aprendendo a adicionar movimento a uma forma de rotao.
Girando um objeto de desenho com OpenGL ES 2.0 relativamente simples. Voc pode criar uma outra matriz de transformao (a matriz de rotao) e, em seguida, combin-lo com a sua projeo e cmera de viso matrizes tranformation:
privado pblico ... flutuador [] mRotationMatrix = new vazio onDrawFrame ( GL10 gl ) { flutuador [ 16 ];
Combine a matriz de rotao com a projeo e cmera de viso Matrix . multiplyMM ( mMVPMatrix , 0 , mRotationMatrix , 0 , mMVPMatrix , / / Desenha tringulo mTriangle . desenhar ( mMVPMatrix ); }
0 );
Se o seu tringulo no roda aps fazer essas alteraes, certifique-se de ter comentado oGLSurfaceView.RENDERMODE_WHEN_DIRTY configurao, conforme descrito na prxima seo.
A menos que voc tem objetos de mudana, sem qualquer interao do usurio, geralmente uma boa idia ter esse sinalizador ligado. Esteja pronto para tire esse cdigo, porque a prxima aula faz este apelo aplicvel uma vez.
Fazer objetos se movem de acordo com um programa pr-como tringulo do rotativo til para obter um pouco de ateno, mas que se voc quiser ter os usurios interagem com seus grficos OpenGL ES? A chave para fazer o OpenGL ES interativa sensvel ao toque aplicao est expandindo sua implementao GLSurfaceView para substituir oonTouchEvent () para ouvir eventos de toque.
Esta lio mostra como ouvir para eventos de toque para permitir aos usurios girar um objeto OpenGL ES.
sentido de rotao inverso acima da linha mdia se ( y > getHeight () / 2 ) { dx = dx * - 1 ; } / direo / reverso da rotao para a esquerda da linha mdia , se ( x < getWidth () / 2 ) { dy = dy * - 1 ; } mRenderer . mangle + = / 320 requestRender (); } mPreviousX = x ; mPreviousY = y ; retornar verdadeiro ; } ( dx + dy ) * TOUCH_SCALE_FACTOR ; / / = 180.0f
Observe que aps o clculo do ngulo de rotao, este mtodo chama requestRender () para dizer ao representante que hora de tornar o quadro. Esta abordagem o mais eficaz neste exemplo porque o quadro no precisam de ser redesenhada a menos que haja uma alterao na rotao. No entanto, ele no tem qualquer impacto sobre a eficincia, a menos que voc tambm solicitar que o renderizador apenas redesenhar quando as alteraes de dados usando o setRenderMode () mtodo, ento certifique-se esta linha comentada no processador:
pblico MyGLSurfaceView ( Context contexto ) { ... / / Processar a vista apenas quando h uma mudana no desenho dados setRenderMode ( GLSurfaceView . RENDERMODE_WHEN_DIRTY ); }
Aplicar Rotation
Para aplicar a rotao gerada pela entrada de toque, comente o cdigo que gera um ngulo e adicionar mangle , que contm o ngulo de entrada gerado toque:
pblico vazio onDrawFrame ( GL10 gl ) { ... / / Cria uma rotao para o tringulo / / long time = SystemClock.uptimeMillis ()% 4000L; ngulo / / bia = 0.090f * ((int) tempo); Matrix . setRotateM ( mRotationMatrix , 0 , mangle ,
0 ,
0 ,
- 1.0f ); 0 );
/ / Combine a matriz de rotao com a projeo e cmera de viso Matrix . multiplyMM ( mMVPMatrix , 0 , mRotationMatrix , 0 , mMVPMatrix , / / Desenha tringulo mTriangle . empate ( mMVPMatrix ); }
Quando voc tiver concludo as etapas descritas acima, execute o programa e arrastar o dedo sobre a tela para girar o tringulo:
Figura 1. Tringulo sendo rodado com a entrada de toque (crculo mostra a localizao de toque).
Adicionando animaes
COMEAR
DEPENDNCIAS E PR-REQUISITOS
Android 4.0 ou posterior Experimente construir um Android User Interface
EXPERIMENT-LO
Faa o download do aplicativo de exemplo
Animations.zip
As animaes podem adicionar elementos visuais sutis que avisam os usurios sobre o que est acontecendo em seu aplicativo e melhorar o seu modelo mental de interface de seu aplicativo. Animaes so especialmente teis quando a tela muda de estado, tais como quando as cargas de contedo ou novas aes se tornam disponveis. Animaes tambm pode adicionar um olhar polido para sua aplicao, o que d a sua aplicao uma sensao de qualidade superior. Tenha em mente, porm, que o uso excessivo de animaes ou utiliz-los na hora errada pode ser prejudicial, como quando eles causam atrasos. Esta classe de treinamento mostra como implementar alguns tipos comuns de animaes que podem aumentar a usabilidade e adicionar um toque sem irritar seus usurios.
Lies
Misturar duas vistas Aprenda a crossfade entre duas vises que se sobrepem. Esta lio mostra como crossfade um indicador de progresso para uma exibio que contm o contedo do texto. Usando ViewPager para Slides de tela Aprenda a animar entre telas adjacentes horizontalmente com uma transio de deslizamento. Exibindo Carto Animations Virar Saiba como animar entre dois pontos de vista com um movimento de inverso. Zoom Vista Saiba como aumentar pontos de vista com uma animao touch-to-zoom. Animando Alteraes de layout Saiba como ativar o built-in animaes quando adicionar, remover ou atualizar exibies criana em um layout.
EXPERIMENT-LO
Faa o download do aplicativo de exemplo
Animations.zip
Animaes Crossfade (tambm conhecido como dissolver) desvanecem-se gradualmente para fora um componente UI simultaneamente, desaparecendo em outro. Esta animao til para situaes em que voc quer mudar o contedo ou vistas em seu aplicativo. Crossfades so muito sutis e curta, mas oferecer uma transio fluida de uma tela para a outra.Quando voc no us-los, no entanto, as transies muitas vezes se sentem abrupta ou apressada. Aqui est um exemplo de um crossfade de um indicador de progresso para algum contedo de texto. Animao Crossfade
Se voc quiser ir em frente e ver um exemplo de trabalho completo, baixar e executar o aplicativo de exemplo e selecione o exemplo Crossfade. Veja os seguintes arquivos para a execuo de cdigo:
src / CrossfadeActivity.java layout / activity_crossfade.xml Menu / activity_crossfade.xml
Criar as vistas
Crie os dois pontos de vista que voc quer crossfade. O exemplo a seguir cria um indicador de progresso e uma exibio de texto de rolagem:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView style="?android:textAppearanceMedium" android:lineSpacingMultiplier="1.2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/lorem_ipsum" android:padding="16dp" /> </ScrollView> <ProgressBar android:id="@+id/loading_spinner" style="?android:progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content"
Configure o Animation
Para configurar a animao: 1. Criar variveis de membros para os pontos de vista que voc quer crossfade. Voc precisa dessas referncias mais tarde, quando modificar os pontos de vista durante a animao. 2. Para o ponto de vista que est sendo desapareceu em, defina sua visibilidade para IDO . Isso evita que a vista ocupando espao layout e omite que a partir de clculos de layout, acelerando o processamento. 3. Armazenar em cache o config_shortAnimTime propriedade do sistema em uma varivel de membro. Esta propriedade define a durao padro "curto" para a animao. Esta durao ideal para animaes sutis ou animaes que ocorrem com muita freqncia. config_longAnimTime e config_mediumAnimTimetambm esto disponveis se voc quiser us-los. Aqui est um exemplo usando o layout a partir do trecho de cdigo anterior, como a exibio de contedo de atividade:
Inicialmente ocultar a exibio de contedo. mContentView . setVisibility ( Viso . IDO ); / / Recuperar e cache padro tempo de animao do sistema "short". mShortAnimationDuration = getResources (). getInteger ( android . R . inteiro . config_shortAnimTime ); }
Crossfade as Visualizaes
Agora que as opinies sejam devidamente configurado, crossfade-los, fazendo o seguinte: 1. Para a viso de que est desaparecendo em ajustar o valor alfa para 0 ea visibilidade para VISVEL .(Lembre-se que foi inicialmente definido para IDO ). Isso faz com que o ponto de vista visvel, mas completamente transparente.
2. Para a viso de que est desaparecendo em, animar o seu valor alfa de 0 a 1 . Ao mesmo tempo, para a viso de que est desaparecendo, animar o valor de alfa de 1 a 0 . 3. Usando onAnimationEnd () em um Animator.AnimatorListener , definir a visibilidade da opinio de que foi desaparecendo a IDO . Mesmo que o valor de alfa 0 , definindo a visibilidade da vista a IDO impede a vista ocupando espao layout e omite que a partir de clculos de layout, acelerando o processamento. O mtodo a seguir mostra um exemplo de como fazer isso:
Definir o ponto de vista de contedo para 0% de opacidade, mas visvel, de modo que visvel / / (mas totalmente transparente) durante a animao. mContentView . setAlpha ( 0f ); mContentView . setVisibility ( Viso . VISVEL ); / / Animar o ponto de vista de contedo para 100% de opacidade, e limpar qualquer animao / / ouvinte definido na exibio. mContentView . animar () . alfa ( 1F ) . setDuration ( mShortAnimationDuration ) . setListener ( nulo ); / / Animar o ponto de vista de carga para 0% de opacidade. Aps a animao termina, / / define a sua visibilidade para IDO como uma etapa de otimizao (no vai / / participar de passes de layout,
EXPERIMENT-LO
Faa o download do aplicativo de exemplo
Animations.zip
Slides de tela so as transies entre uma tela inteira para outro e so comuns com UIs como assistentes de configurao ou apresentaes. Esta lio mostra como fazer slides de tela com um ViewPager fornecido pela biblioteca de suporte .ViewPager s pode animar lminas tela automaticamente. Aqui est o que um slide tela parece que as transies de uma tela de contedo para a prxima: Animao de slide tela
Se voc quiser ir em frente e ver um exemplo de trabalho completo, baixar e executar o aplicativo de exemplo e selecione a exemplo do slide tela. Veja os seguintes arquivos para a execuo de cdigo:
src / ScreenSlidePageFragment.java src / ScreenSlideActivity.java layout / activity_screen_slide.xml layout / fragment_screen_slide_page.xml
Criar as vistas
Criar um arquivo de layout que voc vai usar mais tarde para o contedo de um fragmento. O exemplo a seguir contm uma viso de texto para exibir algum texto:
<com.example.android.animationsdemo.ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView style="?android:textAppearanceMedium" android:padding="16dp" android:lineSpacingMultiplier="1.2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/lorem_ipsum" /> </com.example.android.animationsdemo.ScrollView>
Crie o Fragmento
Criar um fragmento de classe que retorna o layout que voc acabou de criar no onCreateView () mtodo.Voc pode, ento, criar instncias desse fragmento da atividade dos pais, sempre que voc precisar de uma nova pgina para exibir para o usurio:
public class ScreenSlidePageFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ViewGroup rootView = (ViewGroup) inflater.inflate(
Adicione ViewPager
ViewPager s tm embutido gestos swipe para a transio atravs das pginas, e eles exibem animaes de slides de tela por padro, ento voc no precisa criar nenhuma. ViewPager uso s PagerAdapter s como uma fonte de novas pginas para exibir, de modo que os PagerAdapter vontade usar a classe fragmento que voc
Define o ponto de vista do contedo a ser o layout com o ViewPager . Cria uma classe que estende a FragmentStatePagerAdapter classe abstrata e implementa o getItem ()mtodo para fornecer exemplos de ScreenSlidePageFragment como novas pginas. O adaptador de pager tambm exige que voc implemente o getCount () , que retorna a quantidade de pginas que o adaptador criar (cinco no exemplo). Conecta os PagerAdapter ao ViewPager . Manipula o boto Voltar do dispositivo, movendo para trs na pilha virtual de fragmentos. Se o usurio j est na primeira pgina, voltar sobre a atividade de volta empilhar.
pblico classe ScreenSlidePagerActivity estende FragmentActivity { / ** * O nmero de pginas (passos do assistente) para mostrar nesta demonstrao. * / private static finais int NUM_PAGES = 5 ; / ** * O Widget de pager, que lida com animao e permite passando horizontalmente para acesso anterior * e os prximos passos do assistente. * / privado ViewPager mPager ; / ** * O adaptador pager, que fornece as pginas para a exibio pager
Se o usurio est olhando para a primeira etapa, permitem que o sistema para lidar com o boto / / Back. Este acabamento chamadas () sobre essa atividade e aparece a pilha de volta. Super . onBackPressed (); } mais { / / Caso contrrio, selecione a etapa anterior. mPager . setCurrentItem ( mPager . GetCurrentItem () - 1 ); } } / ** * Um adaptador simples pager que representa 5 objetos ScreenSlidePageFragment, em *
criar animaes de slides personalizados, definindo as propriedades da pgina com mtodos como setAlpha () ,setTranslationX () , ou setScaleY () . Quando voc tem uma implementao de um PageTransformer , ligue setPageTransformer () com a sua implementao para aplicar as animaes personalizadas. Por exemplo, se voc tem um PageTransformerchamado ZoomOutPageTransformer , voc pode definir suas animaes personalizadas como esta:
ViewPager pager = (ViewPager) findViewById(R.id.pager); ... pager.setPageTransformer(true, new ZoomOutPageTransformer());
Veja o transformador pgina Zoom-out e transformador pgina Profundidade sees para exemplos e vdeos de um PageTransformer .
[-Infinity, -1) / / Esta pgina o caminho para fora da tela para a esquerda. vista . setAlpha ( 0 ); } mais se ( posio <= 1 ) { / / [-1,1] / / Modificar o padro transio de slides para encolher a pgina como
Dimensionar a pgina para baixo (entre MIN_SCALE e 1) vista . setScaleX ( ScaleFactor ); vista . setScaleY ( ScaleFactor ); . / / Desaparecer a pgina em relao ao seu tamanho vista . setAlpha ( MIN_ALPHA + ( ScaleFactor - MIN_SCALE ) / ( 1 - MIN_SCALE ) * ( 1 - MIN_ALPHA )); } mais { / / (1, + infinito] . / / Esta pgina o caminho para fora da tela para a direita vista . setAlpha ( 0 );
} } }
Nota: Durante a animao de profundidade, a animao default (um slide tela) ainda ocorre, ento voc deve neutralizar o slide tela com uma traduo X negativo. Por exemplo:
ver . setTranslationX (- 1 * vista . getWidth () * posio );
O exemplo a seguir mostra como neutralizar a animao de slide tela padro em um transformador pgina de trabalho:
[-Infinity, -1) / / Esta pgina o caminho para fora da tela para a esquerda. vista . setAlpha ( 0 ); } mais se ( posio <= 0 ) { / / [-1,0] / / Use o padro deslizar transio ao mover para a esquerda
(0,1] / / desvanece-se a pgina para fora. vista . setAlpha ( 1 - posio ); / / neutralizar a transio de slides padro vista . setTranslationX ( pageWidth * - posio ); / / Escala a pgina para baixo (entre MIN_SCALE e
(1, + infinito] / / Esta pgina o caminho para fora da tela para a direita. vista . setAlpha ( 0 ); } } }
EXPERIMENT-LO
Faa o download do aplicativo de exemplo
Animations.zip
Esta lio mostra como fazer um carto de animao flip com animaes fragmento personalizados. Carto vira animado entre as visualizaes de contedo, mostrando uma animao que simula um carto de capotar. Aqui est o que um flip card parece:
Carto de animao flip
Se voc quiser ir em frente e ver um exemplo de trabalho completo, baixar e executar o aplicativo de exemplo e selecione o carto exemplo Flip. Veja os seguintes arquivos para a execuo de cdigo:
src / CardFlipActivity.java animador / card_flip_right_in.xml animador / card_flip_right_out.xml animador / card_flip_left_in.xml animador / card_flip_left_out.xml layout / fragment_card_back.xml layout / fragment_card_front.xml
Crie os Animadores
Criar as animaes para o carto vira. Voc vai precisar de dois animadores para quando a frente dos anima carto para fora e para a esquerda e em e da esquerda. Voc tambm vai precisar de dois animadores para quando a parte de trs dos anima carto no e para o direito e para fora e para a direita. card_flip_left_in.xml
<Set xmlns: android = "http://schemas.android.com/apk/res/android" > ! <- Antes de girar, imediatamente definir o alpha a 0.
Rodar.
card_flip_left_out.xml
<Set xmlns: android = "http://schemas.android.com/apk/res/android" > ! <- Rodar.
card_flip_right_in.xml
<Set xmlns: android = "http://schemas.android.com/apk/res/android" > ! <- Antes de girar, imediatamente definir o alpha a 0.
Rodar.
card_flip_right_out.xml
<Set xmlns: android = "http://schemas.android.com/apk/res/android" > ! <- Rodar.
Criar as vistas
Cada lado do "carto" um layout separado que pode conter qualquer contedo que voc deseja, como duas telas de texto, duas imagens, ou qualquer combinao de pontos de vista entre a virar. Voc vai usar os dois layouts nos fragmentos que voc vai mais tarde animar. Os seguintes esquemas de criar um lado de uma placa que mostra o texto:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#a6c" android:padding="16dp" android:gravity="bottom"> <TextView android:id="@android:id/text1" style="?android:textAppearanceLarge" android:textStyle="bold" android:textColor="#fff" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/card_back_title" /> <TextView style="?android:textAppearanceSmall" android:textAllCaps="true" android:textColor="#80ffffff" android:textStyle="bold" android:lineSpacingMultiplier="1.2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/card_back_description" /> </LinearLayout>
Crie o Fragmento
Criar classes de fragmentos para a frente e de trs do carto. Essas classes devolver os layouts que voc criou anteriormente na onCreateView () mtodo de cada fragmento. Voc pode, ento, criar instncias desse fragmento da atividade dos pais, onde voc quer mostrar o carto. O exemplo a seguir mostra as classes de fragmentos aninhados dentro da atividade de pai que usa-los:
pblico classe CardFlipActivity estende Actividade ... / ** * Um fragmento que representa a parte frontal do {
No cdigo de atividade, definir o ponto de vista do contedo a ser o layout que voc acabou de criar. tambm uma boa idia para mostrar um fragmento de padro quando a atividade criada, ento a atividade seguinte exemplo mostra como exibir a frente do carto por padro:
public class CardFlipActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_activity_card_flip); if (savedInstanceState == null) { getFragmentManager() .beginTransaction() .add(R.id.container, new CardFrontFragment()) .commit(); } } ... }
Agora que voc tem a frente da exibio do carto, voc pode mostrar a parte de trs do carto com a animao flip em um momento apropriado. Criar um mtodo para mostrar o outro lado da placa, que faz o seguinte:
Define as animaes personalizadas que voc criou anteriormente para as transies dos fragmentos. Substitui o fragmento exibido atualmente com um novo fragmento e anima o evento com as animaes personalizadas que voc criou. Adiciona o fragmento apresentado anteriormente para o fragmento de volta empilhar assim, quando o usurio pressiona a volta do boto, o carto vira para trs por cima.
privado vazio flipCard () { se ( mShowingBack ) { getFragmentManager (). popBackStack (); retorno ; } . / / Virar volta mShowingBack = verdadeiro ;
/ / Cria e cometem uma nova transao fragmento que adiciona o fragmento para a parte de trs do / / o carto, usa animaes personalizadas, e faz parte de trs da pilha. do gerente fragmento getFragmentManager () . beginTransaction () / / Substituir as animaes fragmento padro com recursos animador representando / / rotaes quando se muda para a parte de trs do carto, como bem como animador / / recursos representativos de rotaes quando lanando para trs para a frente (por exemplo, quando o / / o boto Voltar do sistema
Substitua os fragmentos atualmente na visualizao recipiente com um fragmento / / representando a prxima pgina (indicado pelo recm-incrementado CurrentPage / / varivel). . substituir ( R . id . recipiente , novo CardBackFragment ())
/ / Adicionar esta transao a pilha de volta, permitindo que os usurios pressionem Voltar / / para obter a parte da frente do carto. . addToBackStack ( nulo ) / / Confirmar a transao. . cometer (); }
Zoom Vista
ANTERIORPRXIMA
EXPERIMENT-LO
Faa o download do aplicativo de exemplo
Animations.zip
Esta lio demonstra como fazer uma animao touch-to-zoom, que til para aplicaes tais como galerias de fotos para animar uma vista de uma miniatura para uma imagem no tamanho que preenche a tela. Aqui est o que a animao touch-to-zoom parece que expande uma miniatura da imagem para preencher a tela: Animao Zoom
Se voc quiser ir em frente e ver um exemplo de trabalho completo, baixar e executar o aplicativo de exemplo e selecione o exemplo Zoom. Veja os seguintes arquivos para a execuo de cdigo:
src / TouchHighlightImageButton.java (uma classe auxiliar simples que mostra um toque de
Criar as vistas
Crie um arquivo de layout que contm a verso pequena e grande quantidade de contedo que voc deseja ampliar. O exemplo a seguir cria um ImageButton para miniatura da imagem clicvel e uma ImageView que exibe a viso ampliada da imagem:
Este ImageView inicialmente escondido ir realizar a verso expandida / zoom de as imagens acima. Sem transformaes aplicado, ele ocupa toda a tela. Para alcanar a animao "zoom", limites desta viso so animados a partir dos limites do boto miniatura acima, a sua ltima
/ / O sistema de tempo de durao "short" de animao, em milissegundos. Esta / / durao ideal para animaes sutis ou animaes que ocorrem / / muito
Recuperar e armazenar em cache default "curto" tempo de animao do sistema. mShortAnimationDuration = getResources (). getInteger ( android . R . inteiro . config_shortAnimTime ); } ... }
Ampliar a Ver
Agora voc vai precisar para animar do ponto de vista de tamanho normal para a viso ampliada, quando apropriado. Em geral, voc precisa para animar a partir dos limites da vista de tamanho normal para os limites da viso de maior porte. O mtodo a seguir mostra como implementar uma animao de zoom que amplia de uma miniatura da imagem para uma viso ampliada, fazendo as seguintes coisas: 1. Atribuir a imagem de alta resoluo para o "zoom-in" (alargada) escondido ImageView . O exemplo a seguir carrega um grande recurso de imagem no segmento de interface do usurio para a simplicidade. Voc vai querer fazer isso de carga em um segmento separado para evitar o bloqueio no segmento de interface do usurio e, em seguida, definir o bitmap no segmento. Idealmente, o bitmap no deve ser maior do que o tamanho do ecr. 2. Calcule os limites inicial e final para o ImageView . 3. Animar cada um dos quatro posicionamento e dimensionamento propriedades X , Y , ( scale_x e scale_y ) simultaneamente, a partir dos limites de partida para os limites finais. Estes quatro animaes so adicionados a uma AnimatorSet de modo que eles podem ser iniciados simultaneamente. 4. O zoom para fora, executando uma animao semelhante, mas em sentido inverso quando o usurio toca a tela quando a imagem ampliada dentro Voc pode fazer isso adicionando uma View.OnClickListenerao ImageView . Quando clicado, o ImageView minimiza volta para o tamanho da miniatura da imagem e define sua visibilidade para IDO para escond-lo.
privado vazio zoomImageFromThumb ( ltimo Ver ThumbView , / / Se h uma animao em andamento, cancel-lo / / imediatamente e prosseguir com esta. se ( mCurrentAnimator =! nulo ) { mCurrentAnimator . cancelar (); } / / Carregar de alta resoluo "zoom-in" int imageResId ) {
Calcule os limites inicial e final para o zoom-in imagem. / / Esta etapa envolve muita matemtica. Yay,
Os limites de incio so o retngulo visvel mundial da miniatura, / / e os limites finais so o retngulo visvel global do recipiente / / view. Alm disso, defina o ponto de vista recipiente do deslocamento como a origem para os / / limites, uma vez que a origem para a animao de posicionamento / / propriedades (X,
Ajustar os limites passam a ser a mesma proporo como as finais / / limites utilizando a tcnica de "centro de cultura". Isso evita indesejvel / / alongamento durante a animao. Tambm calcular a escala start / / fator (o fator de escala final sempre
Esconder a miniatura e mostrar o zoom-in vista Quando a animao. / / comea, ele vai posicionar o zoom-in vista no lugar do / / miniatura. ThumbView . setAlpha ( 0f ); expandedImageView . setVisibility ( Viso . VISVEL ) , / / Definir o ponto de piv para scale_x e transformaes scale_y / / para o canto superior esquerdo do zoom-in view (o default / / o centro da viso). expandedImageView . setPivotX ( 0f ); expandedImageView . setPivotY ( 0f ); / / Construir e executar a animao paralela dos quatro traduo e / / propriedades da escala (X, Y, scale_x e
Ao clicar no zoom-in imagem, deve o zoom para baixo / / para os limites originais e mostrar a miniatura em vez de / / o expandida
EXPERIMENT-LO
Faa o download do aplicativo de exemplo
Animations.zip
A animao layout uma animao pr-carregado que o sistema executado a cada vez que fizer uma alterao na configurao do layout. Tudo o que voc precisa fazer definir um atributo no layout para dizer ao sistema Android para animar essas mudanas de layout e animaes do sistema-padro so realizadas por voc. Dica : Se voc deseja fornecer animaes de layout personalizado, crie um LayoutTransition objeto e fornec-lo para o layout com a setLayoutTransition () mtodo. Aqui est o que a animao layout padro parece quando adicionar itens a uma lista: Animao de layout
Se voc quiser ir em frente e ver um exemplo de trabalho completo, baixar e executar o aplicativo de exemplo e selecione o exemplo Crossfade. Veja os seguintes arquivos para a execuo de cdigo: 1. src / LayoutChangesActivity.java 2. layout / activity_layout_changes.xml 3. Menu / activity_layout_changes.xml
Criar o layout
No arquivo XML de layout de sua atividade, defina o android: animateLayoutChanges atribuir a verdadepara o layout que voc deseja ativar animaes para. Por exemplo:
<LinearLayout android: id = "@ + id / recipiente" android: animateLayoutChanges = "true" ... />