简体   繁体   English

以编程方式设置android闹钟

[英]Set android alarm clock programmatically

I'm trying to build a personal app that will set alarms in the DeskClock app. 我正在尝试构建一个将在DeskClock应用程序中设置警报的个人应用程序。 I can get it to set alarms for anytime in the current day, But how would I go about setting an alarm for the next day, or later in the week. 我可以让它在当天的任何时间设置闹钟,但是我如何设置第二天或本周晚些时候的闹钟。 Looking through the AlarmClock api in android I don't see a normal way to do this. 通过android中的AlarmClock api查看我没有看到正常的方法来做到这一点。 Is this even possible? 这甚至可能吗?

Btw this is my code for setting the alarm it might not be pretty, but I am learning as I go. 顺便说一下,这是我设置警报的代码,它可能不太漂亮,但我正在学习。

 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);
    }
}

MainActivity.java 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 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 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 的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>

Like a real alarm clock, I don't see a way to set an alarm for a future date. 就像一个真正的闹钟,我没有看到为未来日期设置闹钟的方法。 I think this requires one of two options: 我认为这需要以下两个选项之一:

  1. A combination of AlarmManager (to trigger an app service on the desired future date to create the alarm in AlarmClock) and then AlarmClock (to actually handle the alarm). AlarmManager的组合(在所需的未来日期触发应用服务以在AlarmClock中创建警报),然后是AlarmClock(实际处理警报)。 Don't forget to listen for BOOT_COMPLETED broadcast to reset the AlarmManager alarms since they don't persist after a reboot. 不要忘记监听BOOT_COMPLETED广播以重置AlarmManager警报,因为它们在重新启动后不会保留。

  2. Use AlarmManager to trigger an app service and UI that simulates an alarm. 使用AlarmManager触发模拟警报的应用服务和UI。 This will require you to consider phone state and etc things you don't have to worry about with AlarmClock. 这将要求您考虑使用AlarmClock时无需担心的电话状态和其他事项。

I think you can make your app just bring up the AlarmClock dialog which allows the user to set recurring alarms and other options you cannot perform through the intent. 我认为您可以让您的应用程序调出AlarmClock对话框,该对话框允许用户设置定期警报以及您无法通过意图执行的其他选项。

How about trying a pending Intent? 尝试待处理的意图怎么样?

Just change the Calendar value to a few days or so in advance? 只需提前将日历值更改为几天左右?

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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM