2012-09-13 10 views

Odpowiedz

0

Tak, raz problem z niskim poziomem pamięci przychodzi Android OS zaczyna zabijać aplikację, aby zrekompensować wymaganą pamięć. Korzystając z usług, możesz to osiągnąć, twoja usługa powinna działać równolegle z aplikacją, ale widzisz, że niektóre z nich nawet twoja usługa zostanie zabita jednocześnie. Po zabiciu, jeśli pamięć jest wystarczająca sama Android OS spróbuj ponownie uruchomić aplikację nie we wszystkich przypadkach. Wreszcie nie ma twardych i szybkich zasad ponownego wywoływania aplikacji po zabiciu przez os we wszystkich przypadkach, w których zależy to od os i wewnętrznych zachowań.

+0

tak! ale zauważyłem, że niektóre aplikacje zostały ponownie wywołane. np .: [GO sms] (https://play.google.com/store/apps/details?id=com.jb.gosms&hl=en) Chcę wiedzieć, czy usługi do dodania w kodzie lub zezwoleniu jeszcze nie zostały dany. –

+0

To, co mówię, korzystać z usług .. odnoszą te linki: http://stackoverflow.com/questions/4339556/how-to-restart-android-application-from-within-application, http://stackoverflow.com/ pytania/3041971/android-service-killed, http://stackoverflow.com/questions/7257378/android-how-to-force-restart-service-os-killing-on-low-memory-behavior, http: // stackoverflow.com/questions/9696861/how-can-we-prevent-service-from-killing-by-in-and-android .... lepiej próbować ćwiczyć, unikać ponownego uruchamiania aplikacji, ponieważ twoja aplikacja bierze za dużo pamięć to wystarczający powód do zabicia przez os. –

+0

Dziękuję za odpowiedź i link ... przepraszam .. Moja aplikacja nie została zabita przez os z powodu braku pamięci. Jeśli użytkownik używa aplikacji innej firmy do zwalniania pamięci za każdym razem, zostaje zabity. –

4

Musisz uruchomić usługę w tle za pomocą START_STICKY polecenia. Wystarczy rozszerza usługi i zastąpić oncommand tak:

@Override 
public int onStartCommand(Intent intent,int flags,int startId) { 
    super.onStartCommand(intent, flags, startId); 

    return START_STICKY; 
} 

Jak to obsługa jest restart, gdy jest blisko (przez system lub czegokolwiek innego)

Wystarczy teraz sprawdzić na usługi (onCreate na przykład) jeśli aplikacja działa, czy nie, i uruchom ją ponownie, jeśli nie. Przypuszczam, że program PackageManager pozwala to sprawdzić lub po prostu wstawić statyczną wartość logiczną, aby sprawdzić, czy twoja aktywność jest zawsze uruchomiona.

Pozdrowienia Jim

+0

Yup! zadzwonił i użył twojego fragmentu, ale kiedy ręcznie wymuszam zamknięcie mojej aplikacji i jej nie wywołuje ponownie. jeszcze ten sam –

+0

Twoja usługa jest uruchomiona, zanim zamkniesz aplikację?Umieść Log w metodzie onCreate swojej usługi, tak jak zobaczysz, czy jest uruchomiona i czy jest uruchamiana ponownie po zamknięciu. – jaumard

+0

Oczywiście Moja usługa działa do momentu, gdy siła się zamknie, a usługa będzie idealna po zamknięciu siły. Również użył twojego fragmentu w różne sposoby. To sprawia, że ​​moja aplikacja nie jest idealna, ale kiedy zmuszam się blisko .. nie działa. Dziękuję Ci! –

3

Bug in Android 2.3 with START_STICKY

Musiałem podtrzymanie usługę ze wszystkich moich sił. Jeśli usługa jest uruchomiona w dowolnym momencie, możesz otworzyć interfejs użytkownika.

onDestroy() 

zostanie ponownie uruchomiony.

Nie można odinstalować aplikacji, ponieważ ma ona administratora urządzenia.

Jest to rodzicielska kontrola rodzicielska, użytkownik wie o jej istnieniu. Jedynym sposobem na zatrzymanie jest usunięcie Administratora urządzenia i odinstalowanie go, ale usunięcie Administratora urządzenia zablokuje telefon tak, jak robi to Kaspersky.

Istnieje mnóstwo odbiorników typu braodcast, takich jak rzut finałowy, prezentacja użytkownika, ekran włączony, ekran wyłączony ..., wiele innych, wszystkie rozpoczynające usługę, można to zrobić również za pomocą interfejsu użytkownika. Lub w usłudze sprawdź czy twoja aktywność jest żywa, widoczna, jeśli nie, niż pop.

Mam nadzieję, że wykorzystacie z wystarczającego powodu informacje!

Edit: Restart usługi fragment kodu:

// restart service: 
    Context context = getApplicationContext(); 
    Intent myService = new Intent(context, MyService.class); 
    context.startService(myService); 

Edit2: dodaj spippet aby sprawdzić, czy usługa jest uruchomiona w ... obciążeniem Transmisje

public static boolean isMyServiceRunning(Context context) { 
     ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
     for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
      if (MyService.class.getName().equals(service.service.getClassName())) { 
       Log.d("myTag", "true"); 
       return true; 
      } 
     } 
     Log.d("myTag", "false"); 
     return false; 
    } 

Edit3 drugiej uruchomić usługę:

public static void startTheService(Context context) { 
     Intent myService = new Intent(context, MyService.class); 
     context.startService(myService); 
    } 

Nie zapomnij o systemie Android 2.3 bug: do logiki dla inicjalizacji w

@Override 
public void onCreate() 

a nie:

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
+0

dziękuję! ale zgodnie z tym [post] (http://developer.android.com/reference/android/app/Service.html#ProcessLifecycle) nie jest gwarantowane onDestroy() z powodu przepływu stosu w systemie Android. I wypróbował próbkę onDestroy, by ponownie uruchomić aplikację. jest jeszcze taki sam. –

+1

onDestroy to jest 1 z wielu próbuje ponownie uruchomić żaden zagwarantuje, ale w moim przypadku nie można zabić na dłużej niż 2 min służba –

+0

okay! I dziękuję .. Można podać fragment kodu lub przykład wykorzystania onDestroy() metoda –

2

Choć spojrzenie na Google IO oficjalnego kodu źródłowego produkt Znalazłem następujące

((AlarmManager) context.getSystemService(ALARM_SERVICE)) 
      .set(
        AlarmManager.RTC, 
        System.currentTimeMillis() + jitterMillis, 
        PendingIntent.getBroadcast(
          context, 
          0, 
          new Intent(context, TriggerSyncReceiver.class), 
          PendingIntent.FLAG_CANCEL_CURRENT)); 

URL for code

Możesz rozpocząć lepszą usługę i zarejestrować menedżera alarmów, który Sprawdzam raz za razem, czy twoja aplikacja żyje, jeśli nie, uruchomi ją.

Możesz również utworzyć odbiornik i zarejestrować go pod numerem <action android:name="android.intent.action.BOOT_COMPLETED" />, a następnie możesz uruchomić usługę z poziomu odbiornika. Myślę, że powinien być jakiś komunikat rozgłoszeniowy, gdy system operacyjny lub zabije jakąś usługę/aplikację.

Wystarczy dać przybliżone pojęcie Zrobiłem to i jego pracy 1) zarejestrować odbiornik Kod Odbiornik:

@Override public void onReceive (kontekst kontekst, Intent intent) {

try { 
     this.mContext = context; 
     startService(intent.getAction()); 

     uploadOnWifiConnected(intent); 

    } catch (Exception ex) { 
     Logger.logException(ex); 
     Console.showToastDelegate(mContext, R.string.msg_service_starup_failure, Toast.LENGTH_LONG); 
    } 
} 

private void startService(final String action) { 
    if (action.equalsIgnoreCase(ACTION_BOOT)) { 

     Util.startServiceSpawnProcessSingelton(mContext, mConnection); 

    } else if (action.equalsIgnoreCase(ACTION_SHUTDOWN)) { 

    } 
} 
Kod

Usługa:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    Logger.logInfo("Service Started onStartCommand"); 
    return Service.START_STICKY; 
} 

wolę nic nie robi w onStartCommand bo nim otrzyma wywołanie za każdym razem, gdy uruchomisz usługę, ale onCreate jest wywoływana tylko jako pierwsza usługa, więc wykonuję większość kodu w trybie onCreate, w ten sposób nie obchodzi mnie już, że usługa pogodowa już działa.

+0

intent.getAction() zwraca wartość null i zamiast stosowanego ACTION_VIEW, ale jeszcze tego samego –

+1

+1, może to nie jest idealne kod, ale idea jest dobra, skorzystałem z usługi AlarmService, dzięki twojemu pomysłowi. Nie tak, jak zasugerowałeś, ale potrafię rozgryźć, żeby idealnie spełnić moje potrzeby. Nie muszę ryby, po prostu wiedzieć, jak rybołówstwo;) –

1

według @RetoMeyer z Google, rozwiązaniem jest uczynienie aplikacji "lepką".

w tym celu musisz założyć START_STICKY w swoim zarządzaniu usługą intencji.

sprawdź this reference from developer android

+0

Jego już zdefiniowane przez gim (jaumard) i Algo ale nie działa –

+0

mam verious uruchamiania aplikacji, które używają tego zasobu i działają doskonale. Reto Meyer napisał żałosną książkę. dosłownie. :) –

Powiązane problemy