如何在android中设置一次闹钟

Posted

技术标签:

【中文标题】如何在android中设置一次闹钟【英文标题】:How to set one time alarm in android 【发布时间】:2013-03-28 08:57:12 【问题描述】:

我正在做警报项目,

我想设置一个时间闹钟..但是我面临设置tat的问题,

我的代码是;

public void loadCalender(String month) 

    try 

        Cursor cursor = null;

        Database db = new Database(getApplicationContext());

        cursor = db.getSelectedCalenderDetails(month);
        if (cursor.getCount() != 0) 
            if (cursor.moveToFirst()) 
                do 
                    String text = cursor.getString(cursor
                            .getColumnIndex("event"));
                    String title = "News/Events";
                    String dates = cursor.getString(cursor
                            .getColumnIndex("date"));

                    String yr = dates.substring(0, 4);
                    int year = Integer.parseInt(yr);
                    String mon = dates.substring(5);
                    String mo = mon.substring(0, 2);
                    int months = Integer.parseInt(mo);
                    String da = dates.substring(9);
                    int day = Integer.parseInt(da);

                    // Ask our service to set an alarm for that date,
                    // this
                    // activity talks to the client that talks to the
                    // service
                    set_alarm(year, months, day, title, text);
                    System.out.println(dates);

                 while (cursor.moveToNext());

            

        
        cursor.close();
     catch (Exception e) 
        e.printStackTrace();
    

    // looping through All Contacts




public void set_alarm(int year, int month, int day, String title,
        String text) 
    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(getApplicationContext());

    // etc
    Calendar cal = Calendar.getInstance();
    int hour = prefs.getInt("PREF_HOUR", 0);
    int min = prefs.getInt("PREF_MIN", 0);
    if(hour == 0 && min == 0)


    cal.set(Calendar.MONTH, month - 1);
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.DAY_OF_MONTH, 7);

    cal.set(Calendar.HOUR_OF_DAY, 15);
    cal.set(Calendar.MINUTE, min);
    else
    

        cal.set(Calendar.MONTH, month - 1);
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.DAY_OF_MONTH, hour);

        cal.set(Calendar.HOUR_OF_DAY, min);
        cal.set(Calendar.MINUTE, min);
    
    Intent intent = new Intent(getApplicationContext(), AlarmActivity.class);
    intent.putExtra("title", title);
    intent.putExtra("text", text);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            getApplicationContext(), 1, intent,
            PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarmManager = (AlarmManager) getApplicationContext()
            .getSystemService(getApplicationContext().ALARM_SERVICE);

    /*
     * alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
     * pendingIntent);
     */

    alarmManager.cancel(pendingIntent); // cancel any existing alarms

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),AlarmManager.INTERVAL_DAY,

            pendingIntent);

这里总是启用警报推送,当应用打开时...

我在代码中做错了什么.. 请帮我设置一次闹钟

提前致谢

【问题讨论】:

【参考方案1】:

你需要使用setAlarm()方法而不是setRepeating()

alarmManager.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),pendingIntent);

【讨论】:

我还需要处理设备的启动吗?或者即使在设备重新启动后它仍然可以工作?如果应该调用它,但设备已关闭(例如没有电池),而现在设备已打开,该怎么办? @androiddeveloper 你不必担心设备启动。 RTC 方法将警报设置为特定时间。因此,如果手机在那段时间内没有运行,则下次手机启动时将触发警报。 @Senhor 我明白了。时间变化的情况(例如“夏令时”)呢?如果我将它设置为 X 上的警报,但在 X 之前,国家将 X 更改为 X+1,在 X 到来之前。这意味着跳过了整整一个小时。它会对警报做什么? @androiddeveloper 我相信警报会同时响起。 RTC 不是基于过去的时间。如果要处理此问题,则应改用 ELAPSED_TIME。但我不确定,我从未在你提到的情况下使用过 RTC。 @androiddeveloper 是 ?【参考方案2】:

我用的怎么样

alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);

我想在以后通过 alarmMenager 推送通知 它在应用程序仍在运行时工作,而我调用 allarm menager 以在未来设置通知并关闭我的通知未显示的应用程序。 我该怎么办?

这里你得到了我的事件发送者:

Calendar cal = Calendar.getInstance();
 cal.set(Calendar.HOUR, HOUR_OF_DAY);
 cal.set(Calendar.MINUTE, MINUTE);
 //cal.add(Calendar.SECOND, SECOND_OF_DAY);
 Intent intent = new Intent(UnityPlayer.currentActivity, TimeAlarm.class);
 intent.putExtra("alarm_status", statusMessage);
 intent.putExtra("alarm_title", title);
 intent.putExtra("alarm_content", content);
 Log.i("SenderEvent ", "przygotowane dane");
 PendingIntent sender = PendingIntent.getBroadcast(UnityPlayer.currentActivity.getApplicationContext(), REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
 am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);

和接收者:

Bundle bundle = intent.getExtras();
        String statusMessage = bundle.getString("alarm_status");
        String title = bundle.getString("alarm_title");
        String content = bundle.getString("alarm_content");
        nm = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
                new Intent(), 0);
Notification notif =new Notification();//R.drawable.ic_launcher,statusMessage, System.currentTimeMillis());;
        //notif.largeIcon = bitmap;
        notif.icon =2130837504;
        notif.tickerText=statusMessage;
        notif.when= System.currentTimeMillis(); 
        /*
        new Notification(0,
                statusMessage, System.currentTimeMillis());*/
        notif.setLatestEventInfo(context, title, content, contentIntent);
        nm.notify(NOTIFY_ME_ID, notif);

以后在应用关闭时推送通知有什么问题?

【讨论】:

【参考方案3】:

不要使用alarmManager.setRepeating,而是使用alarmManager.set 来设置一次闹钟

【讨论】:

以上是关于如何在android中设置一次闹钟的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中设置闹钟?

如何检测何时在 Android 中设置了新警报

win10如何在局域网中设置一台电脑的固定ip地址

有没有办法只在 C# 中设置一次属性

有没有办法只在 C# 中设置一次属性

如何在 iOS 中设置闹钟?