在警报应用程序上设置多个警报

时间:2013-08-31 06:11:38

标签: android alarm

在我的应用程序中,我能够使用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();   
        }

    });

}   

}

3 个答案:

答案 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);