Android - receptores de transmissão
Broadcast Receivers simplesmente responda a mensagens de difusão de outros aplicativos ou do próprio sistema. Às vezes, essas mensagens são chamadas de eventos ou intenções. Por exemplo, os aplicativos também podem iniciar transmissões para permitir que outros aplicativos saibam que alguns dados foram baixados para o dispositivo e estão disponíveis para uso, portanto, este é o receptor de transmissão que interceptará essa comunicação e iniciará a ação apropriada.
Existem duas etapas importantes a seguir para fazer o BroadcastReceiver funcionar para as intenções de transmissão do sistema -
Criando o receptor de transmissão.
Registrando receptor de transmissão
Há uma etapa adicional, caso você vá implementar seus intents personalizados, então você terá que criar e transmitir esses intents.
Criando o receptor de transmissão
Um receptor de transmissão é implementado como uma subclasse de BroadcastReceiver classe e substituindo o método onReceive () onde cada mensagem é recebida como um Intent parâmetro do objeto.
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}
Registrando receptor de transmissão
Um aplicativo escuta intenções de transmissão específicas registrando um receptor de transmissão no arquivo AndroidManifest.xml . Considere que vamos registrar MyReceiver para o evento gerado pelo sistema ACTION_BOOT_COMPLETED, que é disparado pelo sistema assim que o sistema Android tiver concluído o processo de inicialização.
Receptor de radiodifusão
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED">
</action>
</intent-filter>
</receiver>
</application>
Agora, sempre que seu dispositivo Android for inicializado, ele será interceptado por BroadcastReceiver MyReceiver e a lógica implementada dentro de onReceive () será executada.
Existem vários eventos gerados pelo sistema definidos como campos estáticos finais no Intentclasse. A tabela a seguir lista alguns eventos importantes do sistema.
Sr. Não | Constante de evento e descrição |
---|---|
1 |
android.intent.action.BATTERY_CHANGED Transmissão fixa contendo o estado, o nível de carregamento e outras informações sobre a bateria. |
2 |
android.intent.action.BATTERY_LOW Indica condição de bateria fraca no dispositivo. |
3 |
android.intent.action.BATTERY_OKAY Indica que a bateria agora está boa depois de estar fraca. |
4 |
android.intent.action.BOOT_COMPLETED Isso é transmitido uma vez, após a inicialização do sistema. |
5 | android.intent.action.BUG_REPORT Mostrar atividade para relatar um bug. |
6 | android.intent.action.CALL Realize uma chamada para alguém especificado pelos dados. |
7 | android.intent.action.CALL_BUTTON O usuário pressionou o botão "chamar" para acessar o discador ou outra IU apropriada para fazer uma chamada. |
8 | android.intent.action.DATE_CHANGED A data mudou. |
9 | android.intent.action.REBOOT Faça o dispositivo reiniciar. |
Transmitindo intenções personalizadas
Se você deseja que seu próprio aplicativo gere e envie intents personalizados, será necessário criar e enviar esses intents usando o método sendBroadcast () dentro de sua classe de atividade. Se você usar o método sendStickyBroadcast (Intent) , o Intent ésticky, o que significa que o Intent que você está enviando permanece após a conclusão da transmissão.
public void broadcastIntent(View view) {
Intent intent = new Intent();
intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
sendBroadcast(intent);
}
Este intent com.tutorialspoint.CUSTOM_INTENT também pode ser registrado de maneira semelhante à medida que registramos o intent gerado pelo sistema.
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="com.tutorialspoint.CUSTOM_INTENT">
</action>
</intent-filter>
</receiver>
</application>
Exemplo
Este exemplo explicará como criar BroadcastReceiver para interceptar o intent personalizado. Quando estiver familiarizado com a intenção personalizada, você pode programar seu aplicativo para interceptar as intenções geradas pelo sistema. Então, vamos seguir as etapas a seguir para modificar o aplicativo Android que criamos no capítulo de exemplo Hello World -
Degrau | Descrição |
---|---|
1 | Você usará o Android Studio para criar um aplicativo Android e nomeá-lo como My Application em um pacote com.example.tutorialspoint7.myapplication, conforme explicado no capítulo Exemplo Hello World . |
2 | Modifique o arquivo de atividade principal MainActivity.java para adicionar o método broadcastIntent () . |
3 | Crie um novo arquivo java chamado MyReceiver.java no pacote com.example.tutorialspoint7.myapplication para definir um BroadcastReceiver. |
4 | Um aplicativo pode lidar com um ou mais objetivos personalizados e do sistema sem quaisquer restrições. Cada intent que você deseja interceptar deve ser registrado em seu arquivo AndroidManifest.xml usando a tag <receiver ... /> |
5 | Modifique o conteúdo padrão do arquivo res / layout / activity_main.xml para incluir um botão para transmitir a intenção. |
6 | Não há necessidade de modificar o arquivo de string, o Android Studio cuida do arquivo string.xml. |
7 | Execute o aplicativo para iniciar o emulador Android e verifique o resultado das alterações feitas no aplicativo. |
A seguir está o conteúdo do arquivo de atividade principal modificado MainActivity.java. Este arquivo pode incluir cada um dos métodos fundamentais do ciclo de vida. Adicionamos o método broadcastIntent () para transmitir uma intenção personalizada.
package com.example.tutorialspoint7.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// broadcast a custom intent.
public void broadcastIntent(View view){
Intent intent = new Intent();
intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent);
}
}
A seguir está o conteúdo de MyReceiver.java:
package com.example.tutorialspoint7.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
* Created by TutorialsPoint7 on 8/23/2016.
*/
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}
A seguir, o conteúdo modificado do arquivo AndroidManifest.xml . Aqui, adicionamos a tag <receiver ... /> para incluir nosso serviço:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tutorialspoint7.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="com.tutorialspoint.CUSTOM_INTENT">
</action>
</intent-filter>
</receiver>
</application>
</manifest>
A seguir estará o conteúdo de res/layout/activity_main.xml arquivo para incluir um botão para transmitir nossa intenção personalizada -
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Example of Broadcast"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="Broadcast Intent"
android:onClick="broadcastIntent"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Vamos tentar executar nosso modificado Hello World!aplicativo que acabamos de modificar. Suponho que você tenha criado o seuAVDao fazer a configuração do ambiente. Para executar o aplicativo do Android Studio, abra um dos arquivos de atividade do seu projeto e clique no ícone Executar na barra de ferramentas. O Android Studio instala o aplicativo em seu AVD e o inicia e, se tudo correr bem com sua configuração e aplicativo, ele será exibido na janela do emulador seguinte -
Agora, para transmitir nossa intenção personalizada, vamos clicar em Broadcast Intent, isso irá transmitir nossa intenção personalizada "com.tutorialspoint.CUSTOM_INTENT" que será interceptada por nosso BroadcastReceiver registrado, ou seja, MyReceiver e, de acordo com nossa lógica implementada, um brinde aparecerá na parte inferior do simulador como segue -
Você pode tentar implementar outro BroadcastReceiver para interceptar intenções geradas pelo sistema, como inicialização do sistema, data de alteração, bateria fraca, etc.