如何将TimePicker时间添加到BroadCast Receiver待定意图?

时间:2014-01-02 23:12:34

标签: java android android-intent

我有一个我正在开发的提醒应用程序,除了通知用户的时间外,一切都像它应该的那样工作。我使用时间选择器来选择时间,但不知道如何将用户设置的时间添加到待处理的意图中。我已经研究过android文档以及其他类似搜索的网站,但无济于事。有什么想法吗?

MainActivity.java

public class MainActivity extends Activity{

    int mHour;
    int mMinute;

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void setAlarm(View view) {
        TimePicker picker = (TimePicker)findViewById(R.id.timePicker1);
        EditText text = (EditText)findViewById(R.id.editText1);
        Toast toast = Toast (text, picker);
        toast.show(); 

        Intent intent = new Intent(this, AlarmBoadcastReceiver.class);
        PendingIntent pendingintent = PendingIntent.getBroadcast(this.getApplicationContext(), 1234, intent, 0);

        Calendar AlarmCal = Calendar.getInstance(); 
        AlarmCal.setTimeInMillis(System.currentTimeMillis());
        AlarmCal.set(Calendar.HOUR_OF_DAY, mHour);
        AlarmCal.set(Calendar.MINUTE, mMinute);

        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, /*No Idea what to put here*/, pendingintent);

        OnTimeSetListener mTimeSetListener = new OnTimeSetListener() {

            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                // TODO Auto-generated method stub
                mHour = hourOfDay;
                mMinute = minute;

            }
        };
    }

    private Toast Toast(EditText text, TimePicker picker) {
        return Toast.makeText(this, "Reminder set for " + picker.getCurrentHour().toString() + ":" 
        + picker.getCurrentMinute() + " with message " + "'" + text.getText().toString() + "'", 
        Toast.LENGTH_LONG);
    }

    public void exitApp(View view) {
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }
}

AlarmBoadcastReceiver.java

public class AlarmBoadcastReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {

    Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
    vibrator.vibrate(2000);
  }
} 

清单

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

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="19" />

    <uses-permission android:name="android.permission.VIBRATE" >
    </uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.reminder.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="AlarmBoadcastReceiver" >

        </receiver>

    </application>

</manifest>

每次按下设置时间按钮时,手机上方张贴的内容都会振动,而不是在设置时间选择器时间时振动。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

首先要注意的是,AlarmManager有两种模式可以在设定的时间触发警报。

  • set()将在给定时间触发警报。您将注意到,从API 19开始,使用set()方法定义的警报可能会被批处理,因此可能不会在确切时间触发:
  

注意:从API 19开始,传递给此方法的触发时间是   被视为不精确:在此时间之前不会发出警报,   但可能会推迟并在一段时间后交付。

http://developer.android.com/reference/android/app/AlarmManager.html#set(int,long,android.app.PendingIntent)

  • 自API 19起添加了setExact()方法,并保证在确切的给定时间触发警报。

传入的时间是根据set()或setExact()方法的第一个参数定义的。您选择了RTC_WAKEUP,您需要以毫秒UTC时间定义唤醒时间(由System.currentTimeMillis()方法给出)。

请参阅:http://developer.android.com/reference/android/app/AlarmManager.html#RTC_WAKEUP

获得这段时间的最简单方法是致电:

AlarmCal.getTimeInMillis()

只是一个小小的音符,如果给定的时间是过去,那么闹钟会立即触发。这就是您在设置闹钟时触发警报的原因。

文档中的其他说明:

  

设备处于睡眠状态时保留已注册的警报(并且可以   如果它们在那段时间内关闭,可以选择将设备唤醒),但是   如果关闭并重新启动,将被清除。