首页 > 解决方案 > android中带有Recyclerview的报警管理器

问题描述

我想用多个arrayList项目在后台调用警报,在recyclerview. 警报管理器检查arrayList(Database)当项目的日期和时间与当前日期和时间匹配时,将调用警报并发送通知。所有这些工作都将在后台完成。但是在我的应用程序中,当我刷新活动时,会调用警报,否则它不会在后台调用。请帮助我。谢谢!

这是我的片段类,我称之为警报:

@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();
                }
            }

        }
    }
}

这是我的广播课:

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

    }
}

标签: javaandroidsqliteandroid-recyclerviewalarm

解决方案


创建一个触发广播接收器的新服务。

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);
}
}

在带有应用程序标签的清单文件中声明服务和您的广播接收器

 <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>

在任何点击侦听器上,您都可以将服务启动为

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

我希望你已经实现了你的广播接收器,所以我没有在这里实现广播接收器。现在,您可以检查广播接收器内部的条件以触发警报。当条件为真时,只需调用该方法以显示通知。


推荐阅读