Android Countdown Timer Run In Background Download Source code here activity_main.xml <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/et_hours" android:hint="Hours" android:inputType="time" android:layout_marginRight="5dp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btn_timer" android:layout_above="@+id/btn_cancel" android:text="Start Timer"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:id="@+id/btn_cancel" android:text="cancel timer"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_timer" android:layout_centerInParent="true" android:textSize="25dp" android:textColor="#000000" android:text="00:00:00"/> </RelativeLayout>MainActivity.javapackage com.countdowntimerservice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.text.SimpleDateFormat; import java.util.Calendar; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_start, btn_cancel; private TextView tv_timer; String date_time; Calendar calendar; SimpleDateFormat simpleDateFormat; EditText et_hours; SharedPreferences mpref; SharedPreferences.Editor mEditor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); listener(); } private void init() { btn_start = (Button) findViewById(R.id.btn_timer); tv_timer = (TextView) findViewById(R.id.tv_timer); et_hours = (EditText) findViewById(R.id.et_hours); btn_cancel = (Button) findViewById(R.id.btn_cancel); mpref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); mEditor = mpref.edit(); try { String str_value = mpref.getString("data", ""); if (str_value.matches("")) { et_hours.setEnabled(true); btn_start.setEnabled(true); tv_timer.setText(""); } else { if (mpref.getBoolean("finish", false)) { et_hours.setEnabled(true); btn_start.setEnabled(true); tv_timer.setText(""); } else { et_hours.setEnabled(false); btn_start.setEnabled(false); tv_timer.setText(str_value); } } } catch (Exception e) { } } private void listener() { btn_start.setOnClickListener(this); btn_cancel.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_timer: if (et_hours.getText().toString().length() > 0) { int int_hours = Integer.valueOf(et_hours.getText().toString()); if (int_hours<=24) { et_hours.setEnabled(false); btn_start.setEnabled(false); calendar = Calendar.getInstance(); simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); date_time = simpleDateFormat.format(calendar.getTime()); mEditor.putString("data", date_time).commit(); mEditor.putString("hours", et_hours.getText().toString()).commit(); Intent intent_service = new Intent(getApplicationContext(), Timer_Service.class); startService(intent_service); }else { Toast.makeText(getApplicationContext(),"Please select the value below 24 hours",Toast.LENGTH_SHORT).show(); } /* mTimer = new Timer(); mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 5, NOTIFY_INTERVAL);*/ } else { Toast.makeText(getApplicationContext(), "Please select value", Toast.LENGTH_SHORT).show(); } break; case R.id.btn_cancel: Intent intent = new Intent(getApplicationContext(),Timer_Service.class); stopService(intent); mEditor.clear().commit(); et_hours.setEnabled(true); btn_start.setEnabled(true); tv_timer.setText(""); break; } } private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String str_time = intent.getStringExtra("time"); tv_timer.setText(str_time); } }; @Override protected void onResume() { super.onResume(); registerReceiver(broadcastReceiver,new IntentFilter(Timer_Service.str_receiver)); } @Override protected void onPause() { super.onPause(); unregisterReceiver(broadcastReceiver); } }Timer_Service.javapackage com.countdowntimerservice; import android.app.Service; import android.content.Intent; import android.content.SharedPreferences; import android.os.Handler; import android.os.IBinder; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.util.Log; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.TimeUnit; public class Timer_Service extends Service { public static String str_receiver = "com.countdowntimerservice.receiver"; private Handler mHandler = new Handler(); Calendar calendar; SimpleDateFormat simpleDateFormat; String strDate; Date date_current, date_diff; SharedPreferences mpref; SharedPreferences.Editor mEditor; private Timer mTimer = null; public static final long NOTIFY_INTERVAL = 1000; Intent intent; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); mpref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); mEditor = mpref.edit(); calendar = Calendar.getInstance(); simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); mTimer = new Timer(); mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 5, NOTIFY_INTERVAL); intent = new Intent(str_receiver); } class TimeDisplayTimerTask extends TimerTask { @Override public void run() { mHandler.post(new Runnable() { @Override public void run() { calendar = Calendar.getInstance(); simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); strDate = simpleDateFormat.format(calendar.getTime()); Log.e("strDate", strDate); twoDatesBetweenTime(); } }); } } public String twoDatesBetweenTime() { try { date_current = simpleDateFormat.parse(strDate); } catch (Exception e) { } try { date_diff = simpleDateFormat.parse(mpref.getString("data", "")); } catch (Exception e) { } try { long diff = date_current.getTime() - date_diff.getTime(); int int_hours = Integer.valueOf(mpref.getString("hours", "")); long int_timer = TimeUnit.HOURS.toMillis(int_hours); long long_hours = int_timer - diff; long diffSeconds2 = long_hours / 1000 % 60; long diffMinutes2 = long_hours / (60 * 1000) % 60; long diffHours2 = long_hours / (60 * 60 * 1000) % 24; if (long_hours > 0) { String str_testing = diffHours2 + ":" + diffMinutes2 + ":" + diffSeconds2; Log.e("TIME", str_testing); fn_update(str_testing); } else { mEditor.putBoolean("finish", true).commit(); mTimer.cancel(); } }catch (Exception e){ mTimer.cancel(); mTimer.purge(); } return ""; } @Override public void onDestroy() { super.onDestroy(); Log.e("Service finish","Finish"); } private void fn_update(String str_time){ intent.putExtra("time",str_time); sendBroadcast(intent); } }
January 9, 2017 at 11:54 am
Your Blog is very unique in every way. Thanks for the best helpful article for sharing with us.
LikeLike
February 16, 2017 at 4:37 am
Hi, I try your code and its working. The only problem is that the timer stops at 0:0:1 and wont continue. Is there any solutions to finish the timer? Thank you.
LikeLike
February 16, 2017 at 1:50 pm
Hello,
Hope you are doing well,
Change this condition in your Service class (Timer_Service.java).
if (long_hours >0) {
String str_testing = diffHours2 + “:” + diffMinutes2 + “:” + diffSeconds2;
Log.e(“TIME”, str_testing);
fn_update(str_testing);
} else {
mEditor.putBoolean(“finish”, true).commit();
mTimer.cancel();
}
WITH THIS:
if (long_hours >= 0) {
String str_testing = diffHours2 + “:” + diffMinutes2 + “:” + diffSeconds2;
Log.e(“TIME”, str_testing);
fn_update(str_testing);
} else {
mEditor.putBoolean(“finish”, true).commit();
mTimer.cancel();
}
NOTE:- IN THIS METHOD I FORGOT TO ADD THE = in front of 0 that’s why its showing you this (0:0:1)
If you are still getting this issue than let me know.
Thanks,
Deepshikha Puri
LikeLike
April 11, 2017 at 10:11 am
I want to set countdown timer in recyclerview withbackground service. Can you please help me for my college project
LikeLike
April 12, 2017 at 5:45 pm
Hello,
Hope you are doing.
Check this link https://deepshikhapuri.wordpress.com/2016/10/26/countdown-timer-in-listview-android/
In this demo I had used the recycler view with countdown timer. Hope this will help you.
Thanks!
LikeLike
July 3, 2017 at 9:41 am
when i restart my application timer starts from beginning..
but i want to run timer continuous in background.
what should i do???
new to android please help.
thanx in advance
LikeLike
July 3, 2017 at 11:00 am
my code is:
Button btnreward;
SharedPreferences preferences;
String date_time;
Calendar calendar;
SimpleDateFormat simpleDateFormat;
SharedPreferences mpref;
SharedPreferences.Editor mEditor;
SharedPreferences.Editor editor,reward_editor;
int et_hours=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer);
tv_timer = (TextView) findViewById(R.id.tv_timer);
btnreward = (Button) findViewById(R.id.btnreward);
init();
starttimer();
preferences = getSharedPreferences(“reward”, MODE_PRIVATE);
reward_editor= preferences.edit();
reward_editor.putBoolean(“reward”, false).commit();
count = 0;
btnreward.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),Timer_Service.class);
stopService(intent);
mEditor.clear().commit();
tv_timer.setText(“”);
reward_editor.putBoolean(“reward”,true);
Intent i=new Intent(TimerActivity.this,MainActivity.class);
startActivity(i);
}
});
}
private void starttimer() {
if (et_hours > 0) {
int int_hours = et_hours;
if (int_hours<=24) {
calendar = Calendar.getInstance();
simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
date_time = simpleDateFormat.format(calendar.getTime());
mEditor.putString("data", date_time).commit();
mEditor.putString("hours", String.valueOf(et_hours)).commit();
Intent intent_service = new Intent(getApplicationContext(), Timer_Service.class);
startService(intent_service);
}else {
Toast.makeText(getApplicationContext(),"Please select the value below 24 hours",Toast.LENGTH_SHORT).show();
}
/*
mTimer = new Timer();
mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 5, NOTIFY_INTERVAL);*/
} else {
Toast.makeText(getApplicationContext(), "Please select value", Toast.LENGTH_SHORT).show();
}
}
private void init() {
mpref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
mEditor = mpref.edit();
try {
String str_value = mpref.getString("data", "");
if (str_value.matches("")) {
tv_timer.setText("");
} else {
if (mpref.getBoolean("finish", false)) {
tv_timer.setText("");
} else {
tv_timer.setText(str_value);
}
}
} catch (Exception e) {
}
}
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String str_time = intent.getStringExtra("time");
tv_timer.setText(str_time);
}
};
@Override
protected void onResume() {
super.onResume();
registerReceiver(broadcastReceiver,new IntentFilter(Timer_Service.str_receiver));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(broadcastReceiver);
}
}
LikeLike
April 19, 2018 at 6:04 am
Can ou help me for background timer in react native.
LikeLike
April 23, 2018 at 8:31 am
I don’t have any experience in React Native
LikeLike
August 9, 2018 at 9:17 pm
getting same problem after putting = in front of 0.
LikeLike
December 9, 2018 at 9:44 am
how can we make this countup timer ?
LikeLike
October 11, 2020 at 6:56 am
very interesting articles; God blesses you with intelligency and beauty
LikeLike