当BroadcastReceiver从AlarmManager接收广播时,MediaPlayer循环

时间:2015-03-28 08:15:09

标签: java android broadcastreceiver android-mediaplayer alarmmanager

在我的应用程序中,单击开始按钮可选择从5秒到5分钟的随机时间,并将AlarmManager设置为等待,直到满足该随机时间,然后播放声音。然后,一旦播放声音,如果尚未按下停止按钮,AlarmManager将再次设置为等待新的随机时间量。我的问题是,一旦时间到了,第一次声音一次只播放15次,所以我必须清除应用程序的缓存以使其停止。

以下是按钮和AlarmManager的代码:

protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_menu_layout);

    Button startButton = (Button) findViewById(R.id.startButton);
    startButton.setText("START");
    startButton.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v) 
        {
            if (!stop)
            {
                setAlarm(MainMenu.this);
            }//end while
        }//end onClick

    });//end startButton onClickListener

    Button stopButton = (Button) findViewById(R.id.stopButton);
    stopButton.setText("STOP");
    stopButton.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v) 
        {
            stop = true;
        }//end onClick

    });//end stopButton onClickListener

}//end onCreate

public static void setAlarm(Context passedContext)
{
    Intent intentAlarm = new Intent(passedContext, AlarmReceiver.class);
    AlarmManager alarmManager = (AlarmManager) passedContext.getSystemService(Context.ALARM_SERVICE);
    Random random = new Random();
    long time = random.nextInt(300000) + 5000; //random number from 5000 ms 
                                             //to 300000 ms (5 sec to 5 min)
    Toast.makeText(passedContext, "random: " + time, Toast.LENGTH_SHORT).show();
    alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent.getBroadcast(passedContext, 1,
        intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
}//end setAlarm

以下是BroadcastReceiver的代码:

public void onReceive(Context context, Intent intent) 
{
    MediaPlayer player = MediaPlayer.create(context, R.raw.shots);
    player.start();

    if (MainMenu.stop == false)
        MainMenu.setAlarm(context);
}//end onReceive

我不知道为什么它不断回到代码中来启动声音,足以在其他实例上播放它,我真的可以使用帮助。好像AlarmManager只是保持广播等等。

更新: 经过一些测试后,我注意到,只有在应用程序打开后第一次按下启动按钮时,它才会播放多个声音实例。每次按下开始按钮后,它都会按原样播放。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

添加到您的接收器:

player.setLooping(false);

答案 1 :(得分:0)

public void onReceive(Context context, Intent intent) {
        Uri alert = RingtoneManager
                .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        mp = MediaPlayer.create(context, alert);
        mp.setVolume(10, 10);
        mp.start();
         mp.setOnCompletionListener(new OnCompletionListener() {
         @Override
         public void onCompletion(MediaPlayer mp) {
         mp.release();

         }
         });

试试这个