Autore Topic: Creare un BroadcastReceiver sempre attivo  (Letto 2218 volte)

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Creare un BroadcastReceiver sempre attivo
« il: 11 Ottobre 2012, 15:18:25 CEST »
0
Salve a tutti,
sto cercando il modo di creare un broadcast receiver sempre attivo..vorrei che ad un certo evento (ad esempio rotazione) venga chiamato il mio receiver..il problema è che non so come renderlo residente nel sistema e attivo 24h/24h...
Al momento lo faccio partire attraverso un Activity ma quando questa viene chiusa anche il mio receiver si chiude... ho provato anche a creare un service il quale fa partire un thread in background ma alla fine se chiudo la mia activity che lo ha lanciato viene chiusa anche la mia receiver..
qualcuno di voi potrebbe suggerirmi una strada?

Grazie ragazzi
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #1 il: 12 Ottobre 2012, 09:39:11 CEST »
0
Non ho ben capito qual'è il problema... potresti riportare il manifest con la dichiarazione del receiver e come lo lanci attualmente? Io sapevo che in teoria dovrebbe restare "attivo" anche dopo che hai chiuso l'activity...
Occhio comunque che da android 3.1 i BroadcastReceiver non possono più essere attivati da intent espliciti, se prima l'applicazione non è stata aperta almeno una volta > doc <

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #2 il: 12 Ottobre 2012, 10:46:05 CEST »
0
Hai ragione scusa non sono stato molto chiaro.

ti metto il blocco Application del mio manifest

Codice (XML): [Seleziona]
 <application
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
        <activity
           android:configChanges="orientation|smallestScreenSize|screenSize|screenLayout"
           android:name=".PFSLMain"
           android:label="@string/title_activity_pfslmain" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                                <category android:name="android.intent.category.HOME" />
                                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Settings" ></activity>
        <receiver android:name="it.lr.PLSEReceiver"
           android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
                <intent-filter >
                <action android:name="android.intent.action.CONFIGURATION_CHANGED"/>
                <category android:name="android.intent.category.HOME" />
                               
            </intent-filter>
        </receiver>
        <service android:name="it.lr.PLSEService">
           <action android:name="it.lr.PLSEReceiver"></action>
        </service>
       
    </application>

Praticamente io voglio fare un Receiver che sia attivo fin dal Boot del telefono e che si attivi ogni qualvolta vi sia un Configuration_changed (rotazione telefono, cambio risoluzione etc). Il mio receiver dovrebbe chiamare poi un Service che effettuerà alcune operazioni.
Nel manifest ho pensato di censire il mio receiver esplicitando l'intent filter del CONF_CHANGED e nella dichiarazione del mio service ho messo l'action del mio receiver.
Non so se così può funzionare. Programmo su Android da ormai 8 mesi ma è la prima volta che mi trovo a gestire deamon/service e quindi su questo sono un po' noob XD

Grazie ancora :)
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #3 il: 12 Ottobre 2012, 10:52:09 CEST »
0
Non so se così può funzionare.

Purtroppo non credo.
Come scritto nella doc quell'intent può essere intercettato solo da broadcastreceiver registrati con il metodo Context.registerReceiver() quindi dentro una Activity o un Service e non da uno registrato nel manifest.
http://developer.android.com/reference/android/content/Intent.html#ACTION_CONFIGURATION_CHANGED

(se ti stai chiedendo perchè la risposta è semplice: molto probabilmente viene lanciato molto spesso.)

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #4 il: 12 Ottobre 2012, 10:55:27 CEST »
0
Si avevo letto di questa cosa e infatti volevo provare a mettere un Service che lancia al suo interno il receiver..il problema è sempre lo stesso però: io vorrei avviare il service a prescindere dall'avvio di un'attività. Per ora riesco ad avviare il service solo da un Activity e purtroppo quando l'activity va in stato pausa o viene comunque chiusa, anche il service (e il relativo receiver) si bloccano e smettono di funzionare.
Io vorrei creare un qualcosa che sia residente in memoria e che possa sempre funzionare... ma francamente non so proprio come fare :(
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #5 il: 12 Ottobre 2012, 10:59:59 CEST »
0
Si avevo letto di questa cosa e infatti volevo provare a mettere un Service che lancia al suo interno il receiver..il problema è sempre lo stesso però: io vorrei avviare il service a prescindere dall'avvio di un'attività. Per ora riesco ad avviare il service solo da un Activity e purtroppo quando l'activity va in stato pausa o viene comunque chiusa, anche il service (e il relativo receiver) si bloccano e smettono di funzionare.
Io vorrei creare un qualcosa che sia residente in memoria e che possa sempre funzionare... ma francamente non so proprio come fare :(

Non è una soluzione che mi sento di suggerirti in quanto non la ritengo pulita ma al limite potresti creare un receiver che intercetta il boot del dispositivo e fa partire il tuo service, che a sua volt registra il receiver che ti serve.

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #6 il: 12 Ottobre 2012, 11:02:03 CEST »
0
Permission:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

Intent:

<intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>

 :-\

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #7 il: 12 Ottobre 2012, 11:07:16 CEST »
0
Scusa ma quell'intent e quel permission a cosa lo devo associare? al Service?
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #8 il: 12 Ottobre 2012, 11:11:14 CEST »
0
Lo puoi associare ad un receiver e poi fai partire un service per esempio....  ;-)

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #9 il: 12 Ottobre 2012, 16:13:08 CEST »
0
niente da fare...

ho creato un service al cui interno viene definito un broadcastReceiver e che registro al momento della creazione del mio service, ecco il codice:
Codice (Java): [Seleziona]
package it.lr.padfoneslauncher;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.widget.Toast;

public class PFSLService extends Service{

        private static final String BCAST_CONFIGCHANGED = "android.intent.action.CONFIGURATION_CHANGED";
        private static final String BCAST_CATEGORY_HOME="android.intent.category.HOME";
        private static final String BCAST_CATEGORY_LAUNCHER="android.intent.category.LAUNCHER";
        private static Context mContext;
        private IntentFilter filter;
        @Override
        public IBinder onBind(Intent arg0) {
                // TODO Auto-generated method stub
                return null;
        }

        @Override
        public void onCreate() {
                //costruisco il broadcast receiver
                filter=new IntentFilter();
                filter.addAction(BCAST_CONFIGCHANGED);
                filter.addCategory(BCAST_CATEGORY_LAUNCHER);
                this.registerReceiver(mBroadcastReceiver, filter);
               
                toast("creato il service");
               
        }
       
        @Override
        public void onDestroy() {
                // TODO Auto-generated method stub
                super.onDestroy();
                toast("service distrutto");
                this.unregisterReceiver(mBroadcastReceiver);
        }
       
        @Override
        public void onLowMemory() {
                // TODO Auto-generated method stub
                super.onLowMemory();
                toast("poca memoria");
                this.unregisterReceiver(mBroadcastReceiver);
               
        }
       
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
                // TODO Auto-generated method stub
               
               
                toast("service partito");
               
                return super.onStartCommand(intent, flags, startId);
               
       
        }
       
    public void toast(String string) {
        Toast.makeText(this, string, Toast.LENGTH_LONG).show();
        }
   
    public BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent myIntent) {

            if ( myIntent.getAction().equals( BCAST_CONFIGCHANGED ) ) {
                toast("sono dentro configchenged");
                if(myIntent.getCategories().equals(BCAST_CATEGORY_LAUNCHER))
                        toast("sono dentro il category");
            }
        }
    };
   
}

Durante la registrazione io imposto come intent l'action del configuration changed e come category LAUNCHER.
a questo punto ho impostato il service dentro il mio manifest, insieme ovviamente al permission.

Codice (XML): [Seleziona]
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-sdk
       android:minSdkVersion="15"
       android:targetSdkVersion="15" />
   
    <application
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
       
        <activity
           android:configChanges="orientation|smallestScreenSize|screenSize|screenLayout"
           android:name=".PFSLMain"
           android:label="@string/title_activity_pfslmain" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                                <category android:name="android.intent.category.HOME" />
                                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Settings" ></activity>
   
        <service android:name="iit.lr.padfoneslauncher.PFSLService">
                <intent-filter>
                        <action android:name="android.intent.action.BOOT_COMPLETED"/>
                        </intent-filter>
        </service>
       
    </application>

In teoria al cambio della configurazione dovrebbe attivarsi il mio receiver e dovrebbe stampare quei toast che ho inserito nel codice..di fatto non fa niente :( :(
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #10 il: 12 Ottobre 2012, 17:39:22 CEST »
0
Non associare il boot completed ad un service... prova ad associarlo ad un receiver e poi da lì fai partire un service.

 :-\

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #11 il: 15 Ottobre 2012, 10:53:48 CEST »
0
ma non posso... il mio receiver deve attivarsi ogni qualvolta avviene un configuration_change (in particolare quando cambia la risoluzione dello schermo) il problema è che se censissi il receiver direttamente nel manifest sarei costretto a dire al manifest l'intent-filter relativo al configuration_change e questo android non lo permette! Configuration_change funziona SOLO se lo attivi via codice e non nel manifest direttamente...
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #12 il: 15 Ottobre 2012, 11:46:40 CEST »
0
Scusa ma tu hai detto questo:
Si avevo letto di questa cosa e infatti volevo provare a mettere un Service che lancia al suo interno il receiver..il problema è sempre lo stesso però: io vorrei avviare il service a prescindere dall'avvio di un'attività.

Quindi il giro dovrebbe essere:

receiver sul boot
crei un service
dal service lanci il receiver del configuration change

O mi sono perso qualcosa io? :-\

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #13 il: 15 Ottobre 2012, 11:49:29 CEST »
0
beh si..volevo qualcosa di più elegante però ...ma mi sa che questo è l'unico modo XD
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Creare un BroadcastReceiver sempre attivo
« Risposta #14 il: 15 Ottobre 2012, 11:57:09 CEST »
0
beh si..volevo qualcosa di più elegante però ...ma mi sa che questo è l'unico modo XD
Elegante ed android a volte non si sposano benissimo  :D