Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fire notification at every 24 hours and at exact time of 8 AM

Tags:

I am using AlarmManager() to fire notification and repeat it at every 24 hours.

My code is on onCreate() in Splash Activity which fires first when anyone opens App. User can install App at anytime. So I want that when User installs App, It checks for the timing and then fires Notification at 8 AM and repeat it daily. I don't want notification when anyone opens App.

My code is as below :

public class Splash extends Activity {  final String WebsiteURL = "http://www.mytestbuddy.com";  String cookie;  @SuppressLint("SimpleDateFormat") @Override protected void onCreate(Bundle showSplash) {     // TODO Auto-generated method stub     super.onCreate(showSplash);     setContentView(R.layout.splash);      getWindow().getDecorView().setBackgroundColor(Color.WHITE);      Intent myIntent = new Intent(Splash.this, AlarmReceiver.class);      final PendingIntent pendingIntent = PendingIntent.getBroadcast(             Splash.this, 0, myIntent, 0);      final AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);      CookieSyncManager.createInstance(this);     CookieManager cm = CookieManager.getInstance();     cm.setAcceptCookie(true);     CookieSyncManager.getInstance().sync();     if (cm.getCookie("" + WebsiteURL + "") != null) {         cookie = cm.getCookie("" + WebsiteURL + "").toString();     } else {         cookie = null;     }      Thread timer = new Thread() {         public void run() {             try {                 sleep(5000);             } catch (InterruptedException e) {                 e.printStackTrace();             } finally {                 if (cookie == null) {                     Intent openStartingPoint = new Intent(                             "com.MobileWeb.mytestbuddy.Login");                     startActivity(openStartingPoint);                 } else if (cookie.contains("Premium")) {                      Calendar firingCal = Calendar.getInstance();                     Calendar currentCal = Calendar.getInstance();                      firingCal.set(Calendar.HOUR, 10);                     firingCal.set(Calendar.MINUTE, 30);                     firingCal.set(Calendar.SECOND, 0);                      long intendedTime = firingCal.getTimeInMillis();                     long currentTime = currentCal.getTimeInMillis();                      if (intendedTime >= currentTime) {                         alarmManager.setRepeating(AlarmManager.RTC,                                 intendedTime, AlarmManager.INTERVAL_DAY,                                 pendingIntent);                      } else {                         firingCal.add(Calendar.DAY_OF_MONTH, 1);                         intendedTime = firingCal.getTimeInMillis();                          alarmManager.setRepeating(AlarmManager.RTC,                                 intendedTime, AlarmManager.INTERVAL_DAY,                                 pendingIntent);                     }                      Intent openStartingPoint = new Intent(                             "com.MobileWeb.mytestbuddy.PremiumMain");                     startActivity(openStartingPoint);                 } else {                      Calendar firingCal = Calendar.getInstance();                     Calendar currentCal = Calendar.getInstance();                      firingCal.set(Calendar.HOUR, 10);                     firingCal.set(Calendar.MINUTE, 30);                     firingCal.set(Calendar.SECOND, 0);                      long intendedTime = firingCal.getTimeInMillis();                     long currentTime = currentCal.getTimeInMillis();                      if (intendedTime >= currentTime) {                         alarmManager.setRepeating(AlarmManager.RTC,                                 intendedTime, AlarmManager.INTERVAL_DAY,                                 pendingIntent);                      } else {                         firingCal.add(Calendar.DAY_OF_MONTH, 1);                         intendedTime = firingCal.getTimeInMillis();                          alarmManager.setRepeating(AlarmManager.RTC,                                 intendedTime, AlarmManager.INTERVAL_DAY,                                 pendingIntent);                     }                      Intent openStartingPoint = new Intent(                             "com.MobileWeb.mytestbuddy.Main");                     startActivity(openStartingPoint);                 }             }         }     };      timer.start(); } 

}

like image 811
Jeeten Parmar Avatar asked Jun 01 '13 08:06

Jeeten Parmar


People also ask

What is exact alarm?

Set an exact alarm. The system invokes an exact alarm at a precise moment in the future. If your app targets Android 12 or higher, you must declare one of the "Alarms & reminders" permissions; otherwise, a SecurityException occurs. Your app can set exact alarms using one of the following methods.

How do I set multiple alarms on Android?

To access the alarms, tap the alarm icon at the top of the screen. To add a new alarm, tap the plus icon button at the bottom of the screen. This button can be used to add multiple alarms. To set the time for the alarm, tap the hour on the time on the left and then tap the hour on the clock on the right.


2 Answers

Do as chintan suggested. To get a clear picture, the exact solution might look something similar to the below:

Intent myIntent = new Intent(Splash.this, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(Splash.this, 0, myIntent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);  Calendar firingCal= Calendar.getInstance(); Calendar currentCal = Calendar.getInstance();  firingCal.set(Calendar.HOUR, 8); // At the hour you wanna fire firingCal.set(Calendar.MINUTE, 0); // Particular minute firingCal.set(Calendar.SECOND, 0); // particular second  long intendedTime = firingCal.getTimeInMillis(); long currentTime = currentCal.getTimeInMillis();  if(intendedTime >= currentTime){     // you can add buffer time too here to ignore some small differences in milliseconds    // set from today    alarmManager.setRepeating(AlarmManager.RTC, intendedTime, AlarmManager.INTERVAL_DAY, pendingIntent); } else{    // set from next day    // you might consider using calendar.add() for adding one day to the current day    firingCal.add(Calendar.DAY_OF_MONTH, 1);    intendedTime = firingCal.getTimeInMillis();     alarmManager.setRepeating(AlarmManager.RTC, intendedTime, AlarmManager.INTERVAL_DAY, pendingIntent); } 
like image 193
Kanth Avatar answered Sep 23 '22 09:09

Kanth


Here is pseudocode :

You have to write this code inside your Splash.java

Step 1 : Is_Alarm_Set(); [Boolean]

Step 2 : false [step 3]

Step 2 : true [step 8] (No need to set)

Step 3 : Get_Time() [User's Current Mobile Time]

Step 4 : Find_Time_Difference() [This function will find difference between user's mobile time and your Fix Time (8AM).]

Step 5 : Now set your alarm as per time difference.[i.e current time is 7 pm and date is 1-june then set alarm of 8 AM for next day.]

Step 6 : Set your repetition days setRepeating()

Step 7 : It will fire alarm as per your fix time 8 AM.

Step 8 : Switch Your Activity.

like image 34
Chintan Khetiya Avatar answered Sep 24 '22 09:09

Chintan Khetiya