intent – passar dados entre atividades

這是為您翻譯的葡萄牙語(葡萄牙)版本。翻譯時已盡量使用自然、口語化的教學語氣,避免生硬的機翻感,並保留了完整的 WordPress 區塊格式。代碼塊內的中文註釋也已翻譯為葡萄牙語,並標註了 [pt] 語言標記。 Português (Portugal)

Navegar entre atividades usando Intents

Saltar da atividade principal para outra atividade

Usar uma Intent explícita.

Vamos adicionar uma atividade vazia e dar-lhe o nome de AddCourseActivity, marcando a opção para gerar o ficheiro de layout.
Contudo, não marques a opção Launcher Activity.

Intent

Uma Intent é uma forma importante de interação entre os vários componentes de uma aplicação Android.
Ela não só pode indicar a ação que o componente atual quer executar, como também permite passar dados entre diferentes componentes.


As Intents dividem-se em: Intent explícita e Intent implícita

Tem vários construtores.
No botão da atividade principal, vou instanciar uma Intent para saltar da atividade principal para a segunda atividade.

// [pt] Primeiro inicializar uma Intent, indicando de onde para onde vai
Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
startActivity(it);Code language: JavaScript (javascript)

Utilizar Intents implícitas

Em comparação com as Intents explícitas, as Intents implícitas não precisam de indicar explicitamente qual a atividade a iniciar. Em vez disso, especificam uma série de ações e categorias mais abstratas.

Depois, o sistema analisa esta Intent e ajuda-nos a encontrar uma atividade válida para iniciar.

Vamos modificar o AndroidManifest.xml.

Adicionar ação e categoria à segunda atividade.

Na ação, indicamos que esta atividade pode responder a esta ação específica.

<activity android:name=".AddCourseActivity">
    <intent-filter>
        <action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>Code language: HTML, XML (xml)

Só quando a Intent conseguir corresponder à ação e categoria da atividade, é que esta poderá responder à Intent.

// [pt] Primeiro inicializar uma Intent para corresponder à ação definida no AndroidManifest.xml
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
startActivity(it);Code language: JavaScript (javascript)

Por que não precisamos de corresponder à categoria?

Porque esta atividade está a usar a categoria android.intent.category.DEFAULT.

Esta é a categoria por defeito.

Quando chamamos o startActivity, a categoria DEFAULT é passada automaticamente.

Cada Intent só pode especificar uma ação, mas pode ter várias categorias.

Como estamos a usar a DEFAULT, não precisamos de a adicionar manualmente.

Se precisarmos de adicionar outras categorias:

// [pt] Primeiro inicializar uma Intent para corresponder à ação e adicionar categorias
Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY");
it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY1111111");
startActivity(it);Code language: JavaScript (javascript)

Ao clicar no menu “Adicionar Curso”, verificámos que a aplicação crashou.

O motivo é que adicionámos uma categoria à intent, mas a segunda atividade não a tinha definida.

Por isso, precisamos de adicionar essa categoria.

<activity android:name=".AddCourseActivity">
    <intent-filter>
        <action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="com.foxdevelop.www.activitydemo.MY_CATEGORY" />
    </intent-filter>
</activity>Code language: HTML, XML (xml)

Nota:

Se a intent tiver várias categorias, não basta que uma corresponda; todas as categorias têm de ser correspondidas.

<activity android:name=".AddCourseActivity">
    <intent-filter>
        <action android:name="com.foxdevelop.www.activitydemo.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="com.foxdevelop.www.activitydemo.MY_CATEGORY" />
    </intent-filter>
</activity>Code language: HTML, XML (xml)
case R.id.add:
    // [pt] Primeiro inicializar uma Intent para corresponder à ação e adicionar categorias
    Intent it = new Intent("com.foxdevelop.www.activitydemo.ACTION_START");
    it.addCategory("com.foxdevelop.www.activitydemo.MY_CATEGORY2222222");
    //it.addCategory("android.intent.category.DEFAULT");
    startActivity(it);
    break;Code language: JavaScript (javascript)

Abrir uma página web com uma Intent implícita

As Intents implícitas permitem fazer muito mais do que isto.

Não servem apenas para iniciar atividades dentro da mesma aplicação, mas também atividades de outras aplicações.

Isto torna possível a partilha de funcionalidades entre várias aplicações.

Por exemplo, no chat do WeChat, quando um amigo te envia um endereço, podes abri-lo com o navegador QQ.

Vamos experimentar agora:

Intent it = new Intent(Intent.ACTION_VIEW); // [pt] Ação incorporada no sistema
it.setData(Uri.parse("http://www.foxdevelop.com")); // [pt] Abrir um endereço web
startActivity(it);Code language: JavaScript (javascript)

O “http://” não pode faltar, caso contrário dá erro.

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.foxdevelop.www.activitydemo, PID: 8917
                  android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=www.foxdevelop.com }
                      at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1809)
                      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
                      at android.app.Activity.startActivityForResult(Activity.java:4224)
                      at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
                      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)Code language: PHP (php)

Fazer uma chamada com Intent implícita

Podes usar o protocolo tel para fazer chamadas

Na aula anterior usámos o protocolo http para abrir um domínio.

Por exemplo, vamos tentar ligar para o 10010.

Intent it = new Intent(Intent.ACTION_DIAL); // [pt] Ação incorporada no sistema
it.setData(Uri.parse("tel:10010")); // [pt] Ligar para este número; requer confirmação do utilizador
startActivity(it);Code language: JavaScript (javascript)

Passar dados entre atividades

As Intents podem passar dados

intent (substantivo): intenção, propósito; significado.

Usando o método putExtra, podes passar dados.

Depois, na segunda atividade, ao chamar o método getStringExtra, consegues obter os dados que foram passados.

Na segunda atividade, podes chamar o método getIntent para obter a Intent.

Claro que, se passares um número inteiro, podes usar o método getIntExtra para o obter.

Primeiro, na primeira atividade:

Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
it.putExtra("site", "www.foxdevelop.com");
it.putExtra("name", "FoxDevelop");
startActivity(it);Code language: JavaScript (javascript)

De seguida, na segunda atividade, obtém o objeto Intent e depois podes extrair os seus valores.

No método onCreate da segunda atividade:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_course_acticity);
    Intent it = getIntent();
    String site = it.getStringExtra("site");
    String name = it.getStringExtra("name");
    int version = it.getIntExtra("version", 1);
    Log.e(TAG, site);
}Code language: JavaScript (javascript)

Devolver dados à atividade anterior

Quando saímos da atividade atual

Temos um método na atividade chamado startActivityForResult que pode devolver um resultado à atividade anterior antes de ser destruída.

Este método recebe dois parâmetros: o primeiro é a Intent e o segundo é o código de pedido, usado mais tarde no callback para determinar a origem dos dados.

Antes da atividade ser destruída, usando o método setResult, podes devolver um resultado à atividade anterior. Geralmente usa-se RESULT_OK ou RESULT_CANCELED. O segundo parâmetro é a Intent que transporta os dados.

Podemos usar o putExtra para definir valores na Intent.

Como na atividade anterior usámos o startActivityForResult para iniciar a segunda atividade, quando esta for destruída, vai acionar o método onActivityResult da primeira atividade. Aqui, podemos obter a Intent e o código de resultado.

Se o utilizador não clicar num botão para voltar atrás, mas usar a tecla “back”, neste caso precisamos de sobrescrever o método onBackPressed da segunda atividade.

1. Ao iniciar a Intent na primeira atividade

Intent it = new Intent(FirstActivity.this, AddCourseActivity.class);
it.putExtra("site", "www.foxdevelop.com");
it.putExtra("name", "FoxDevelop");
it.putExtra("version", 1);
startActivityForResult(it, 1);Code language: JavaScript (javascript)

2. Sobrescrever na primeira atividade

public class FirstActivity extends AppCompatActivity {
    private static final String TAG = "FirstActivity";
    // [pt] Sobrescrever o método da primeira atividade; quando a segunda atividade sair, este código será executado
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            String h = data.getStringExtra("hot");
            Log.d(TAG, h);
        }
        super.onActivityResult(requestCode, resultCode, data);
    }Code language: JavaScript (javascript)

3. Na segunda atividade

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_course_acticity);

    // [pt] Obter os dados da atividade anterior
    Intent it = getIntent();
    String site = it.getStringExtra("site");
    String name = it.getStringExtra("name");
    int version = it.getIntExtra("version", 1);
    Log.e(TAG, site);

    // [pt] Adicionar evento de volta ao botão, atribuir valores à Intent no evento, definir o código de resultado e fechar
    Button b = findViewById(R.id.button);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent it = getIntent();
            it.putExtra("hot", "Cursos Populares");
            setResult(RESULT_OK, it);
            finish();
        }
    });
}Code language: JavaScript (javascript)

Quando voltamos à atividade principal, o evento é acionado e a mensagem de log é apresentada.

05-12 06:17:46.741 12960-12960/com.foxdevelop.www.activitydemo D/FirstActivity: Cursos Populares

Se quiseres que a tecla de saída também devolva dados

Precisas de sobrescrever o onBackPressed.

Vamos sobrescrever isto na segunda atividade:

// [pt] Este método é acionado quando premimos a tecla de saída (back)
@Override
public void onBackPressed() {
    Intent it = getIntent();
    it.putExtra("hot", "Últimos Cursos");
    setResult(RESULT_OK, it);
    finish();
}Code language: JavaScript (javascript)
05-12 06:23:08.654 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Cursos Populares
05-12 06:23:16.405 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Últimos Cursos
05-12 06:23:35.612 13209-13209/com.foxdevelop.www.activitydemo D/FirstActivity: Últimos Cursos

intent – passar dados entre atividades

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *