Ver mensagens sem resposta | Ver tópicos ativos Hoje é 22 Nov 2019, 07:26



Responder Tópico  [ 3 Mensagens ] 
 BroadcastReceiver, Notification e Service 
Autor Mensagem
Google employee
Google employee

Data de registro: 01 Jul 2013, 13:45
Mensagens: 2735
Localização: Rio de Janeiro
Mensagem BroadcastReceiver, Notification e Service
Broadcast Receiver é um componente do Android que responde a mensagens enviadas a todo o sistema através de Intents, e os Broadcast Receivers que acharem a mensagem (broadcast) útil fazem uso dessa informação para executar alguma tarefa. Um exemplo comum é o aviso de que a bateria está fraca. O Android envia uma Intent informando que a energia está acabando e os Broadcast Receivers que querem essa informação executam determinadas tarefas. O próprio Android já possui um que informa ao usuário o estado da bateria. Para criar uma classe desse tipo basta extender de android.content.BroadcastResceiver e implementar o que vai ser executado no onReceive().

Service é um componente do Android que executa tarefas em segundo plando. Um exemplo comum são os tocadores de áudio, que continuam funcionando mesmo que você saia do aplicativo.
Para criar um Service, é necessário extender a classe android.app.Service e implementar o método onBind().


public class MyService extends Service {
   
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // aqui é onde as tarefas do Service são executadas
        return super.onStartCommand(intent, flags, startId);
    }
   
    public IBinder onBind(Intent intent) {
       // esse é o método que lhe permite conectar e manipular o Service,
       // como os tocadores de áudio fazem. Não o usaremos
        return null;
    }
   
}


Para que um Service seja iniciado ou cancelado, usamos startService() e stopService() da classe Context. Ambos devem receber a mesma Intent para iniciar e parar o serviço. Também temos o stopSelf() da classe Service, com a mesma função do stopService().


    Intent i = new Intent(this, MyService.class);
   
    startService(i);
    stopService(i);
 



O Service é executado na thread principal da aplicação, então o recomendado é que seja criada uma nova thread, dependendo da tarefa que será executada, para que ele rode sem interferir o usuário. Pra esse fim existe a classe IntentService, precisando apenas implementar o onHandleIntent(). Uma vantagem de usar essa classe é que ela se encerra sozinha ao terminar sua tarefa.
Nesse Service, será baixada a página inicial aqui do fórum. Ao terminar, será enviada uma mensagem a um BroadcastReceiver, que vai mostrar uma notificação. Primeiro, devemos registrar os dois e as permissões que usaremos no AndroidManifest:


    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
   
    <application>
       
        <receiver
            android:name=".receiver.PageDownloadReceiver"
            <intent-filter>

                <action android:name="ACTION_PAGE_DOWNLOAD_RECEIVER" />
            </intent-filter>
        </receiver>
       
        <service
            android:name=".service.PageDownloadService"
            <intent-filter>

                <action android:name="ACTION_PAGE_DOWNLOAD_SERVICE" />
            </intent-filter>
        </service>
       
    </application>
 


A classe Service:


package br.jeffersonlanzieri.pagedownload.service;

import android.app.IntentService;
import android.content.Intent;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

/**
 * @author Kaito
 *
 */

public class PageDownloadService extends IntentService {
   
    protected void onHandleIntent(Intent intent) {
        String link = intent.getStringExtra("link");
        String path = intent.getStringExtra("path");
        String name = intent.getStringExtra("name");
       
        InputStreamReader isr = null;
        BufferedReader br = null;
       
        FileWriter fw = null;
        BufferedWriter bw = null;
       
        File file = new File(path, name);
        try {
            if (!file.exists()) {
                file.createNewFile();
            }
            URL url = new URL(link);
            URLConnection conn = url.openConnection();
           
            isr = new InputStreamReader(conn.getInputStream());
            br = new BufferedReader(isr);
           
            fw = new FileWriter(file);
            bw = new BufferedWriter(fw);
           
            int oneByte;
            while ((oneByte = br.read()) != -1) {
                bw.write(oneByte);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            close(bw);
            close(fw);
            close(br);
            close(isr);
        }
        Intent i = new Intent("ACTION_PAGE_DOWNLOAD_RECEIVER");
        i.putExtra("link", link);
       
        sendBroadcast(i);
    }
   
    private void close(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
   
    public PageDownloadService() {
        super("PageDownloadService");
    }
   
}
 


Caso não saiba como funciona leitura/escrita de arquivos, tem um tutorial aqui no fórum.
A classe BroadcastReceiver:


package br.jeffersonlanzieri.pagedownload.receiver;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;

import br.jeffersonlanzieri.pagedownload.R;
import br.jeffersonlanzieri.pagedownload.activity.SecondActivity;

/**
 * @author Kaito
 *
 */

public class PageDownloadReceiver extends BroadcastReceiver {
   
    public void onReceive(Context context, Intent intent) {
        String title = "Página Baixada!";
        String text = intent.getStringExtra("link");
       
        Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        long[] vibrate = { 300, 600, 300, 600 };
       
        Intent i = new Intent(context, SecondActivity.class);
        PendingIntent pi = PendingIntent.getActivity(context, 0, i, 0);
       
        Notification.Builder builder = new Notification.Builder(context);
        builder.setAutoCancel(true);
       
        builder.setContentTitle(title);
        builder.setContentText(text);
       
        builder.setContentIntent(pi);
        builder.setSmallIcon(R.drawable.ic_launcher);
       
        builder.setSound(sound);
        builder.setVibrate(vibrate);
       
        // No AndroidManifest, o minSdkVersion deve
        // ser '11', para usar o getNotification()
        Notification nf = builder.getNotification();
        NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
       
        int id = 2014;
        nm.notify(id, nf);
    }
   
}


Para definir o tempo de vibração, usamos um long[] com o padrão pausa/vibração. Essa notificação fará uma pausa de 300 milissegundos e vai vibrar durante 600, duas vezes. Para o som de alerta, usei o padrão do dispositivo. O id serve para identificar a notificação, então quando quiser cancelá-la com o cancel() da NotificationManager, passe esse id como parâmetro. Como estamos usando o setAutoCancel() não vamos precisar dele.
Por último, as duas Activitys e seus layouts:


package br.jeffersonlanzieri.pagedownload.activity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import br.jeffersonlanzieri.pagedownload.R;

/**
 * @author Kaito
 *
 */

public class FirstActivity extends Activity implements OnClickListener {
   
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.first_activity);
       
        Button start = (Button) findViewById(R.id.button_start_download);
        start.setOnClickListener(this);
    }
   
    public void onClick(View view) {
        Intent intent = new Intent("ACTION_PAGE_DOWNLOAD_SERVICE");
       
        intent.putExtra("link", "http://www.portalandroid.org/comunidade/index.php");
        intent.putExtra("path", "mnt/sdcard/");
        intent.putExtra("name", "portal-android.php");
       
        startService(intent);
    }
   
}
 



package br.jeffersonlanzieri.pagedownload.activity;

import android.app.Activity;
import android.os.Bundle;

import br.jeffersonlanzieri.pagedownload.R;

/**
 * @author Kaito
 *
 */

public class SecondActivity extends Activity {
   
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.second_activity);
    }
   
}
 



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

   
    <Button
        android:id="@+id/button_start_download"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Baixar Página" >

    </Button>
   
</LinearLayout>
 



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

   
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        android:text="Tela iniciada pela notificação" >

    </TextView>
   
</LinearLayout>
 


É bem simples mesmo, mas com uma lida na documentação ou em tutoriais fica fácil de usar com coisas mais complicadas.

BroadcastReceiver
IntentService
Notification
NotificationManager
Service

_________________
Quando seu problema for resolvido, clique na opção Editar no lado superior direito da sua primeira mensagem e coloque [Resolvido] no título.
Se resolveu o problema sozinh@, não esqueça de postar a solução, ela ajuda usuários em buscas no fórum.
Use os marcadores java e xml quando for postar.

Aprenda Java com esta apostila.


06 Nov 2014, 21:19
Perfil WWW
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Re: BroadcastReceiver, Notification e Service
Massa kaito, parabéns pela organização!

_________________
Powell


06 Nov 2014, 22:10
Perfil
Google employee
Google employee

Data de registro: 01 Jul 2013, 13:45
Mensagens: 2735
Localização: Rio de Janeiro
Mensagem Re: BroadcastReceiver, Notification e Service
Valeu! :D

_________________
Quando seu problema for resolvido, clique na opção Editar no lado superior direito da sua primeira mensagem e coloque [Resolvido] no título.
Se resolveu o problema sozinh@, não esqueça de postar a solução, ela ajuda usuários em buscas no fórum.
Use os marcadores java e xml quando for postar.

Aprenda Java com esta apostila.


08 Nov 2014, 15:51
Perfil WWW
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 3 Mensagens ] 

Quem está online

Usuários vendo este fórum: adelar, Analista, Anderson.OL, Andreid, Aniquiler, arkanjo, AT-AT, austonrd, bernardodauer, betofigu, Bitetti, boydivalor, brenno, Caique, canaville, Catapan, cavenaghi, Chefe Nass, Christiane, cleber, Comandante Cody, comolatti, czambroni, dallari, danilosouza, dariosena, developermaster, Diego, dramos, Dudi_FC, eduzortea, eferrari, eluttner, erikopa, espinhara.net, fabielp, fabric01, fgalvão, Filipe larizzatti, flaviocc, frederico.affini, Gabriel Teófilo, garretereis, geeks, Geovanne Duarte, Google Android, Gooooogle, grandebaro, Guilherme, guilhermesmo, guitarro17, gustavo, gutem25, HAMSES, hellbest, Heritrix, interservic, itsN, jacksonvpj, jairom, jaydson, jhonguitar, jhou, Jless@, Julio Assis, JuniorE, jzaires, leo, lillian.brandao, lisbao, Liviosousa, LucasNascimento, lucianno, Luke Skywalker, maiconjunches, malucouto, Marcelo Alves, marcow, marianatallas, marlovich, masf_33, Michel, mikasjau, neosun, niloleite, nq6, obitow, oliveiramc, Orivalde, paulabr, paulo.esantos, peterson.bah, pgbatera, pjorge, pxcx, ramonsiebra, reginaldofdias, renan.fernandes, renatodondoni, renegheller, rfrafa, Rodrigo, rodrigo aguiar, rodrigo_mg, rodrigosalfer, rogerio, Roll, rubens_olv, Samuka, sephct, sergio, SidneiCP, skcratch, soulmachine, srmoreira, suissa, taluna, Telekom [Bot], thiago@xbrain.com.br, ThiMatsu, tiago, Tiago Sousa Roch, tnarnold, tonical, ubiratan, vaniuz, vicfalmac, washington, wingdoido, xGambit, yeltsinlima, zeantonio e 2 visitantes


Você não pode criar novos tópicos neste fórum
Você não pode responder tópicos neste fórum
Você não pode editar suas mensagens neste fórum
Você não pode excluir suas mensagens neste fórum
Você não pode enviar anexos neste fórum

Procurar por:

© 2007 - 2016 Portal Android - Comunidade de Desenvolvedores Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi