Search code examples
androidandroid-activityandroid-lifecycle

Which function is called when application is removed from task manager


I need to make status of user offline. When I press home button onStop() is called, that's fine. When I press back button onDestroy() is invoked. But when I close the app from recent apps by swiping it, onStop() or onDestroy() isn't called.

I need to know when the app is closed from recent apps to do something (e.g make user offline).


Solution

    1. Make a service :

      public class MyService extends Service {
      private DefaultBinder mBinder;
      private AlarmManager  alarmManager ;
      private PendingIntent alarmIntent;
      
      private void setAlarmIntent(PendingIntent alarmIntent){
      this.alarmIntent=alarmIntent;
      }
      
      public void onCreate() {
      alarmManager (AlarmManager)getSystemService(Context.ALARM_SERVICE);
      mBinder = new DefaultBinder(this);
      }
      
       @Override
       public IBinder onBind(Intent intent) {
        return mBinder;
       }
      
       public void onTaskRemoved (Intent rootIntent){
       alarmManager.cancel(alarmIntent);
       this.stopSelf();
      }
      }
      
    2. Make a custom class :

      public class DefaultBinder extends Binder {
          MyService s;
      
          public DefaultBinder( MyService s) {
              this.s = s;
          }
      
          public MyService getService() {
              return s;
          }
      }
      
    3. Add to your activity :

      MyService service;
      protected ServiceConnection mConnection = new ServiceConnection() {
          public void onServiceConnected(ComponentName className, IBinder binder) {
      service = ((DefaultBinder) binder).getService();
      service.setAlarmIntent(pIntent);
          }
      
          public void onServiceDisconnected(ComponentName className) {
              service = null;
          }
              };
      
      protected void onResume() {
          super.onResume();
          bindService(new Intent(this, MainService.class), mConnection,
                  Context.BIND_AUTO_CREATE);
      }
      
      @Override
      protected void onStop() {
          super.onStop();
      
          if (mConnection != null) {
              try {
                  unbindService(mConnection);
              } catch (Exception e) {}
          }
      }