Android设备重新启动检查指定的报警时间是否已过

Android设备重新启动检查指定的报警时间是否已过,android,alarmmanager,android-alarms,Android,Alarmmanager,Android Alarms,我需要你的帮助。我被这个问题困住了。警报正常工作。但是,当设备重新启动时,db中存储的指定时间是过去(下午3点),而当前时间是下午4点,如何检查以防止立即触发警报 说: 如果规定的触发时间已过,则会立即触发报警。 以下是我迄今为止所尝试的: class DeviceBootReceiver扩展了BroadcastReceiver{ @凌驾 公共void onReceive(上下文、意图){ //检查是否成功重新启动 if(intent.getAction().equals(“android.in

我需要你的帮助。我被这个问题困住了。警报正常工作。但是,当设备重新启动时,db中存储的指定时间是过去(下午3点),而当前时间是下午4点,如何检查以防止立即触发警报

说:

如果规定的触发时间已过,则会立即触发报警。 以下是我迄今为止所尝试的:

class DeviceBootReceiver扩展了BroadcastReceiver{
@凌驾
公共void onReceive(上下文、意图){
//检查是否成功重新启动
if(intent.getAction().equals(“android.intent.action.BOOT_COMPLETED”)){
SharedReferences shared=context.getSharedReferences(Constants.PREF_NAME,context.MODE_PRIVATE);
//检查是否启用了每日通知
//如果是,请调用NotificationPublisher与NotificationAlarmService通信
if(shared.getBoolean(Constants.KEY_是_DAILY_通知的,false)){
DBHelper DBHelper=新的DBHelper(上下文);
DBConnector.dbConnect(dbHelper);
int DAILY_NOTIFICATION_ID=常量。DAILY_VERSE_NOTIFICATION_1_ID;
ArrayList notificationList=dbHelper.getNotifications();
Log.e(“,”notificationList:“+notificationList.size());
用于(通知对象:通知列表){
日历日期时间=Calendar.getInstance();
datetime.set(Calendar.HOUR\u OF_DAY,obj.getHourOfDay());
datetime.set(Calendar.MINUTE,obj.getMinute());
datetime.set(日历秒,0);
Calendar now=Calendar.getInstance();
如果(现在,在(日期时间)之后){
datetime.add(Calendar.DATE,now.get(Calendar.DATE)+1);
}
Log.e(“启动接收器”,“+obj.getHourOfDay()+”:“+obj.getMinute());
Intent myIntent=newintent(上下文,NotificationPublisher.class);
PendingEvent PendingEvent=PendingEvent.getBroadcast(上下文,
每日通知\u ID++,
myIntent、PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager AlarmManager=(AlarmManager)context.getSystemService(context.ALARM\u服务);
alarmManager.setRepeating(alarmManager.RTC_唤醒,
datetime.getTimeInMillis(),AlarmManager.INTERVAL\u DAY,
悬挂式);
}
}
}
}
AndroidManifest:

<receiver
        android:name=".utils.DeviceBootReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>


我的代码似乎有什么问题?如果您能提供帮助,我将不胜感激。谢谢!

一个示例代码,用于设置间隔日的重复报警

  • 我已经在MainActivity中设置了报警,如果您想设置报警,您可以通过扩展应用程序类并编写代码在onCreate中设置报警来完成

    public class MainActivity extends AppCompatActivity {
    
    private AlarmManager alarmMgr;
    private PendingIntent alarmIntent;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, AlarmReceiver.class);
    alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 15);
    calendar.set(Calendar.MINUTE, 30);
    
    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, alarmIntent);
    }
    }
    
  • SampleBootReceiver-在设备重新启动后设置警报

    public class SampleBootReceiver extends BroadcastReceiver {
    
    private AlarmManager alarmMgr;
    private PendingIntent alarmIntent;
    
    @Override
    public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
    
        alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent1 = new Intent(context, AlarmReceiver.class);
        alarmIntent = PendingIntent.getBroadcast(context, 0, intent1, 0);
    
        Calendar now = Calendar.getInstance();
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 15);
        calendar.set(Calendar.MINUTE, 30);
    
        if (calendar.before(now))
            calendar.add(Calendar.DAY_OF_MONTH, 1);
    
        alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, alarmIntent);
    
    }
    }
    }
    
  • AlarmReceiver—在触发报警后执行操作

    public class AlarmReceiver extends BroadcastReceiver {
    
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show();
    }
    }
    
  • 我只是在敬酒

  • 最后是清单文件-

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    
    
    

    
    

  • 我希望您运行上述代码并检查BootCompleted输出。

    我这样设置并检查报警时间,现在它对我有效:

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getCurrentHour());
    calendar.set(Calendar.MINUTE, alarmTimePicker.getCurrentMinute());
    Calendar now = Calendar.getInstance();
    now.setTimeInMillis(System.currentTimeMillis());
    if (calendar.before(now))
        calendar.add(Calendar.DAY_OF_MONTH, 1);
    

    我将尝试这一个bro。如果它晚于当前时间如何?它总是无法在指定时间(下午5点)相对于当前时间(下午4点)发出警报@贝蒂·巴恩斯:当您重新启动设备时,应用程序中设置的报警将被丢弃。重新启动后,如果报警时间晚于当前时间,则会设置报警,否则会触发报警。@bEtTyBarnes:der you go我已经添加了代码片段。@kevz Calendar.DATE和Calendar.DAY\u OF\u MONTH都是相同的。@Pankaj Kumar:同意:)
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    
    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    <receiver android:name=".AlarmReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>
    
    <receiver android:name=".SampleBootReceiver"
        android:enabled="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    
    </application>
    
    </manifest>
    
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getCurrentHour());
    calendar.set(Calendar.MINUTE, alarmTimePicker.getCurrentMinute());
    Calendar now = Calendar.getInstance();
    now.setTimeInMillis(System.currentTimeMillis());
    if (calendar.before(now))
        calendar.add(Calendar.DAY_OF_MONTH, 1);