I have made this library the other day for something similar service in background and foreground
And its working absolutely fine with no problems.
The reason I choose to run it with AlarmManager is that the AlarmManager is a great candidate for scheduling if an application needs to perform a local event + allows an application to schedule tasks that may need to run or repeat beyond the scope of its lifecycle. This allows the application to perform some function even after the application process or all of its Android components have been cleaned up by the system.
UPDATE
Call this method to start the service
public void call(int Value_in_seconds) {
if (Value_in_seconds == (int) Value_in_seconds) {
// Number is integer
Long time = new GregorianCalendar().getTimeInMillis() + Value_in_seconds * 1000;
// create an Intent and set the class which will execute when Alarm triggers, here
// ServiceReciever in the Intent, the onRecieve() method of this class will execute when
// alarm triggers
Intent intentAlarm = new Intent(context, ServiceReciever.class);
// create the object
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
//set the alarm for particular time
alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent.getBroadcast(context, 1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
} else {
Toast.makeText(context, context.getString(R.string.intValue), Toast.LENGTH_SHORT).show();
}
}
Create ServiceReciever Class
public class ServiceReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//call the method here
}
}
inside your manifest
<application>
<receiver android:name="hossamscott.com.github.backgroundservice.ServiceReciever" android:process=":ff" android:exported="true" android:enabled="true">
</receiver>
<service android:name="hossamscott.com.github.backgroundservice.BackgroundTask"/>
</application>
And thats should be it, tho if you like to run it in Thread
Than you can add the next lines
public class BackgroundTask extends Service {
private boolean isRunning;
private Context context;
private Thread backgroundThread;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
this.context = this;
this.isRunning = false;
this.backgroundThread = new Thread(myTask);
}
private Runnable myTask = new Runnable() {
public void run() {
// Do something here
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// do your logic here
}
});
stopSelf();
}
};
@Override
public void onDestroy() {
this.isRunning = false;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (!this.isRunning) {
this.isRunning = true;
this.backgroundThread.start();
}
return START_STICKY;
}
}
And to call this class edit ServiceReciever to be like this
@Override
public void onReceive(Context context, Intent intent) {
//call the method here
Intent background = new Intent(context, BackgroundTask.class);
context.startService(background);
}