2013-08-26 12 views
5

Sto costruendo una biblioteca, che ha la seguente struttura:Come devo fare per evitare perdite BroadcastReceiver

MySDK{ 
    public static void init(Context context){ 
     registerReceivers(); // Register connectivity BroadcastReceiver here 
    } 

    public static void performAction(){}; 
} 

L'utilizzo previsto è: gli utenti della mia libreria chiamata init() nel primo attività loro creano. Il problema è che non annullo la registrazione di BroadcastReceiver e che perde quando l'app viene chiusa. Potrei creare un metodo chiamato deinit() e chiedere agli utenti di lib di chiamarlo quando si lascia Activity, ma c'è un modo più affidabile per liberare risorse?

Perché ho bisogno di ricevitore?

Se non c'è connessione Internet e performAction() non è possibile inviare dati, registro il ricevitore per rilevare la modifica dello stato della connettività.

+0

I BroadcastReceiver saranno necessari solo nella prima attività o saranno necessari più a lungo? – Simon

+0

@Simon vedere l'aggiornamento. Avrò bisogno del ricevitore tutto il tempo. –

+0

Creare un servizio che registri questo ricevitore. –

risposta

3

Se si dichiara il ricevitore di broadcast in Android manifest si prenderà cura della gestione del registro.

Registrare il ricevitore all'interno del tag domanda come questa

<receiver android:name="class name with package"> 
     <intent-filter> 
      <action android:name=" corresponding broadcast name" /> 
     </intent-filter> 
</receiver> 
+1

Per evitare la preoccupazione di avere più destinatari registrati, questo è il più semplice possibile. Inoltre, non è necessario che l'applicazione venga avviata manualmente per poter ricevere la notifica. –

0

È possibile annullare la registrazione del ricevitore una volta terminato il metodo onReceive (alla fine di esso).

Ma non so se questo è adatto a te, dipende da cosa fanno i tuoi ricevitori.

Ha funzionato per me al momento della registrazione SMSsent/ricevitori consegnati ..

2

Perché non solo registrare il ricevitore se performAction() ha bisogno di rinviare l'azione? Ciò limiterà il ricevitore al solo essere sul posto se c'è in realtà qualcosa in attesa di essere fatto. Una volta che il ricevitore cancella con successo la sua coda di azioni, potrebbe annullare la registrazione del ricevitore stesso.

0

hai pensato di estendere android.app.Application e implementa questi metodi:

void onCreate() 

void onLowMemory() 

È possibile registrare tutte le BroadcastReceivers necessari all'interno onCreate e annullare la registrazione 'em all'interno onLowMemory.

Per recuperare un riferimento di questa classe è possibile chiamare context.getApplicationContext() e trasmetterlo alla sottoclasse dell'applicazione.

Infine, per ottenere la vostra applicazione utilizzare questa soluzione, bisogna mettere queste informazioni all'interno del tag all'interno del vostro AndroidManifest.xml così:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:name="[fully qualified name of your Application subclass]" > 
... 
</application> 
0

Se è necessario il ricevitore in tutte le attività è necessario creare un servizio che registra il ricevitore, here si può vedere come creare un servizio.

Per annullare la registrazione del ricevitore è possibile rilevare quando l'utente termina l'app conoscendo il nome del pacchetto che è attualmente in primo piano. Stai annullando la registrazione del ricevitore quando non ne hai più bisogno, non si verificherà alcuna perdita quando l'utente esce dall'app perché è ora creato e collegato al servizio, non all'applicazione o all'attività.

public String getForegroundApp() throws NameNotFoundException{ 

     RunningTaskInfo info = null; 
     ActivityManager am; 
     am = (ActivityManager)mContext.getSystemService(ACTIVITY_SERVICE); 
     List<RunningTaskInfo> l = am.getRunningTasks(1000); 
     System.out.println(l); 
     Iterator <RunningTaskInfo> i = l.iterator(); 


     String packName = new String(); 
     String appName = new String(); 
     ApplicationInfo appInfo = new ApplicationInfo(); 

     while(i.hasNext()){ 
      info = i.next(); 
      packName = info.topActivity.getPackageName(); 
      if(!packName.equals("com.htc.launcher") && !packName.equals("com.android.launcher")){ //this could be what is causing the problem. not sure. 
       packName = info.topActivity.getPackageName(); 
       break; 
      } 
      info = i.next(); 
      packName= info.topActivity.getPackageName(); 
      break;   
      } 
     return packName; 
     } 

In ogni caso, penso che si dovrebbe creare qualcosa di simile a un metodo stop() e lasciare che l'utente lo chiamano per finalizzare tutto quello che vuoi quando sanno che la stanno uscendo l'applicazione e la libreria non fa più necessaria.

+0

Un servizio viene sempre mantenuto in esecuzione dal sistema. Questo è un grosso problema per questo caso, in cui il servizio non ha nulla a che fare se non essere un segnaposto per un destinatario ... –

Problemi correlati