Passando dados entre atividade e serviço. Comunicação entre Atividade e Serviço

O aplicativo nem sempre consiste em uma única tela. Por exemplo, criamos um muito programa útil e o usuário quer saber quem é o autor. Ele clica no botão “Sobre” e chega a uma nova tela com informações úteis sobre a versão do programa, o autor, o endereço do site, quantos gatos o autor tem, etc. Pense em uma tela de atividade como uma página da Web com um link para outra página. Se você olhar para o código no arquivo MainActivity.java das lições anteriores, você verá que nossa classe Atividade principal também se aplica a Atividade(ou seus herdeiros) ou, para ser mais preciso, é herdado dele.

Classe pública MainActivity estende AppCompatActivity

Como você pode imaginar, devemos criar uma nova classe que possa se parecer com Atividade principal e, de alguma forma, mude para ele ao clicar no botão.

Para o experimento, pegaremos o programa da primeira lição e usaremos o botão para experimentos (ou criaremos novo projeto com um botão na tela). A seguir, vamos criar nova forma mostrar informação útil. Por exemplo, vamos mostrar ao usuário o que o gato faz quando vai para a esquerda e para a direita. Concordo, é muito informação importante, que dá a chave para desvendar o universo.

Vamos criar uma nova atividade manualmente, embora o estúdio tenha templates prontos. Mas não há nada complicado e para uma melhor compreensão é útil fazer tudo à mão.

Vamos criar um novo arquivo de marcação XML activity_about.xml na pasta resolução/layout. Clique com o botão direito na pasta esquema e escolha de menu contextual Novo | Arquivo de recurso de layout. Uma caixa de diálogo aparecerá. Digite o nome do arquivo no primeiro campo atividade_sobre. No segundo, você precisa inserir o elemento raiz. Por padrão está lá Layout de restrição. Apague o texto e digite visualização de rolagem. Basta digitar alguns caracteres para que o estúdio sugira opções prontas, você pode pressionar Enter imediatamente sem esperar a entrada completa da palavra:

Obtemos o espaço em branco correspondente, no qual inserimos o elemento visualização de texto.

As informações serão recuperadas dos recursos, ou seja, de um recurso de string sobre_texto. Agora está destacado em vermelho, sinalizando a ausência de informações. poderia ser pressionado Alt+Enter e digite o texto na caixa de diálogo. Mas para o nosso exemplo, esse método não funcionará, pois nosso texto será de várias linhas, usando caracteres de controle. Então vamos fazer diferente. Vamos abrir o arquivo res/valores/strings.xml e digite o seguinte texto manualmente:

Um carvalho verde perto da praia;\n Uma corrente dourada naquele carvalho:\n Dia e noite gato cientista\n Tudo gira em torno da cadeia;\n Vai certo- a música liga,\n Deixei- conta um conto de fadas.

Usamos as tags de formatação de texto HTML mais simples, como , , . Para o nosso exemplo, basta colocar em negrito as palavras que se referem ao gato e à direção do movimento. Para traduzir o texto em nova linha use símbolos \n. Vamos adicionar outro recurso de string para o título da nova tela:

Sobre o programa

Entendido com marcação. Em seguida, você precisa criar uma classe para a janela SobreActivity.java. Escolha no menu arquivo | Novo | classe Java e preencha os campos obrigatórios. A princípio, basta especificar apenas o nome. Em seguida, lide com outros campos.

Vamos à preparação.

Agora a sala de aula está quase vazia. Vamos adicionar o código manualmente. A classe deve herdar da classe abstrata Atividade ou seus parentes FragmentActivity, AppCompatActivity etc. Adicionando estende Atividade. A classe de atividade deve ter um método onCriar(). Coloque o cursor do mouse dentro da classe e selecione no menu código | Métodos de substituição(Ctrl+O). Na caixa de diálogo, estamos procurando a classe desejada, você pode digitar os primeiros caracteres no teclado para pesquisa rápida. No método criado, você precisa chamar o método setContentView(), que carregará a marcação preparada na tela. Teremos essa opção.

Pacote en.alexanderklimov.helloworld; import android.app.Activity; importar android.os.Bundle; /** * Criado por Alexander Klimov em 01/12/2014. */ public class AboutActivity extends Activity ( @Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); ) )

Agora começa o mais importante. Nossa tarefa é passar para uma nova tela quando um botão é clicado na primeira tela. Vamos voltar para a aula Atividade principal. Vamos escrever o manipulador de clique do botão:

Public void onClick(View view) ( Intent intent = new Intent(MainActivity.this, AboutActivity.class); startActivity(intent); )

Aqui eu usei o método de manipulação de clique de botão descrito na lição.

Para iniciar uma nova tela, você precisa criar uma instância da classe Intenção e especifique a classe atual no primeiro parâmetro, e a classe para a transição no segundo, temos isso Sobre a atividade. Depois disso, o método é chamado startActivity(), que abre uma nova tela.

Se agora você tentar testar o aplicativo no emulador, receberá uma mensagem de erro. O que fizemos de errado? Perdemos um passo importante. Você precisa registrar um novo Atividade no manifesto AndroidManifest.xml. Encontre este arquivo em seu projeto e clique duas vezes nele. A janela de edição do arquivo será aberta. Adicionar uma nova etiqueta após a tag de fechamento para a primeira atividade. Digite por conta própria e use ativamente as dicas. Você obterá o seguinte:

É aqui que o recurso string é útil about_title. Execute o aplicativo, clique no botão e obtenha a janela Sobre o programa. Assim, aprendemos como criar uma nova janela e chamá-la com um clique de botão. E um programa mega conveniente apareceu à nossa disposição - agora sempre haverá uma dica do que o gato faz quando vai para a esquerda.

Mais uma vez, chamo sua atenção para o fato de que a segunda classe de atividade criada deve ser herdada da classe Atividade ou similar ( Listar atividade etc.), ter um arquivo de marcação XML (se necessário) e ser escrito no manifesto.

Após chamar o método startActivity() uma nova atividade será iniciada (neste caso Sobre a atividade), ele ficará visível e será movido para o topo da pilha que contém os componentes em execução. Ao chamar um método Finalizar() da nova atividade (ou quando a tecla de retrocesso do hardware for pressionada) ela será fechada e removida da pilha. O desenvolvedor também pode navegar para a atividade anterior (ou qualquer outra) usando o mesmo método startActivity().

Criando uma terceira tela - um caminho para os preguiçosos

Programadores, como gatos, são criaturas preguiçosas. Lembre-se sempre que para a atividade você precisa criar marcação e uma classe que herda de Atividade, e depois não se esqueça de registrar a classe no manifesto - ah, que diabos.

Neste caso, selecione no menu arquivo | Novo | atividade | atividade básica(ou outro padrão). Em seguida, a janela familiar para criar uma nova atividade aparecerá. Preencha os campos obrigatórios.

Clique no botão Terminar e a atividade estará pronta. Para verificar isso, abra o arquivo de manifesto e verifique a nova entrada. Não estou falando de arquivos de classe e marcação, eles aparecerão na sua frente.

Adicione você mesmo um novo botão na tela da atividade principal e escreva o código para navegar até a atividade criada.

A princípio, aconselho você a criar manualmente todos os componentes necessários para uma nova atividade para entender a relação entre a classe, marcação e manifesto. E quando você colocar as mãos nele, poderá usar o assistente de criação de atividades para acelerar as coisas.

Passando dados entre atividades

Usamos o exemplo mais simples para chamar outra tela de atividade. Às vezes, é necessário não apenas chamar uma nova tela, mas também transferir dados para ela. Por exemplo, nome de usuário. Neste caso, você precisa usar uma área especial extraData, que a classe tem Intenção.

Região extraDataé uma lista de pares valor chave, que é passado junto com a intenção. Strings são usadas como chaves, e para valores você pode usar quaisquer tipos de dados primitivos, arrays de primitivos, objetos de classe pacote e etc

Para passar dados para outra atividade, use o método putExtra():

Intent.putExtra("Chave", "Valor");

A atividade de recebimento deve chamar algum método apropriado: getIntExtra(), getStringExtra() etc.:

Int contagem = getIntent().getIntExtra("nome", 0);

Vamos refazer o exemplo anterior. Já temos três atividades. A primeira atividade terá dois campos de texto e um botão. A aparência pode ser a seguinte:

Na segunda atividade Segunda atividade definir o elemento visualização de texto, no qual exibiremos o texto recebido da primeira atividade. Vamos escrever o seguinte código para o método onCriar() na segunda atividade.

@Override protected void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); String user = "Animal"; String gift = "donut hole"; TextView infoTextView = (TextView)findViewById( R .id.textViewInfo); infoTextView.setText(user + ", você recebeu " + presente); )

Se agora executarmos o programa e simplesmente chamarmos a segunda janela, conforme descrito na primeira parte do artigo, veremos a inscrição padrão ZhYvotnoe, você recebeu um buraco de rosquinha. Concordo, é uma pena receber essas mensagens.

Corrigimos a situação. Adicione código à primeira atividade:

Public void onClick(View view) ( EditText userEditText = (EditText) findViewById(R.id.editTextUser); EditText giftEditText = (EditText) findViewById(R.id.editTextGift); Intent intent = new Intent(MainActivity.this, SecondActivity. class); // envia o texto do primeiro campo de texto para a chave de nome de usuário intent.putExtra("username", userEditText.getText().toString()); // envia o texto do segundo campo de texto para a chave de presente intent.putExtra("presente ", giftEditText.getText().toString()); startActivity(intent); )

Colocamos em um recipiente de objeto especial Intenção duas chaves com valores retirados de campos de texto. Quando o usuário insere dados nos campos de texto, eles cairão nesse contêiner e serão passados ​​para a segunda atividade.

A segunda atividade deve estar pronta para receber mensagens calorosamente como segue (destacada em negrito).

// Valores padrão String user = "LIFE"; String presente = "buraco de rosquinha"; usuário = getIntent().getExtras().getString("username"); presente = getIntent().getExtras().getString("presente"); TextView infoTextView = (TextView)findViewById(R.id.textViewInfo); infoTextView.setText(user + " , você recebeu " + presente);

Agora a mensagem não parece tão ofensiva, mas até agradável para alguns. Em exemplos complexos, é desejável adicionar validação durante o processamento de dados. Há situações em que você inicia uma segunda atividade com dados vazios como nulo, que pode travar o aplicativo.

No nosso caso, sabemos que estamos esperando por um valor de string, então o código pode ser reescrito assim:

intenção intenção = getIntent(); usuário = intent.getStringExtra("username");

Usuário = getIntent().getStringExtra("username");

O programa tem uma desvantagem - não está claro de quem recebemos saudações. Qualquer macaco bem-educado não aceitará um presente de uma fonte anônima. Portanto, como lição de casa, adicione outro campo de texto para inserir o nome do usuário que está enviando a mensagem.

O Google recomenda usar o seguinte formato para chaves: o nome do seu pacote como prefixo, seguido pela própria chave. Nesse caso, você pode ter certeza de que a chave é exclusiva ao interagir com outros aplicativos. Aproximadamente assim:

Final pública static String USER = "ru.alexanderklimov.myapp.USER";

Quem incriminou o gato Vaska - recuperamos o resultado

Nem sempre é suficiente simplesmente passar dados para outra atividade. Às vezes, você precisa obter informações de outra atividade quando ela é fechada. Se antes usávamos o método startActivity(Intent intent), então existe um método relacionado startActivityForResult(Intent intent, int RequestCode). A diferença entre os métodos está no parâmetro extra código de solicitação. É basicamente apenas um número inteiro que você pode pensar em si mesmo. É necessário para distinguir de quem veio o resultado. Digamos que você tenha cinco telas adicionais e atribua valores de 1 a 5 a elas, e a partir desse código você pode determinar qual resultado precisa processar. Você pode usar o valor -1, então será equivalente a chamar o método startActivity(), ou seja não teremos nenhum resultado.

Se você estiver usando o método startActivityForResult(), então você precisa substituir o método no código para receber o resultado onActivityResult() e processar o resultado. Confuso? Vamos dar uma olhada em um exemplo.

Digamos que você seja um detetive. Foram recebidas informações de que dois pedaços de salsicha e outros produtos foram roubados da mesa de uma pessoa influente no restaurante. A suspeita recaiu sobre três suspeitos - um corvo, uma porra de cachorro e gato Vaska.

Um dos visitantes forneceu uma série de fotos de seu iPhone do pontão:


Há também depoimento de outra testemunha: E Vaska ouve e come.

Criamos um novo projeto Sherlock com duas atividades. Na primeira tela haverá um botão para mudar para a segunda tela e um rótulo de texto que exibirá o nome do ladrão.