Esiste un modo per forzare un'app a rimanere in esecuzione in background, qualunque cosa accada?


12

Su Ice Cream Sandwich (ICS) il sistema operativo classifica la tua app e ogni categoria ha una propria soglia in cui il sistema operativo utilizza per determinare quale app chiudere per prima quando esaurisce la memoria.

Qualcuno di voi è stato infastidito, diciamo che hai aperto un timer per l'esecuzione in background per misurare il tempo trascorso da qualcosa, quindi hai aperto alcune altre app e sei tornato al tuo timer solo per vedere che era stato ripristinato o chiuso? Voglio dire, sul serio, è davvero terribilmente fastidioso.

Esiste un modo per forzare un'app a rimanere in esecuzione in background, indipendentemente da cosa succede anche quando il sistema operativo esaurisce la memoria?


7
Questo è un segno di un codice errato dall'app. Un utente non dovrebbe mai preoccuparsi di questo e Android fornisce i mezzi in modo che un'app possa salvare il proprio stato e ripristinarlo in un secondo momento (dalle prime versioni di Android). È necessario inviare una segnalazione di bug allo sviluppatore dell'app.
Flusso

Risposte:


8

La risposta accettata è risultata errata o obsoleta. Il modulo "Impostazioni app" per l'app Xposed ti consente di specificare in base all'app per evitare che le app vengano uccise o liberate:

http://repo.xposed.info/module/de.robv.android.xposed.installer

http://repo.xposed.info/module/de.robv.android.xposed.mods.appsettings

Ovviamente dovrebbe essere prestata attenzione responsabile quando si gioca con app che cambiano un comportamento di così basso livello.


Va notato che questo richiede root ed è l'installazione di una pesante modifica del sistema operativo Android.
sweisgerber.dev

5

Risposta semplice: No. Android utilizza sempre OOM (memoria esaurita) dando priorità alla memoria libera non utilizzata. Puoi modificare le priorità delle app (almeno fino al riavvio) con alcuni gestori attività, ma anche in questo caso se la memoria si esaurisce, le app in background iniziano a essere uccise.

Pensa a questo scenario: hai scaricato un'app con codifica errata che viene eseguita all'avvio, provoca un overflow del buffer e porta tutta la tua memoria. Normalmente questa app viene uccisa, ma se è impostata per rimanere aperta, blocca efficacemente il telefono fino al riavvio, dopodiché si riavvia, e ancora, ecc.

Alcuni timer utilizzano servizi con priorità elevate per evitare questo problema, ma se avvii abbastanza app ad alte prestazioni per il controllo delle risorse mentre il timer è in background, alla fine verrà ucciso.


1
Non deve essere così, IMO. Lascia che il sistema faccia i suoi vecchi modi per impostazione predefinita e nel caso in cui l'utente intenda eseguire una particolare app in background proprio in quel particolare momento in cui si presenta la necessità, basta fornire quell'opzione. Non è necessario disporre di un'altra categoria di autorizzazioni poiché è discrezione degli utenti "bloccare" un'app. Non voglio che un'app sia permanentemente inarrestabile una volta eseguita. Voglio solo un'opzione per farlo quando c'è un bisogno proprio come quello che ho descritto nella mia domanda.
supertonsky,

1
@onik un buffer overflow non ha nulla a che fare con la memoria di hogging. Sai cos'è un buffer overflow?

3
@onik quindi la risposta è no, non sai cos'è un buffer overflow. Fatto.

1
@onik anche un ciclo infinito in un elenco collegato potrebbe sicuramente farti entrare in una OOM molto prima che tu abbia ripetuto i Integer.MAX_VALUEtempi. Perché pensi che le cose siano Integer.MAX_VALUEcomunque limitate ?

1
@onik corretto: per definizione, un overflow del buffer non può espandere la dimensione della memoria allocata. Se espande la dimensione della memoria allocata, non è un buffer overflow. Stai pensando a un ciclo infinito, credo.
Mooing Duck,

1

No. Tuttavia, vengono in mente due metodi per alleviare il problema, ma entrambi possono essere implementati solo dallo sviluppatore: il primo è quello di visualizzare una notifica, Android darà alle app che lo fanno una priorità più alta rispetto ad altri. Il secondo è salvare l'ora di inizio, quindi quando il timer viene riavviato, non verrà ripristinato.


1
L'esecuzione di app senza motivo con priorità in primo piano (ecco perché è necessaria la notifica) è considerata una cattiva pratica. Come detto prima: Android offre una bella API che consente persino timer / contatori che non sono interessati dal killer OOM. C'è un bel post di Dianne Hackborn su questo argomento
Flow

Non dubito che esista una simile API, ma dove in questa domanda è stato menzionato prima?
Erik,

1
Inoltre, c'è ovviamente un motivo per mantenere l'app in esecuzione, se possibile, in questo caso, a differenza dell'esempio di gioco che hai pubblicato.
Erik,

4
No, non c'è motivo per mantenere un'app in esecuzione solo a causa di un timer. Basta usare onSaveInstanceStatee onRestoreInstanceStateper proteggere lo stato dell'App, comprese le informazioni sul timer. Non è necessario eseguire in primo piano. Anche se è un allarme, è possibile utilizzare AlarmManagerper assicurarsi che venga eseguito in seguito. L'unico motivo per cui Foreground dovrebbe essere usato è: 1. Hai qualche attività in primo piano in corso, come la riproduzione di musica o la visualizzazione di un video. 2. Si desidera mantenere aperta una connessione dati (ad es. IMAP IDLE (push)).
Flusso

0

1o metodo: - Se crei Sticky Thread nel programma, sì, puoi forzatamente mantenere il tuo programma in fuga. Tuttavia, ricorda che l'utente in modalità di impostazione avanzata può interrompere l'esecuzione di app in background. Tuttavia, se si scrive un thread appiccicoso in un modo che inizia a qualsiasi evento di evento occorso, ciò può essere ottenuto.

2o metodo: SE l'utente è Android non rootato e vuoi eseguire un'app in background. usa lo script SL4 in background dall'app. usa uno script che ti farà controllare in background e programmi e scrivere il front-end per mostrare qualcos'altro.

Ad esempio: nella maggior parte dei motori di gioco è integrato. Si connettono ai server anche se l'utente ha spento l'app. Il motivo per cui il motore crea più script nel telefono che viene controllato in modo casuale in caso di eventi particolari e che TRIGGER viene utilizzato per eseguire l'app in modo continuo sullo sfondo di primo piano.

*** Ci scusiamo per il controllo ortografico di TYPO .. non disponibile. Spero che raggiungerai ciò che intendevi ottenere.


Benvenuto in Android Enthusiast, un sito di domande e risposte per utenti finali Android. Per quanto posso capire, i 2 metodi che hai fornito possono essere fatti solo dal lato dello sviluppatore, cioè quelli che hanno il codice sorgente dell'app. Sfortunatamente, potrebbe non essere utile per la maggior parte dei lettori qui perché non stanno sviluppando un'app. Se questo potrebbe essere applicabile a utenti non sviluppatori, considera la possibilità di modificare la risposta per chiarire come eseguire queste operazioni senza toccare il codice sorgente dell'app . Grazie.
Andrew T.

-1

A volte c'è un'opzione per bloccare l'app. Ciò impedisce l' uccisione o l' arresto di tale applicazione nel telefono.

L'opzione di blocco non è disponibile nel sistema operativo stesso, può essere utile utilizzare alcune app di terze parti come GO Task Manager , ecc.


2
L'omicidio OOM viene eseguito dal kernel e nessuna app può impedirlo o "bloccare" un processo. L'app a cui sei collegato è un task killer che uccide le app stesse. La funzione di blocco a cui ti riferisci impedisce solo l'uccisione da parte del task killer.
Erik,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.