2016-12-01 31 views
0

我正在使用alarmManager,並且自API 19以來,除了使用setExact()方法設置的警報之外,所有警報都不準確。所以,如果我想設置多個確切的警報,我已經多次使用setExact()方法。我決定設置一個,然後在廣播接收機中設置另一個。問題是每個BroadcastReceiver都被觸發並且新的警報被設置BroadcastReceiver自身重啓。BroadcastReceiver被調用後自動重啓

我的代碼:

Calendar calendar = Calendar.getInstance(); 

     Date previoudTime = calendar.getTime(); 
     calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek-1); 

     calendar.set(Calendar.HOUR, hour); 
     calendar.set(Calendar.MINUTE, minute); 
     calendar.set(Calendar.SECOND, 0); 
     DateFormat dateFormat = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy"); 
     String sDate = dateFormat.format(calendar.getTime()); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     Intent intent1 = new Intent(MyService_alarm.this, MyReceiver_Alarm.class); 
     Log.e("Point_1", "Compare1 " + calendar.getTime()); 
     Log.e("Point_1", "Compare2 " + previoudTime); 
     Log.e("Point_1", "Compare " + calendar.getTime().compareTo(previoudTime)); 
     if(calendar.getTime().compareTo(previoudTime) < 0) { 

      int a = calendar.get(Calendar.WEEK_OF_MONTH); 
      calendar.set(Calendar.WEEK_OF_MONTH,a + 1); 
      //Log.e("Point_1", "Less " + calendar.getTime()); 
     } 
     Long alarmTime = calendar.getTimeInMillis(); 
     intent1.putExtra("Size_ABC", y); 
     intent1.putExtra("Date",sDate); 
     intent1.putExtra("Position",position); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(MyService_alarm.this, position, intent1, 0); 
     //Also change the time to 24 hours. 
     alarmManager.setExact(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent); 

廣播接收器代碼:

public class MyReceiver_Alarm extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     final MediaPlayer mediaPlayer = MediaPlayer.create(context, RingtoneManager.getActualDefaultRingtoneUri(context,RingtoneManager.TYPE_ALARM)); 
     SQLiteDataBase sqLiteDataBase = new SQLiteDataBase(context); 
     final AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
     audio.setStreamVolume(AudioManager.STREAM_MUSIC,sqLiteDataBase.getVolume(intent.getIntExtra("Size_ABC",1)),0); 
     final int currentVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC); 
     //Log.e("Point_1", "Current Volume " + currentVolume); 
     //mediaPlayer.setVolume(0.50f,1.0f); 
     mediaPlayer.start(); 
     new Timer().schedule(new TimerTask() { 
      @Override 
      public void run() { 
       mediaPlayer.stop(); 
       //Log.e("Point_1", "Volume_after " + audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC)); 
      } 
     }, 5000); 
     Log.e("Point_1", "Alarm!!! " + sqLiteDataBase.getVolume(intent.getIntExtra("Size_ABC",1))); 
     ParsePosition parsePosition = new ParsePosition(0); 
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy"); 
     Calendar calendar1 = Calendar.getInstance(); 
     Log.e("Point_1","Intent_Extra " + intent.getStringExtra("Date")); 
     calendar1.setTime(simpleDateFormat.parse(intent.getStringExtra("Date"), parsePosition)); 
     int i = calendar1.get(Calendar.MINUTE); 
     calendar1.set(Calendar.MINUTE, i + 3); 
     long alarmTime = calendar1.getTimeInMillis(); 
     DateFormat dateFormat = new SimpleDateFormat("EEE MMM dd hh:mm:ss z yyyy"); 
     String sDate = dateFormat.format(calendar1.getTime()); 
     Intent intent1 = new Intent(context,MyReceiver_Alarm.class); 
     intent1.putExtra("Date", sDate); 
     intent1.putExtra("Position",intent.getIntExtra("Position",1)); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context,intent.getIntExtra("Position",1),intent1,0); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setExact(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent); 
     Log.e("Point_1","SDateP " + calendar1.getTime()); 
    } 
} 

logcat的(即只有一個重複的部分):

Intent_Extra Thu Dec 01 03:15:00 GMT+05:00 2016 
12-01 15:15:01.202 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ SDateP Thu Dec 01 03:18:00 GMT+05:00 2016 
12-01 15:15:01.252 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ id 21 
12-01 15:15:01.262 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ Volume 0 
12-01 15:15:01.272 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ id 21 
12-01 15:15:01.282 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ Volume 0 
12-01 15:15:01.282 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ Alarm!!! 0 
12-01 15:15:01.282 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ Intent_Extra Thu Dec 01 03:15:00 GMT+05:00 2016 
12-01 15:15:01.282 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ SDateP Thu Dec 01 03:18:00 GMT+05:00 2016 
12-01 15:15:01.482 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ id 21 
12-01 15:15:01.482 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ Volume 0 
12-01 15:15:01.512 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ id 21 
12-01 15:15:01.512 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ Volume 0 
12-01 15:15:01.512 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ Alarm!!! 0 
12-01 15:15:01.512 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ Intent_Extra Thu Dec 01 03:15:00 GMT+05:00 2016 
12-01 15:15:01.512 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ SDateP Thu Dec 01 03:18:00 GMT+05:00 2016 
12-01 15:15:01.572 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ id 21 
12-01 15:15:01.582 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ Volume 0 
12-01 15:15:01.602 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ id 21 
12-01 15:15:01.602 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ Volume 0 
12-01 15:15:01.602 20321-20321/com.SetAndGet.amadey.myapplication5 E/Point_1﹕ Alarm!!! 0 

這裏有什麼問題?如何防止這種重複?

謝謝。

回答

0

我不認爲你的廣播接收器重新啓動本身...

我們可以從兩個方面 1.靜態艙單文件 2.動態的registerReceiver(接收器)註冊我們的接收機;

你可能會使用這兩種事情,只有這樣纔會發生。 我是初學者。我很想幫助你。對不起,如果我錯了。 希望它有幫助。

相關問題