1

I have created a background service for registering SCREEN_ON and SCREEN_OFF intent to catch an event using broadcast receiver but some time due to unknown reason my service does not pass intent to my main application. For testing I have generated log file using ten second timer that it is my background service working or not, which I have attached below. I got a issue that my background service pause some time and start it automatically.

It is my background service

public class MyBackgroundService extends Service {

    BroadcastReceiver receiver;
    private static final String LOG_TAG = "MyBackgroundService";

    @Override
    public void onCreate() {
        super.onCreate();
        Timber.i("Foreground Service OnCreate");
    }

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

        Timber.i("Start Foreground Service");

        receiver = new ScreenStateReceiver();
        registerReceiver(receiver,  new IntentFilter(Intent.ACTION_SCREEN_ON));
        registerReceiver(receiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));

        if (intent.getAction().equals(Constants.STARTFOREGROUND_ACTION)) {

            Intent notificationIntent = new Intent(this, HomeActivity.class);
           
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                    notificationIntent, 0);

            Notification notification = new NotificationCompat.Builder(this)
                    .setContentTitle("text")
                    .setTicker("text")
                    .setContentText("text")
                    .setSmallIcon(R.drawable.logo_icon)
                    .setContentIntent(pendingIntent)
                    .setOngoing(true).build();

            startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
                    notification);

        }
        startTimer();
        
        return START_STICKY;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Timber.i("Foreground Service onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        Timber.i("Foreground Service onTaskRemoved");
        super.onTaskRemoved(rootIntent);
    }

    @Override
    public void onDestroy() {
        stopForeground(true);
        Timber.i("Foreground Service onDestroy");
        stoptimertask();
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // Used only in case of bound services.
        return null;
    }

    private Timer timer;
    private TimerTask timerTask;
    public void startTimer() {
        //set a new Timer
        timer = new Timer();

        //initialize the TimerTask's job
        initializeTimerTask();

        //schedule the timer, to wake up every 1 second
        timer.schedule(timerTask, 10000, 10000); //
    }

    /**
     * it sets the timer to print the counter every x seconds
     */
    public void initializeTimerTask() {
        timerTask = new TimerTask() {
            public void run() {
                Timber.i("Timer");
            }
        };
    }

    /**
     * not needed
     */
    public void stoptimertask() {
        //stop the timer, if it's not already null
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

}

It is my broadcast Receiver

public class ScreenStateReceiver extends BroadcastReceiver {

    public ScreenStateReceiver(){
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        if(action.equals(Intent.ACTION_SCREEN_OFF)){

            Timber.i("Screen OFF");
       }
        else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            Timber.i("Screen ON");
        }
    }
}

Menifest,xml file declaration

<uses-permission android:name="android.permission.WAKE_LOCK"/>
    
    <service android:name=".service.MyBackgroundService"/>
    
    <receiver android:name=".receiver.ScreenStateReceiver" android:enabled="true" android:exported="true">
        <intent-filter >
            <action android:name="android.intent.action.SCREEN_OFF" />
            <action android:name="android.intent.action.SCREEN_ON" />
        </intent-filter>
    </receiver>

I am starting Service using intent

Intent service = new Intent(getContext().getApplicationContext(), MyBackgroundService.class);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

    service.setAction(Constants.STARTFOREGROUND_ACTION);
    getContext().getApplicationContext().startForegroundService(service);
}
else{

    service.setAction(Constants.MAIN_ACTION);
    getContext().getApplicationContext().startService(service);
}

Here this picture of my log file LOG FILE using this log file you can see background service is stop and start automatically. please help me resolve this issue.

Michele La Ferla
  • 6,775
  • 11
  • 53
  • 79
user3513759
  • 67
  • 10

1 Answers1

0

There is a restriction for service in Oreo onward, We can start a service by calling startService() only when the application is in foreground. When you exit from the app (app is in background), then it has a window of several minute, in that app can run the service. At the end of window, app considered to be idle,that time system stop the background service. In order to achieve run a service even in background, either we have to implement foreground service or we have to use job scheduler etc.

Navas pk
  • 331
  • 3
  • 17