Android service gets killed on swiping out the application

android, service

Solution

I finally found the answer to my own problem. It seems this was a problem with the particular flavor of android that I was running on my phone (Mi UI). There was a separate setting regarding each application whether it needed to be allowed to be restarted or not.

Unless this setting is configured no amount of changing permissions and setting Alarms helped me.

Problem

I have an Android Service class the code for which is as follows: ``` public class LoginService extends Service { BroadcastReceiver wifiStateChangeReciever; @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("AndroidLearning", "Service onStartCommand Started."); return Service.START_STICKY; } @Override public void onCreate() { super.onCreate(); Log.i("AndroidLearning", "Service Started."); final IntentFilter intentFilter = new IntentFilter(); // intentFilter.addAction("android.net.wifi.WIFI_STATE_CHANGED"); intentFilter.addAction("android.net.wifi.STATE_CHANGE"); wifiStateChangeReciever = new WifiStateChangeReciever(); this.registerReceiver(wifiStateChangeReciever, intentFilter, null, null); Log.i("AndroidLearning", "Reciever Registered."); } @Override public void onDestroy() { Log.i("AndroidLearning", "Service Destroyed."); this.unregisterReceiver(wifiStateChangeReciever); } @Override public void onTaskRemoved(Intent rootIntent) { Log.w("AndroidLearning", "On Task Remove: FLAG_STOP_WITH_TASK - " + ServiceInfo.FLAG_STOP_WITH_TASK); this.unregisterReceiver(wifiStateChangeReciever); Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass()); restartServiceIntent.setPackage(getPackageName()); PendingIntent restartServicePendingIntent = PendingIntent.getService( getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmService = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE); alarmService.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent); Log.w("AndroidLearning", "End on task removed"); super.onTaskRemoved(rootIntent); } } ``` It registers a `BroadcastReciever`. The Activity which starts this service has the following code: ``` Intent intent = new Intent(this, LoginService.class); startService(intent); ``` However whenever the Activity is swiped out from the task list (recent) the service is also stopped. I over rode the `onTaskRemoved` to remedy it but it still does not seem to work and the AlarmManager never starts the `pendingIntent`. I have tries using both method: `set` and `setExact` for the `AlarmManager`. I also tried adding the following options to `<service>` tags ``` android:stopWithTask="false" android:process=":remote" ``` but to no avail. What am I doing wrong here? Thanks for the help.

Original source