我有一个 Android 应用程序,我想在白天的固定时间向用户发送通知
为此,我使用 AlarmManager 来安排警报,然后用它来生成通知
但我面临的问题是,如果用户“强制关闭”应用程序,警报将被重置,因此我不会收到任何通知。这是正常行为吗?有什么解决办法吗?
此外,如果手机重新启动,闹钟也会被取消。我该如何控制它?我是否需要收听电话重启事件并再次在那里安排闹钟?这是这里唯一的选择吗?
最佳答案
我的数据库中有一个表,用于存储所有待处理的警报,以备重启时使用。如果手机重新启动,我有一个服务类可以重置警报。
private AppDatabase mDbHelper;
public class BootService extends Service {
@Override
public IBinder onBind(final Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mDbHelper = new AppDatabase(this);
mDbHelper.open();
}
@Override
public void onStart(final Intent intent, final int startId) {
super.onStart(intent, startId);
LoadNotificationsFromDB();
}
private void LoadNotificationsFromDB() {
Cursor c = mDbHelper.getPendingNotifications();
if (c.moveToFirst()) {
do {
int id = c.getInt(AppDatabase.ID_COLUMN);
String date = c.getString(AppDatabase.DATE_COLUMN);
addNotification(id, date);
} while (c.moveToNext());
}
c.close();
}
private void addNotification(int id, String date) {
Intent intent = new Intent(BootService.this,
NotificationBroadcastReceiver.class);
PendingIntent mAlarmSender = PendingIntent.getBroadcast(
BootService.this, id, intent, 0);
long alarmDate = Long.valueOf(date);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, date, mAlarmSender);
}
}
然后创建一个 Receiver 类:
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Intent mServiceIntent = new Intent();
mServiceIntent.setAction("<package name>.BootService");
ComponentName service = context.startService(mServiceIntent);
if (null == service) {
// something really wrong here
}
}
}
}
并将以下行添加到 Manifest.xml
<receiver android:name=".BootReceiver" android:enabled="true">
<intent-filter>
<action android:name ="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
关于android - 如何确保 AlarmManager 在手机重启和应用程序终止后仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11527581/