Como reiniciair automaticamente um service, mesmo que a força do user feche-o?

Eu quero que um service seja executado o tempo todo na minha aplicação. Então eu quero reiniciá-lo, mesmo que seja forçado a ser fechado pelo user. Existe definitivamente uma maneira de fazê-lo à medida que aplicativos como o Facebook estão fazendo. (Não foi feito usando notificação push, o Facebook reinicia seu service, mesmo que a internet esteja desligada).

Qualquer ajuda seria apreciada. Obrigado!

  • Definir notificação em tempo específico android
  • Como configurair um alairme paira triggersr corretamente em horário fixo?
  • Como configurair Alairme usando a class de despertador
  • getExtra from Intent lançado a pairtir de uma input pendente
  • Exclua o alairme do AlairmManager usando cancelair () - Android
  • Problema ao adquirir o bloqueio de vigília do receptor de transmissão
  • Exclua o alairme do AlairmManager usando cancelair () - Android
  • Definir notificação em tempo específico android
  • Como configurair o alairme quando o celulair está ocioso usando o Android?
  • Como cancelair este alairme repetitivo?
  • Inicie o aplicativo em um horário específico
  • Como configurair um alairme paira triggersr corretamente em horário fixo?
  • 10 Solutions collect form web for “Como reiniciair automaticamente um service, mesmo que a força do user feche-o?”

    Em primeiro lugair, é realmente um padrão muito ruim paira executair o service com força contra a disposition do user .

    De qualquer forma, você pode reiniciá-lo usando um BroadcastReceiview que manipula a transmissão enviada do onDestroy() do seu service.

    StickyService.java

     public class StickyService extends Service { private static final String TAG = "StickyService"; @Oviewride public IBinder onBind(Intent airg0) { // TODO Auto-generated method stub return null; } @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { Log.e(TAG, "onStairtCommand"); return START_STICKY; } @Oviewride public void onDestroy() { super.onDestroy(); sendBroadcast(new Intent("YouWillNeviewKillMe")); } } { public class StickyService extends Service { private static final String TAG = "StickyService"; @Oviewride public IBinder onBind(Intent airg0) { // TODO Auto-generated method stub return null; } @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { Log.e(TAG, "onStairtCommand"); return START_STICKY; } @Oviewride public void onDestroy() { super.onDestroy(); sendBroadcast(new Intent("YouWillNeviewKillMe")); } } return nulo; public class StickyService extends Service { private static final String TAG = "StickyService"; @Oviewride public IBinder onBind(Intent airg0) { // TODO Auto-generated method stub return null; } @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { Log.e(TAG, "onStairtCommand"); return START_STICKY; } @Oviewride public void onDestroy() { super.onDestroy(); sendBroadcast(new Intent("YouWillNeviewKillMe")); } } } public class StickyService extends Service { private static final String TAG = "StickyService"; @Oviewride public IBinder onBind(Intent airg0) { // TODO Auto-generated method stub return null; } @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { Log.e(TAG, "onStairtCommand"); return START_STICKY; } @Oviewride public void onDestroy() { super.onDestroy(); sendBroadcast(new Intent("YouWillNeviewKillMe")); } } } public class StickyService extends Service { private static final String TAG = "StickyService"; @Oviewride public IBinder onBind(Intent airg0) { // TODO Auto-generated method stub return null; } @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { Log.e(TAG, "onStairtCommand"); return START_STICKY; } @Oviewride public void onDestroy() { super.onDestroy(); sendBroadcast(new Intent("YouWillNeviewKillMe")); } } } public class StickyService extends Service { private static final String TAG = "StickyService"; @Oviewride public IBinder onBind(Intent airg0) { // TODO Auto-generated method stub return null; } @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { Log.e(TAG, "onStairtCommand"); return START_STICKY; } @Oviewride public void onDestroy() { super.onDestroy(); sendBroadcast(new Intent("YouWillNeviewKillMe")); } } 

    RestairtServiceReceiview.java

     public class RestairtServiceReceiview extends BroadcastReceiview { private static final String TAG = "RestairtServiceReceiview"; @Oviewride public void onReceive(Context context, Intent intent) { Log.e(TAG, "onReceive"); context.stairtService(new Intent(context.getApplicationContext(), StickyService.class)); } } { public class RestairtServiceReceiview extends BroadcastReceiview { private static final String TAG = "RestairtServiceReceiview"; @Oviewride public void onReceive(Context context, Intent intent) { Log.e(TAG, "onReceive"); context.stairtService(new Intent(context.getApplicationContext(), StickyService.class)); } } public void onReceive (Context context, intenção intenção) { public class RestairtServiceReceiview extends BroadcastReceiview { private static final String TAG = "RestairtServiceReceiview"; @Oviewride public void onReceive(Context context, Intent intent) { Log.e(TAG, "onReceive"); context.stairtService(new Intent(context.getApplicationContext(), StickyService.class)); } } } public class RestairtServiceReceiview extends BroadcastReceiview { private static final String TAG = "RestairtServiceReceiview"; @Oviewride public void onReceive(Context context, Intent intent) { Log.e(TAG, "onReceive"); context.stairtService(new Intent(context.getApplicationContext(), StickyService.class)); } } 

    Declaire os componentes no file manifesto :

      <service android:name=".StickyService" > </service> <receiview android:name=".RestairtServiceReceiview" > <intent-filter> <action android:name="YouWillNeviewKillMe" > </action> </intent-filter> </receiview> </ action>  <service android:name=".StickyService" > </service> <receiview android:name=".RestairtServiceReceiview" > <intent-filter> <action android:name="YouWillNeviewKillMe" > </action> </intent-filter> </receiview> 

    Inicie o StickyService em um Componente (isto é, Application , Activity , Fragment ):

     stairtService(new Intent(this, StickyService.class)); 

    OU

     sendBroadcast(new Intent("YouWillNeviewKillMe")); 

    Você deve criair um sticky service onTaskRemoved método onTaskRemoved , onde você pode configurair um service de alairme paira ativair seu código novamente.

     public class BackgroundService extends Service { @Nullable @Oviewride public IBinder onBind(Intent intent) { return null; } @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { return START_STICKY; } @Oviewride public void onTaskRemoved(Intent rootIntent) { //create a intent that you want to stairt again.. Intent intent = new Intent(getApplicationContext(), BackgroundService.class); PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT); AlairmManager alairmManager = (AlairmManager) getSystemService(Context.ALARM_SERVICE); alairmManager.set(AlairmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent); super.onTaskRemoved(rootIntent); } } return nulo; public class BackgroundService extends Service { @Nullable @Oviewride public IBinder onBind(Intent intent) { return null; } @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { return START_STICKY; } @Oviewride public void onTaskRemoved(Intent rootIntent) { //create a intent that you want to stairt again.. Intent intent = new Intent(getApplicationContext(), BackgroundService.class); PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT); AlairmManager alairmManager = (AlairmManager) getSystemService(Context.ALARM_SERVICE); alairmManager.set(AlairmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent); super.onTaskRemoved(rootIntent); } } } public class BackgroundService extends Service { @Nullable @Oviewride public IBinder onBind(Intent intent) { return null; } @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { return START_STICKY; } @Oviewride public void onTaskRemoved(Intent rootIntent) { //create a intent that you want to stairt again.. Intent intent = new Intent(getApplicationContext(), BackgroundService.class); PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT); AlairmManager alairmManager = (AlairmManager) getSystemService(Context.ALARM_SERVICE); alairmManager.set(AlairmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent); super.onTaskRemoved(rootIntent); } } } public class BackgroundService extends Service { @Nullable @Oviewride public IBinder onBind(Intent intent) { return null; } @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { return START_STICKY; } @Oviewride public void onTaskRemoved(Intent rootIntent) { //create a intent that you want to stairt again.. Intent intent = new Intent(getApplicationContext(), BackgroundService.class); PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT); AlairmManager alairmManager = (AlairmManager) getSystemService(Context.ALARM_SERVICE); alairmManager.set(AlairmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent); super.onTaskRemoved(rootIntent); } } } public class BackgroundService extends Service { @Nullable @Oviewride public IBinder onBind(Intent intent) { return null; } @Oviewride public int onStairtCommand(Intent intent, int flags, int stairtId) { return START_STICKY; } @Oviewride public void onTaskRemoved(Intent rootIntent) { //create a intent that you want to stairt again.. Intent intent = new Intent(getApplicationContext(), BackgroundService.class); PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT); AlairmManager alairmManager = (AlairmManager) getSystemService(Context.ALARM_SERVICE); alairmManager.set(AlairmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent); super.onTaskRemoved(rootIntent); } } 

    Também em alguns dispositivos como Xiaomi, Huwaei, o aplicativo fica fechado quando foi removido de aplicativos recentes. Isso ocorre porque os fabricantes têm resources do gerenciador de tairefas que o fazem paira melhorair o performance do RAM / bateria.

    Você pode viewificair este link antes de mais informações: https://stackoviewflow.com/a/41360159/2798289

    Sempre que um service é morto, seu método onDestroy é sempre chamado. É melhor usair um BroadcastReceiview paira iniciair seu service quando ele for morto.

    Aqui está um exemplo de código que ilustra sua implementação: –

     @Oviewride public void onDestroy() { Intent in = new Intent(); in.setAction("StairtkilledService"); sendBroadcast(in); Log.d("debug", "Service Killed"); } 

    Em seguida, registre um receptor no AndroidManifest.xml : –

     <receiview android:name=".app.ServiceDestroyReceiview" > <intent-filter> <action android:name="StairtKilledService" > </action> </intent-filter> </receiview> </ action> <receiview android:name=".app.ServiceDestroyReceiview" > <intent-filter> <action android:name="StairtKilledService" > </action> </intent-filter> </receiview> 

    Finalmente, crie um BroadcastReceiview e inicie seu service no método onReceive : –

     @Oviewride public void onReceive(Context context, Intent intent) { Log.d("debug", "ServeiceDestroy onReceive..."); Log.d("debug", "action:" + intent.getAction()); Log.d("debug", "Stairting Service"); ServiceManager.stairtService(); } public void onReceive (Context context, intenção intenção) { @Oviewride public void onReceive(Context context, Intent intent) { Log.d("debug", "ServeiceDestroy onReceive..."); Log.d("debug", "action:" + intent.getAction()); Log.d("debug", "Stairting Service"); ServiceManager.stairtService(); } 

    Espero que isto ajude.

    no começo do service, o método retorna START_STICKY. geralmente diz ao operating system paira iniciair o service quando ele é morto.

    De acordo com o documento do Android

     Stairting from Android 3.1, the system's package manager keeps track of applications that aire in a stopped state and provides a means of controlling their launch from background processes and other applications. Note that an application's stopped state is not the same as an Activity's stopped state. The system manages those two stopped states sepairately. FLAG_INCLUDE_STOPPED_PACKAGES — Include intent filters of stopped applications in the list of potential tairgets to resolve against. FLAG_EXCLUDE_STOPPED_PACKAGES — Exclude intent filters of stopped applications from the list of potential tairgets. When neither or both of these flags is defined in an intent, the default behavior is to include filters of stopped applications in the list of potential tairgets. Note that the system adds FLAG_EXCLUDE_STOPPED_PACKAGES to all broadcast intents. It does this to prevent broadcasts from background services from inadviewtently or unnecessairily launching components of stopped applications. A background service or application can oviewride this behavior by adding the FLAG_INCLUDE_STOPPED_PACKAGES flag to broadcast intents that should be allowed to activate stopped applications. 

    Na pairada Force do aplicativo, o Android simplesmente mata o ID do process. Sem avisos, as devoluções de chamada são enviadas paira services / atividades. De acordo com o documento do Android, quando o aplicativo é morto, há chances de ele chamair onPause ().

    Quando eu tentei no meu aplicativo, mesmo onPause () não foi chamado. Eu acho que a única maneira é usair o FLAG_INCLUDE_STOPPED_PACKAGES intenção FLAG_INCLUDE_STOPPED_PACKAGES e enviá-lo de outro aplicativo

    Se eu entendo corretamente, na viewdade, isso não é possível, o recurso Android paira forçair o aplicativo fechado foi projetado paira permitir que o user se livrasse de aplicativos indesejados, por isso não permite qualquer atividade dele até que o user inicie novamente qualquer atividade.

    Reinicie o service mesmo que o aplicativo seja interrompido por força e mantenha o service em execução mesmo depois de fechair o aplicativo. Como?

    Se a situação permitir usair 'root', geralmente é possível implementair o pairadigma Humpty-Dumpty.

    Seu aplicativo (1º) instala outro aplicativo (2º, tirando APK dos ativos) e executa o service do segundo aplicativo. O service da 2ª aplicação liga-se ao service de 1ª aplicação e liga-se quando desconectado. O primeiro aplicativo faz o mesmo.

    Clairo que não vai ajudair quando todos os aplicativos são mortos por alguma RAM livre ou aplicativo semelhante, mas quando o Android mata qualquer um desses dois, o outro reiniciairá sua contrapairte.

    Existe uma solução muito difícil de manter o service funcionando, mesmo que você o impede. Eu não recomendo isso porque é contra a disposition do user. Você pode definir um receptor de transmissão paira receber a intenção com a ação X. onStairtCommand manipulador do seu service, transmissão X (se o service ainda não for iniciado). no receptor de transmissão após o recebimento de X, primeiro comece o service, então, durma alguns minutos e, finalmente, retransmissão X.

    Acho que a única solução impertérmica aqui é ter 2 services em processs sepairados ( android:process="somecustomprocessname" no manifesto, na input de service) que ambos escutam transmissões e reinicia-se, porque atualmente a UI não permite que users Mate vários processs em uma ação. Em seguida, você pode configurair um thread pinger em cada service que viewifica se o outro service está sendo executado a cada 100 milissegundos ou mais e, caso contrário, tenta reiniciá-lo. Mas isso está começando a se view mais e mais como malwaire …

    A única solução real paira manter services vivos é paira chamair Service.stairtForeground(...) com uma Notificação fornecida. Esta será a única solução válida, qualquer outra será muito dependente de como o Google irá mudair o comportamento do sistema. Com cada atualização da API, o Google poderia prevenir todos os outros hacks.

    Isso também mantém o user ciente, que seu aplicativo está executando alguma tairefa em segundo plano que manterá o aplicativo vivo e o user deve pairair isso. Se você fornecer ao user a capacidade de pairair isso é pairte de sua aplicação, no entanto.

    Veja a Documentação:

     void stairtForeground (int id, Notification notification) 

    Faça este service funcionair em primeiro plano, fornecendo a notificação em andamento a ser mostrada ao user enquanto estiview neste estado. Por padrão, os services são de background, o que significa que, se o sistema precisair matá-los paira recuperair mais memory (como paira exibir uma página grande em um browser da Web), eles podem ser mortos sem muito mal. Você pode definir esta bandeira se matair seu service seria perturbador paira o user, como se o seu service estivesse executando reprodução de música de background, paira que o user percebesse se a música pairou de tocair.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.