1

I want to call alarm in background with multiple arrayList items, in recyclerview. Alarm manager check in arrayList(Database) that when Date & Time of item match with current Date & Time, the alarm will be call and also send notification. This all work will be done in background. But in my application when I refresh activity then alarm is calling otherwise it do not call in background. kindly Help me. Thanks!

This is My my Fragment Class where I call Alarm:

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    v = inflater.inflate(R.layout.all_fragment,container,false);
    recyclerView = (RecyclerView) v.findViewById(R.id.recyclerviewAll);

    databaseHelper = new DatabaseHelper(getActivity());

    loadDatabase();
    setAlarm();

    return v;
}

public void loadDatabase() {

    LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());

    databaseHelper.ShowAll(arrayList);
    adapter = new AllFragmentAdapter(getActivity(), arrayList);
    adapter.setOnTapListner(new onTapListener() {
        @Override
        public void OnTapView(int position) {
            Position = position;
         //   Toast.makeText(getContext(), "" + position, Toast.LENGTH_SHORT).show();
        }
    });

    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
    adapter.notifyItemChanged(Position);
    layoutManager.supportsPredictiveItemAnimations();

}


public void setAlarm() {
    Calendar calendar1 = Calendar.getInstance();
    SimpleDateFormat format, format2;
    format2 = new SimpleDateFormat("dd-MM-yyyy HH:mm");
    String currentTime = format2.format(calendar1.getTime());
    String dbTimetoCompare = "";
    Date date1;
    long time1 = 0;

    if (arrayList.size() > 0) {
        for (int i = 0; i < arrayList.size(); i++) {
            if (arrayList.get(i).getSchedule().equals("Schedule")) {
                String date = arrayList.get(i).getDate();
                String time = arrayList.get(i).getTime();
                Name = arrayList.get(i).getName();
                Detail = arrayList.get(i).getDetail();
                String datetime = date + " " + time;
                format = new SimpleDateFormat("dd-MM-yyyy HH:mm");
                try {
                    date1 = (Date) format.parse(datetime);
                    dbTimetoCompare = format.format(date1.getTime());
                    time1 = date1.getTime();

                    Calendar calendar = Calendar.getInstance();
                    calendar.setTimeInMillis(System.currentTimeMillis());

                    alarmManager = (AlarmManager)getActivity().getSystemService(Context.ALARM_SERVICE);
                    Intent intent = new Intent(getContext(), MyAlarm.class);
                    intent.putExtra("CTime", currentTime);
                    intent.putExtra("DBTime", dbTimetoCompare);
                    pendingIntent = PendingIntent.getBroadcast(getActivity(), j, intent, 0);

                    if (currentTime.equals(dbTimetoCompare)){

                        for (j = 0; j < 10; ++j) {

                            alarmManager.set(AlarmManager.RTC_WAKEUP, time1, pendingIntent);

                        }
                        Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
                        Ringtone r = RingtoneManager.getRingtone(getContext(), alert);

                        if (r == null) {

                            alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                            r = RingtoneManager.getRingtone(getContext(), alert);

                            if (r == null) {
                                alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
                                r = RingtoneManager.getRingtone(getContext(), alert);
                            }
                        }
                        if (r != null)
                            r.play();

                      NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getContext());
                        mBuilder.setSmallIcon(R.drawable.ic_notifications_black_24dp);
                        mBuilder.setContentTitle("Notification Alert");
                        mBuilder.setContentText("Name: " + Name + "  Detail: " + Detail);
                        NotificationManager manager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
                        manager.notify(j, mBuilder.build());

                        Toast.makeText(getContext(), "Alarm Called", Toast.LENGTH_SHORT).show();
                    }
                    if (alarmManager != null) {
                        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                                1000 * 60 * 5, pendingIntent);
                        intentArray.add(pendingIntent);
                    }

                } catch (ParseException e) {
                    Toast.makeText(getContext(), "" + e, Toast.LENGTH_SHORT).show();
                }
            }

        }
    }
}

This is my broadcast Class:

public class MyAlarm extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

    }
}
Anthony Cannon
  • 1,245
  • 9
  • 20

1 Answers1

0

Create a new service which triggers the broadcast receiver.

public class AlarmService extends Service {
AlarmManager alarmManager;

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    //throw new UnsupportedOperationException("Not yet implemented");
    return null;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    //return super.onStartCommand(intent, flags, startId);
    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    long intervalSpan = 2 * 60 * 1000;  // set the interval span as your requirement
    Calendar calendar = Calendar.getInstance();
    Intent intentAlarm = new Intent(this, AlarmBroadCastReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intentAlarm, 0);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), intervalSpan, pendingIntent);

    return START_STICKY;
}



@Override
public void onDestroy() {
    super.onDestroy();
    Intent intentAlarm = new Intent(this, AlarmBroadCastReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intentAlarm, 0);
    alarmManager.cancel(pendingIntent);
}
}

In menifest file with application tag declare the service and your broadcast receiver

 <service
        android:name="AlarmService"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>

    </service>
<receiver android:name=".receiver.AlarmBroadCastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

on any click listener you can start the service as

startService(Intent(this@AlarmActivity, AlarmService::class.java))

I hope you have implemented your broadcast receiver so I am not implementing the broadcast receiver here. Now either you can check the condition inside broadcast receiver to trigger the alarm. When the condition is true just call the method to show notification.

Raza
  • 791
  • 7
  • 22