以编程方式设置Android闹钟

16

我正在尝试开发一个个人应用程序,可以在DeskClock应用程序中设置闹钟。我可以让它在当天的任何时间设置闹钟,但是如何设置第二天或本周晚些时候的闹钟呢?在查看Android中AlarmClock API时,我没有找到正常的方法来实现这一点。这是否可能?

顺便说一句,这是我设置闹钟的代码,可能不太好看,但我在不断学习。

 package com.netwokz.setit;

    import java.util.Calendar;
    import java.util.GregorianCalendar;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.provider.AlarmClock;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;

    public class MainActivity extends Activity implements OnClickListener {
    Button btnSetAlarm;
    EditText etHour, etMinute;
    int minute, hour, day;
    Calendar cal;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        btnSetAlarm = (Button) findViewById(R.id.btn_set_alarm);
        etHour = (EditText) findViewById(R.id.etHour);
        etMinute = (EditText) findViewById(R.id.etMinute);
        btnSetAlarm.setOnClickListener(this);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_activity, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_set_alarm:
                setAlarm();
                break;
        }
    }

    private void setAlarm() {
        cal = new GregorianCalendar();
        cal.setTimeInMillis(System.currentTimeMillis());
        day = cal.get(Calendar.DAY_OF_WEEK);
        hour = cal.get(Calendar.HOUR_OF_DAY);
        minute = cal.get(Calendar.MINUTE);

        Intent i = new Intent(AlarmClock.ACTION_SET_ALARM);
        i.putExtra(AlarmClock.EXTRA_HOUR, hour + Integer.parseInt(etHour.getText().toString()));
        i.putExtra(AlarmClock.EXTRA_MINUTES, minute + Integer.parseInt(etMinute.getText().toString()));
        i.putExtra(AlarmClock.EXTRA_SKIP_UI, true);
        startActivity(i);
    }
}
4个回答

26

MainActivity.java

public class MainActivity extends Activity {

    TimePicker myTimePicker;
    Button buttonstartSetDialog;
    TextView textAlarmPrompt;
    TimePickerDialog timePickerDialog;

    final static int RQS_1 = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textAlarmPrompt = (TextView) findViewById(R.id.alarmprompt);

        buttonstartSetDialog = (Button) findViewById(R.id.startAlaram);
        buttonstartSetDialog.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                textAlarmPrompt.setText("");
                openTimePickerDialog(false);

            }
        });

    }

    private void openTimePickerDialog(boolean is24r) {
        Calendar calendar = Calendar.getInstance();

        timePickerDialog = new TimePickerDialog(MainActivity.this,
                onTimeSetListener, calendar.get(Calendar.HOUR_OF_DAY),
                calendar.get(Calendar.MINUTE), is24r);
        timePickerDialog.setTitle("Set Alarm Time");

        timePickerDialog.show();

    }

    OnTimeSetListener onTimeSetListener = new OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

            Calendar calNow = Calendar.getInstance();
            Calendar calSet = (Calendar) calNow.clone();

            calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);
            calSet.set(Calendar.MINUTE, minute);
            calSet.set(Calendar.SECOND, 0);
            calSet.set(Calendar.MILLISECOND, 0);

            if (calSet.compareTo(calNow) <= 0) {
                // Today Set time passed, count to tomorrow
                calSet.add(Calendar.DATE, 1);
            }

            setAlarm(calSet);
        }
    };

    private void setAlarm(Calendar targetCal) {

        textAlarmPrompt.setText("\n\n***\n" + "Alarm is set "
                + targetCal.getTime() + "\n" + "***\n");

        Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                getBaseContext(), RQS_1, intent, 0);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),
                pendingIntent);

    }  
}

Reciver.java

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context k1, Intent k2) {
        // TODO Auto-generated method stub
         Toast.makeText(k1, "Alarm received!", Toast.LENGTH_LONG).show();

    }

}

main_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp" >

    <Button
        android:id="@+id/startAlaram"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Set Alaram Time" />

    <TextView
        android:id="@+id/alarmprompt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="#000000" />

</LinearLayout>

Manifest.xml

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
         <receiver android:name=".AlarmReceiver" android:process=":remote" />
    </application>

1
如果将其推送到GitHub或其他地方并提供链接,那就太好了,这样人们就不必复制粘贴所有这些代码片段以进行测试了。 - Prostakov
14
这两个答案都与AlarmManager有关(每隔X时间间隔触发一个操作),而不是AlarmClock(向用户显示闹钟)。 - capitalf
@KeTaN 我使用了相同的代码。接收器类的 toast 不会出现。 - Ruch1234
@Ruch1234 这段代码完美运行,我已经检查过了,可能是你做错了什么。 - KeTaN
@Shadow,你可以点击这个链接,也许你能找到你的情况的解决方案:http://clearosapps.blogspot.in/p/android.html - KeTaN

3
就像真正的闹钟一样,我看不到设置未来日期闹钟的方法。我认为这需要两种选择:
1.使用AlarmManager(在所需的未来日期上触发应用程序服务以在AlarmClock中创建闹钟),然后使用AlarmClock(实际处理闹钟)。别忘了监听BOOT_COMPLETED广播以重新设置AlarmManager闹钟,因为它们在重新启动后不会持续存在。
2.使用AlarmManager触发应用程序服务和UI,模拟闹钟。这将要求您考虑电话状态等问题,这些问题在AlarmClock中不必担心。
我认为您可以使您的应用程序只弹出AlarmClock对话框,允许用户设置重复闹钟和其他通过意图无法执行的选项。

0
这是一个旧的帖子,但我认为你在寻找的是:

https://developer.android.com/reference/android/provider/AlarmClock#EXTRA_DAYS

额外功能:工作日重复闹钟。 由ACTION_SET_ALARM使用。 该值是一个ArrayList。每个项目可以是: Calendar.SUNDAY,Calendar.MONDAY,Calendar.TUESDAY, Calendar.WEDNESDAY,Calendar.THURSDAY,Calendar.FRIDAY, Calendar.SATURDAY 常量值:“android.intent.extra.alarm.DAYS”
这将让您选择未来的一天,但我不确定它是否会保留闹钟。您可能需要返回并取消它。

-2

尝试使用待处理的Intent怎么样?

只需将日历值改为提前几天即可。

AlarmManager am = (AlarmManager)getSystemService(alarm);

Intent i= new Intent("MY_INTENT");
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.MINUTE, 2);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);

3
我正在尝试在闹钟应用程序中设置一个闹钟,这是同一件事吗?我原本以为AlarmManager类只是为我的应用程序设置闹钟。 - netwokz
此外,这里有一个关于它的不错的讨论串。https://dev59.com/bW855IYBdhLWcg3wPBtx - Hiny
4
这两个答案都是关于AlarmManager(每隔X时间触发一个操作)的,而不是AlarmClock(向用户显示闹钟)。 - capitalf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接