Czy istnieje sposób, aby zmusić aplikację do działania w tle bez względu na wszystko?

12

W Ice Cream Sandwich (ICS) system operacyjny kategoryzuje Twoją aplikację, a każda kategoria ma własny próg, w którym system operacyjny określa, która aplikacja ma zostać zamknięta jako pierwsza, gdy zabraknie pamięci.

Czy ktoś z was był zirytowany, powiedzmy, że otworzyłeś stoper, aby uruchomić w tle, aby zmierzyć czas, który upłynął, a następnie otworzyłeś kilka innych aplikacji i wróciłeś do timera, aby zobaczyć, czy został zresetowany lub zamknięty? Mówię poważnie, to jest naprawdę bardzo irytujące.

Czy istnieje sposób, aby zmusić aplikację do działania w tle bez względu na wszystko, nawet jeśli w systemie operacyjnym zabraknie pamięci?

supertonsky
źródło
7
To znak zły kod aplikacji. Użytkownik nigdy nie powinien się tym przejmować, a Android zapewnia środki, dzięki którym aplikacja może zapisać swój stan i przywrócić go później (od wczesnych wersji Androida). Powinieneś wysłać raport o błędzie do programisty aplikacji.
Flow,

Odpowiedzi:

8

Przyjęta odpowiedź okazała się niepoprawna lub nieaktualna. Moduł „Ustawienia aplikacji” dla aplikacji Xposed pozwala określić, dla poszczególnych aplikacji, aby aplikacje nie były zabijane lub uwalniane:

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

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

Oczywiście należy zachować odpowiedzialną ostrożność, grając z aplikacjami zmieniającymi tak niski poziom zachowania.

Moment obrotowy
źródło
Należy zauważyć, że wymaga to rootowania i instalacji ciężkiej modyfikacji systemu operacyjnego Android.
sweisgerber.dev
5

Prosta odpowiedź: nie. Android zawsze używa OOM (brak pamięci), nadając priorytet zwolnieniu nieużywanej pamięci. Możesz zmienić priorytety aplikacji (przynajmniej do ponownego uruchomienia) za pomocą niektórych menedżerów zadań, ale nawet wtedy, gdy kończy się pamięć, aplikacje w tle zaczynają ginąć.

Pomyśl o tym scenariuszu: pobrałeś źle zakodowaną aplikację, która uruchamia się podczas rozruchu, powoduje przepełnienie bufora i zapycha całą pamięć. Zwykle ta aplikacja jest zabijana, ale jeśli jest ustawiona na otwarcie, skutecznie blokuje telefon do ponownego uruchomienia, a potem zaczyna się od nowa, itd. Itp.

Niektóre liczniki używają usług o wysokich priorytetach, aby uniknąć tego problemu, ale jeśli uruchomisz wystarczającą liczbę wysokowydajnych aplikacji zajmujących zasoby, gdy licznik czasu jest w tle, w końcu zostanie zabity.

onik
źródło
1
Nie musi tak być, IMO. Pozwól systemowi domyślnie postępować w ten sam sposób, a na wypadek, gdyby użytkownik chciał, aby jedna aplikacja działała w tle w tym właśnie momencie, gdy zajdzie taka potrzeba, po prostu podaj tę opcję. Nie musi mieć innej kategorii uprawnień, ponieważ użytkownik może „przypiąć” aplikację. Nie chcę, aby aplikacja była trwale nie do zatrzymania po uruchomieniu. Chcę tylko to zrobić, gdy zajdzie taka potrzeba, jak opisałem w moim pytaniu.
supertonsky,
1
@onik przepełnienie bufora nie ma nic wspólnego z zapchaniem pamięci. Czy wiesz, co to jest przepełnienie bufora?
3
@onik, więc odpowiedź brzmi nie, nie wiesz, co to jest przepełnienie bufora. Rozumiem.
1
@onik również nieskończona pętla na połączonej liście może z pewnością doprowadzić Cię do OOM na długo przed zapętleniem Integer.MAX_VALUEczasów. Jak myślisz, dlaczego to i tak jest ograniczone Integer.MAX_VALUE?
1
@onik poprawnie: z definicji przepełnienie bufora nie może zwiększyć wielkości przydzielonej pamięci. Jeśli zwiększy rozmiar przydzielonej pamięci, nie jest to przepełnienie bufora. Myślę, że myślisz o nieskończonej pętli.
Mooing Duck,
1

Nie. Jednak przychodzą mi na myśl dwie metody złagodzenia problemu, ale obie mogą być wdrożone tylko przez programistę: pierwszą z nich jest wyświetlenie powiadomienia, system Android da aplikacjom, które robią to, wyższy priorytet niż inne. Drugim jest oszczędzanie czasu rozpoczęcia, więc gdy licznik zostanie ostatecznie zrestartowany, nie zostanie zresetowany.

Erik
źródło
1
Uruchamianie aplikacji bez powodu z priorytetem na pierwszym planie (dlatego konieczne jest powiadomienie) jest uważane za złą praktykę. Jak powiedziano wcześniej: Android zapewnia ładny interfejs API, który pozwala nawet na liczniki / liczniki, na które OOM nie ma wpływu. Jest ładny post Dianne Hackborn na ten temat
Flow
Nie mam wątpliwości, że istnieje taki interfejs API, ale gdzie w tym pytaniu wspomniano wcześniej?
Erik,
1
Oczywiście jest oczywiście powód, aby aplikacja działała, jeśli w ogóle jest to możliwe, w przeciwieństwie do opublikowanego przykładu gry.
Erik,
4
Nie, nie ma powodu, aby aplikacja działała tylko z powodu timera. Wystarczy użyć onSaveInstanceStatei, onRestoreInstanceStateaby zabezpieczyć stan aplikacji, w tym informacje o zegarze. Nie musisz biegać na pierwszym planie. Nawet jeśli jest to alarm, którego możesz użyć, AlarmManageraby upewnić się, że zostanie wykonany później. Jedynym powodem, dla którego należy użyć Pierwszego planu, jest: 1. Trwa faktyczna aktywność na pierwszym planie, np. Odtwarzanie muzyki lub wyświetlanie wideo. 2. Chcesz zachować otwarte połączenie danych (np. IMAP IDLE (push)).
Flow
0

Pierwsza metoda: - Jeśli wykonasz Przyklejony wątek w programie, tak, możesz zdecydowanie wymusić działanie programu. Pamiętaj jednak, że użytkownik w trybie ustawień zaawansowanych może zatrzymać działające aplikacje w tle. Jeśli jednak napiszesz lepki wątek w taki sposób, że zaczyna się przy każdym zdarzeniu podarunku, możesz to osiągnąć.

Druga metoda: JEŚLI użytkownik nie jest zrootowany na Androida i chcesz uruchomić aplikację na tym tle. użyj skryptu SL4 w tle aplikacji. użyj skryptu, który wykona sprawdzenie w tle i programów, i napisz interfejs, aby pokazać coś innego.

Np .: W większości silników gier jest to wbudowane. Łączą się z serwerami, mimo że użytkownik wyłączył aplikację. Powodem, dla którego silnik tworzy wiele skryptów w telefonie, który jest losowo sprawdzany przy poszczególnych wydarzeniach i że TRIGGER jest używany do ciągłego uruchamiania aplikacji na tle pierwszego planu.

*** Przepraszamy za TYPO .. sprawdzanie pisowni niedostępne. Mam nadzieję, że osiągniesz to, co chciałeś.

Becky Mannie
źródło
Witamy w Android Enthusiast, stronie pytań i odpowiedzi dla użytkowników końcowych Androida. O ile rozumiem, 2 podane przez ciebie metody można wykonać tylko po stronie programisty, tj. Tych, którzy mają kod źródłowy aplikacji. Niestety może to nie być pomocne dla większości czytelników tutaj, ponieważ nie rozwijają aplikacji. Jeśli może to dotyczyć osób niebędących programistami, rozważ edycję odpowiedzi, aby wyjaśnić, jak to zrobić bez dotykania kodu źródłowego aplikacji . Dzięki.
Andrew T.
-1

Czasami istnieje opcja zablokowania aplikacji. Zapobiega to zabijaniu lub zatrzymywaniu tej aplikacji w telefonie.

Opcja blokady nie jest dostępna w samym systemie operacyjnym, a niektóre aplikacje innych firm, takie jak GO Task Manager itp., Mogą pomóc.

Jayesh Tiwari
źródło
2
Jądro zabija OOM i żadna aplikacja nie może temu zapobiec ani „zablokować” procesu. Aplikacja, z którą masz połączenie, jest zabójcą zadań, który zabija same aplikacje. Funkcja blokowania, o której mowa, zapobiegnie zabijaniu tylko przez zabójcę zadań.
Erik,