在我的应用程序中,我能够使用timepicker在指定的时间播放闹钟音。但是当我再次按下设置的闹钟按钮时它会取代之前的闹钟..任何人都可以帮助存储多个闹钟......还请告诉我振铃警报的时间是否存储在申请表中?
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();
}
});
}
}
答案 0 :(得分:3)
这是因为你总是使用相同的Intent。如果要安排多个警报,则需要修改意图。例如,您可以定义一个整数id
,并将每个新警报的值增加一个。然后,您可以使用以下代码将此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
。{/ p>
答案 1 :(得分:1)
对于两个警报according to documentation,您的设置与PendingIntent相同,将被替换:
如果已安排此Intent的警报(使用 那么两个意图的相等性由filterEquals(Intent))定义 它将被移除并由此替换。
According to the documentation两个意图等于基于filterEquals(Intent)
,这意味着:
为了意图的目的,确定两个意图是否相同 分辨率(过滤)。也就是说,如果他们的行动,数据,类型,类, 和类别是一样的。这不会比较任何额外的数据 包含在意图中。
所以基本上如果你想安排两个警报,只要确保你的意图是不同的。
答案 2 :(得分:0)
您可以像这样使用setRepeating
alm.setRepeating(type, triggerAtMillis, intervalMillis, operation);