簡體   English   中英

如何將TimePicker時間添加到BroadCast Receiver待定意圖?

[英]How to add TimePicker time to BroadCast Receiver pending intent?

我有一個正在開發的提醒應用程序,除通知用戶的時間外,其他所有功能均與預期的一樣。 我使用時間選擇器選擇時間,但是不知道如何將用戶設置的時間添加到待處理的意圖中。 我已經研究了android docs以及其他具有類似搜索條件的網站,但無濟於事。 有任何想法嗎?

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>

每次按下“設置時間”按鈕時,電話上方都會振動,而不是在設置“時間選擇器”時間時振動。 謝謝你的幫助!

您應該注意的第一件事是,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()

請注意,如果給定的時間已過去,則警報將立即觸發。 這就是設置警報后立即觸發警報的原因。

文檔中的其他說明:

設備處於睡眠狀態時會保留已注冊的警報(如果警報在這段時間內關閉,可以選擇將其喚醒),但是如果已關閉並重新啟動,則警報將被清除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM