Search code examples
javaandroidalarmmanagertoast

show toast in specific time every day


I want to make simple android app that will show a toast in specific time every day say at 8:00 pm. How do I do it? On what I should depend? alarm manager and broadcast receiver? and in broadcast file how can i define between two events,alarm broadcast and receive new incoming sms broadcast using this outgoing call action

if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {

 if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {

Solution

  • AlarmReceiver.java

    public class AlarmReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // any action you want to perform will come here
            Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show();
        }
    }
    

    MainActivity.java

    public class MainActivity extends Activity {
        private PendingIntent pendingIntent;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            /* Retrieve a PendingIntent that will perform a broadcast */
            Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class);
            pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, 0);
    
            setAlarm();
    
        }
    
        private void setAlarm() {
            AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            int interval = 1000 * 60 * 20;
    
            /* Set the alarm to start at 8.00 PM */
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.set(Calendar.HOUR_OF_DAY, 20);
            calendar.set(Calendar.MINUTE, 00);
    
            /* Repeating on every 20 minutes interval */
            manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                1000 * 60 * 20, pendingIntent);
    
        }
    
        public void cancelAlarm() {
            AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            manager.cancel(pendingIntent);
            Toast.makeText(this, "Alarm Canceled", Toast.LENGTH_SHORT).show();
        }
    

    The below class is to keep the alarm even after the device reboot.

    DeviceBootReceiver.java

    public class DeviceBootReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
                /* Setting the alarm here */
                Intent alarmIntent = new Intent(context, AlarmReceiver.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
    
                AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
                int interval = 8000;
                manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
    
                Toast.makeText(context, "Alarm Set", Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    In manifest:

    Add permission

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    

    and receivers

     <receiver android:name=".AlarmReceiver">
          <intent-filter>
               <action android:name="android.intent.action.BOOT_COMPLETED"/>
          </intent-filter>
     </receiver>
    
    <receiver android:name=".DeviceBootReceiver"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
    </receiver>