java - 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) {
}
}
解决方案
创建一个触发广播接收器的新服务。
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))
我希望你已经实现了你的广播接收器,所以我没有在这里实现广播接收器。现在,您可以检查广播接收器内部的条件以触发警报。当条件为真时,只需调用该方法以显示通知。
推荐阅读
- azure-active-directory - Azure AD 的公共证书
- java - 如何同步 2 个 ConcurrentHashMaps?
- angular - Angular 应用程序在解析器中不显示任何内容
- java - 无法检查数组中的所有元素
- javascript - select2 .select2('data', {id: '', text: ''}) 不起作用
- c++ - hackerrank Ramanujan 的 Prime Substrings 1 问题
- java - java fx - 不同的行为取决于上下文
- swift - 在 SFSpeechRecognizer 中使用 AudioToolbox 而不是 AVFoundation
- javascript - 加载本地 Json 文件并使用 Javascript 将其存储在变量中
- flutter - 水平模式下的 Flutter ButtonBar 似乎不尊重 MainAxisSize