Ожидание намерения срабатывает немедленно

Я пытаюсь создать приложение, которое позволяет пользователю вводить два раза, используя два TimePickers, и между этими временами телефон отключается. Я использую PendingIntent и AlarmManager для запуска BroadcastReceiver в то время, которое выбирает пользователь. На данный момент он включает и выключает телефон сразу же, когда пользователь нажимает кнопку «Сохранить». Затем появляется всплывающее уведомление о «запланированном будильнике», и дважды появляется сообщение «получено широковещательное сообщение», но после этого он ничего не делает.

Вот мой основной код активности:

public class MainActivity extends AppCompatActivity {

AlarmManager alarm;
TimePicker timePickerStart;
TimePicker timePickerEnd;


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

    timePickerStart = (TimePicker)findViewById(R.id.timePickerStart);
    timePickerStart.setIs24HourView(true);
    timePickerEnd = (TimePicker)findViewById(R.id.timePickerEnd);
    timePickerEnd.setIs24HourView(true);

}


//method is called when save button is clicked
public void setAlarm(View view) {
    Calendar calendarStart;
    Calendar calendarEnd;

    calendarStart = Calendar.getInstance();
    calendarEnd = Calendar.getInstance();


    //Set calendars to the times in both TimePickers
    calendarStart.set(Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH, timePickerStart.getCurrentHour(), timePickerStart.getCurrentMinute());
    long startTimeMillis = calendarStart.getTimeInMillis();

    calendarEnd.set(Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH, timePickerEnd.getCurrentHour(), timePickerEnd.getCurrentMinute());
    long endTimeMillis = calendarEnd.getTimeInMillis();



    //create an intent and set the class that will be triggered by the intent
    Intent intent = new Intent(MainActivity.this, Receiver.class);
    PendingIntent pIntent = null;
    pIntent = PendingIntent.getBroadcast(this, 123, intent, PendingIntent.FLAG_UPDATE_CURRENT);


    //create alarm manager
    alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    //set alarms to go off at the time specified by the timePickers
    alarm.set(AlarmManager.RTC_WAKEUP, calendarStart.getTimeInMillis(), pIntent);
    alarm.set(AlarmManager.RTC_WAKEUP, calendarEnd.getTimeInMillis(), pIntent);

    //Toast for feedback
    Toast.makeText(this, "Alarm Scheduled", Toast.LENGTH_SHORT).show();

}

Вот мой BroadcastReceiver:

public class Receiver extends BroadcastReceiver {

AudioManager audioManager;
int modeNum;


@Override
public void onReceive(Context context, Intent intent) {

    //toast for feedback
    Toast.makeText(context, "Broadcast Received", Toast.LENGTH_SHORT).show();


    audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);

    modeNum = audioManager.getRingerMode();
    if (modeNum == 0) {
        audioManager.setRingerMode(2);
    } else {
        audioManager.setRingerMode(0);
    }
}

}

Это мой манифест:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".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=".Receiver"></receiver>
</application>

person Ezil    schedule 05.07.2015    source источник


Ответы (1)


У вас несколько проблем.

Во-первых, вы пытаетесь создать два будильника с одним и тем же PendingIntent. Это не будет работать. Ваш второй запрос будильника отменит первый. Вам нужны различные объекты PendingIntent, что означает либо существенно разные объекты Intent, обернутые объектами PendingIntent, либо использование двух разных значений там, где у вас есть 123.

Во-вторых, ваши set() звонки Calendar неверны. Например, в обоих случаях ваш первый параметр должен быть годом. Вы проезжаете Calendar.YEAR, то есть 1, а не 2015.

person CommonsWare    schedule 05.07.2015