Search code examples
androidbackground-serviceforeground-serviceforegroundnotification

My foreground service is killed on some devices like vivo after killing app?


My foreground service is killed on some devices like vivo after killing app, is there any workaround to keep it alive?

I am using foreground service like:

public class MyService extends IntentService {

    private final String TAG = "IntentService";
    private PowerManager.WakeLock wakeLock;

    public MyService() {
        super("MyService");
        setIntentRedelivery(true);
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.d(TAG, "onHandleIntent: Service running");
        for (int i = 0; i < 20; i++) {
            Log.d(TAG, "onHandleIntent: service running status: " + i);
            SystemClock.sleep(3000);
        }
    }

    @Override
    public void onCreate() {
        Log.d(TAG, "onCreate: IntentService Created");
        super.onCreate();

        PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        this.wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "Service: WakeLock");
        this.wakeLock.acquire();
        Log.d(TAG, "onCreate: Wakelock acquired");


        Notification notification = new NotificationCompat.Builder(this, App.NOTIFICATION_CHANNEL_ID)
                .setContentTitle("Intent Service")
                .setContentText("Service running in background")
                .setSmallIcon(android.R.drawable.sym_def_app_icon)
                .build();
        startForeground(12, notification);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy: IntentService Destroyed");
        super.onDestroy();
        this.wakeLock.release();
        Log.d(TAG, "onDestroy: Wakelock released");
    }
}


Solution

  • I got it worked using a workaround.

    Registered a fake static implicit receiver like this:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
    <receiver android:name=".SampleBroadcast">
       <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED" />
       </intent-filter>
    </receiver>
    

    My SampleBroadcast File:

    public class SampleBroadcast extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
                Log.d("Foreground App", "Boot Completed");
            }
    
        }
    }
    

    This placed my app in autostart section of OS.

    And now when i am starting my service, Even if i kill the app it is running.