AlarmManager setInexactRepeating,setWindow,setRepeating方法在工作日内从循环内调用时不会触发警报 [英] AlarmManager setInexactRepeating, setWindow, setRepeating methods do not fire alarm when called from within loop for week days

查看:241
本文介绍了AlarmManager setInexactRepeating,setWindow,setRepeating方法在工作日内从循环内调用时不会触发警报的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

要求: -

我需要在一周的选定日期和警报开始的日期发出警报(例如我想从5月开始每周的周五和周六发出警报2017年6月26日下午6:45)

Requirement :-
I need to fire alarm on selected days of a week and a date from which alarms would start(for example I want to fire alarm on Friday and Saturday of every week starting from May 26, 2017 at 6:45 PM)

问题: -

BroadcastReceiver的 onReceive() setInexactRepeating setWindow setRepeating 方法不会执行>从循环中调用方法。

Problem:-
BroadcastReceiver's onReceive() method does not executes when AlarmManager setInexactRepeating, setWindow or setRepeating methods are called from within a loop.

此任务使用的代码如下所述: -

AndroidManifest.xml

Code used for this task is mentioned below:-
AndroidManifest.xml

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/MainThemeBlueAccent">
        <activity android:name=".Activities.MainActivity">
           <intent-filter>
             <action android:name="android.intent.action.MAIN" />
             <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
        </activity>

        <activity
            android:name=".Activities.ActivitySaveReminder"
            android:screenOrientation="portrait"
            android:theme="@style/MainThemeBlueAccent"
            android:windowSoftInputMode="adjustNothing" />

        <receiver android:name=".Activities.MedicineReminderAlarmReceiver"
            android:process=":remote">
            <!--<intent-filter>
                <action android:name="android.intent.action.NOTIFY"/>
            </intent-filter>-->
        </receiver>

        <receiver android:name=".Activities.AlarmBootCompletedReceiver"
            android:exported="false"
            android:enabled="true"
           android:permission="android.permission.RECEIVE_BOOT_COMPLETED">  
           <intent-filter>
             <action android:name="android.intent.action.BOOT_COMPLETED"/>
             <category android:name="android.intent.category.DEFAULT"/>
           </intent-filter>
        </receiver>

    </application>
  <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
</manifest>

ActivitySaveReminder.java

ActivitySaveReminder.java

public class ActivitySaveReminder extends AppCompatActivity{

    onCreate() {
        fireAlarmOnWeekDays();
    }

    public void fireAlarmOnWeekDays() {
        long[] weekDaysMillisecondsArr = {1495737000000l, 1495823400000l};
        long[] alarmStartMillisArr = {1495801680000l};
        Calendar calendar = Calendar.getInstance();

        for (int i = 0; i < weekDaysMillisecondsArr.length; i++) {
            calendar.setTimeInMillis(weekDaysMillisecondsArr[i]);
            Log.d(TAG, "fireAlarmOnWeekDays: -->> selected day time stamp --> "+calendar.getTime());

            for (int j = 0; j < alarmStartMillisArr.length; j++) {
                int id = new Random().nextInt();
                Intent intentRemiderAlarm = new Intent(mContext, MedicineReminderAlarmReceiver.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, id, intentRemiderAlarm, PendingIntent.FLAG_UPDATE_CURRENT);
                AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
                pendingIntentsList.add(pendingIntent);

                if (Build.VERSION.SDK_INT >= 19) {
                    alarmManager.setWindow(AlarmManager.RTC_WAKEUP, alarmStartMillisArr[j], AlarmManager.INTERVAL_DAY * 7, pendingIntent);
//                    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartMillisArr[j], AlarmManager.INTERVAL_DAY * 7, pendingIntent);
//                    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, alarmStartMillisArr[j], AlarmManager.INTERVAL_DAY * 7, pendingIntent);
                } else {
                    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, alarmStartMillisArr[j], AlarmManager.INTERVAL_DAY * 7, pendingIntent);
                }
                Log.d(TAG, "fireAlarmOnWeekDays: -->> alarm start time -->> "+alarmStartMillisArr[j] + " id -->> "+id);
            }
        }
    }
}

MedicineReminderAlarmReceiver .java

MedicineReminderAlarmReceiver.java

ublic class MedicineReminderAlarmReceiver extends BroadcastReceiver {
    private final String TAG = "MedicineRemindrAlrmRcvr";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (BuildConfig.DEBUG) {
            Log.d(TAG, "onReceive: -->> executed");
            Log.d(TAG, "onReceive: -->> System.currentTimeMillis() -->> "+ System.currentTimeMillis());
        }
    }
}

styles.xml

styles.xml

<style name="MainThemeBlueAccent" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="colorPrimary">@color/status_bar_color</item>
        <item name="colorPrimaryDark">@color/status_bar_color</item>
        <item name="colorAccent">@color/blue_color</item>
        <item name="android:actionMenuTextColor">@color/text_heading_color_black</item>
        <item name="actionMenuTextColor">@color/text_heading_color_black</item>
        <item name="android:textColorSecondary">@color/text_sub_heading_color_light_black</item>
    </style>

strings.xml

strings.xml

<string name="app_name">ReminderSample</string>


推荐答案

试试这段代码,它的工作时间是星期五报警同样你可以设置星期六
首先你需要注册你的闹钟接收器和闹钟时间

public static void SetAlarmForFriday(Context mContext) {
        try {

            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
            System.out.println("Date " + calendar.getTime());

            int year = calendar.get(Calendar.YEAR);
            int month = calendar.get(Calendar.MONTH) + 1;
            int day = calendar.get(Calendar.DAY_OF_MONTH);

            String DateToConvert = day + "," + month + "," + year + " 10:10 AM";
            Date date = new SimpleDateFormat("dd,MM,yyyy hh:mm a", Locale.ENGLISH).parse(DateToConvert);

            Intent intent = new Intent(mContext, AlarmReceiver.class);
            intent.setAction("setYourActionHere");
            PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext.getApplicationContext(), 234324243, intent, 0);
            AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(mContext.ALARM_SERVICE);

            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, date.getTime(), AlarmManager.INTERVAL_DAY, pendingIntent);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

制作接收器类

public class AlarmReceiver extends BroadcastReceiver {
    public AlarmReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.


    }

}

在应用标签下的清单文件中注册您的广播接收器

<receiver
            android:name=".AlarmReceiver"
            android:enabled="true"
            android:exported="true"></receiver>

这篇关于AlarmManager setInexactRepeating,setWindow,setRepeating方法在工作日内从循环内调用时不会触发警报的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆