2013-08-31 110 views
0

在我的应用程序中,我可以在指定的时间使用时间按钮播放闹钟铃声。但是当我再次按设置的闹钟按钮时,它会替换以前的闹钟..任何人都可以帮助存储多个闹钟...并且还请告诉闹钟响铃的时间存储在应用程序中?在我的闹钟应用程序中设置多个闹钟

Alarmreceiver.java

package com.example.alaram; 

import java.io.IOException; 

import android.app.Activity; 
import android.content.Context; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 
import android.util.Log; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.Button; 




      public class AlarmReceiver extends Activity{ 
     private MediaPlayer mPlayer; 
     private WakeLock mWakeLock; 
      Button stopalarm; 

     @SuppressWarnings("deprecation") 
     public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE); 
    mWakeLock =pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "my wakelock"); 
    mWakeLock.acquire(); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | 
      WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
      WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN | 
      WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
      WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

    setContentView(R.layout.alarmreceiver); 

    //Stop the alarm music 
    stopalarm=(Button) findViewById(R.id.btnStopoAlarm); 
    stopalarm.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      mPlayer.stop(); 
       finish(); 
       return; 
     } 
    }); 
    PlaySound(this,getAlarmUri()); 
} 


private void PlaySound(Context context,Uri alert){ 
    mPlayer=new MediaPlayer(); 
    try{ 
     mPlayer.setDataSource(context,alert); 
     final AudioManager am=(AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     if(am.getStreamVolume(AudioManager.STREAM_ALARM)!=0); 
     { 
      mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); 
      mPlayer.prepare(); 
      mPlayer.start(); 
     } 

    }catch(IOException e) 
    { 
    Log.i("AlaramReciever", "no audio file"); 
    } 
} 

//Get an alarm sound. If none set, try notification, Otherwise, ringtone. 
private Uri getAlarmUri() 
{ 
    Uri alert= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    if(alert==null) 
    { 
     alert= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     if(alert==null) 
     { 
      alert=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); 
     } 
    } 
    return alert; 
} 

protected void onStop(){ 
    super.onStop(); 
    mWakeLock.release(); 

} 

}

SetAlarm.java

package com.example.alaram; 

import java.util.Calendar; 
import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TimePicker; 
import android.widget.Toast; 

public class SetAlarm extends Activity { 

TimePicker timePicker; 
Button ok; 
int hrs,min; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.setalarm); 

//Operation of Ok button or Setting Alaram Time 
ok=(Button) findViewById(R.id.btnOk); 
ok.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

     Intent intent=new Intent(SetAlarm.this,AlarmReceiver.class); 
     PendingIntent pi=PendingIntent.getActivity(SetAlarm.this, 2, intent,PendingIntent.FLAG_CANCEL_CURRENT); 
     AlarmManager alm=(AlarmManager) getSystemService(Context.ALARM_SERVICE); 

     timePicker=(TimePicker) findViewById(R.id.timePicker1); 
     hrs=timePicker.getCurrentHour(); 
     min=timePicker.getCurrentMinute(); 
     Calendar calendar=Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY,hrs); 
     calendar.set(Calendar.MINUTE, min); 
     calendar.set(Calendar.SECOND, 0); 

     alm.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), pi); 
     Toast.makeText(getBaseContext(), "Alaram is Set",Toast.LENGTH_SHORT).show(); 

     finish(); 
     } 

    }); 

} 

}

回答

3

这是因为你总是使用相同的意向。如果您想要安排多个警报,则需要修改您的意图。例如,您可以定义一个整数id并将每个新警报的值增加1。然后您可以使用下面的代码将此id分配给intent

public class AlarmReceiver extends Activity { 

    private int id = 0; 

    @Override 
    public void onClick(View v) { 

     Intent intent=new Intent(SetAlarm.this,AlarmReceiver.class); 
     intent.setData(Uri.parse("alarm:" + (id++))); 

     ... rest of your code here 
    } 

} 

如果你想cancel()报警,你需要使用intent用的正是这种id

+0

我是新是java。你能告诉如何增加每个闹钟的ID吗? – user2711295

+0

将'private int id = 0;'字段添加到您的类并添加'intent.setData()',如答案中所示。 –

+0

它仍然取代了报警:/ – user2711295

1

你是设置两个报警器according to documentation相同的PendingIntent将会被替换:

如果已经有由filterEquals被定义为这个意向计划(有两个意图的 平等报警(意向) ),然后 它将被删除并由此替换。

According to the documentation两个目的是等于上filterEquals(Intent)这意味着基:

确定是否两个目的是意图 分辨率(滤波)的目的是相同的。也就是说,如果他们的行为,数据,类型,类别, 和类别是相同的。这不会比较意图中包含的任何额外数据 。

所以基本上如果你想安排两个警报,只要确保你的意图是不同的。

0

可以使用setRepeating这样

alm.setRepeating(type, triggerAtMillis, intervalMillis, operation); 
+0

我想你误会了我..我不想在某段时间内重复闹钟。我只是想存储已经设置的所有报警而不被替换 – user2711295