android Alarm闹钟发送广播播放音乐

通过网上的例子  自己根据相关功能修改的  如有不合理的地方  请提出来  互相学习

一共有3个类

MainActivity.java 主程序

AlarmReceiver.java 广播接收器

MusicService.java service播放音乐

MainActivity.java

package com.yqy.yqy_alarm;

import java.util.Calendar;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.text.style.ImageSpan;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;

public class MainActivity extends Activity {

	private TextView tv = null;
    private Button setTime,cancelTime;
    private Calendar c = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String alarm = getIntent().getStringExtra("alarm");
        if(alarm != null&&alarm.equals("alarm")){
            stopService(new Intent("com.yqy.yqy_alarm.MUSIC"));
        }

        tv = (TextView)findViewById(R.id.tv);
        setTime = (Button)findViewById(R.id.setAlarm);
        cancelTime = (Button)findViewById(R.id.cancelAlarm);
        //得到日历实例,主要是为了下面的获取时间
        c = Calendar.getInstance();
        setTime.setOnClickListener(new Button.OnClickListener()
        {  

            @Override
            public void onClick(View arg0) {
                c.setTimeInMillis(System.currentTimeMillis());
                int hour = c.get(Calendar.HOUR_OF_DAY);
                int minute = c.get(Calendar.MINUTE);
                new TimePickerDialog(MainActivity.this, minute, new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        //是设置日历的时间,主要是让日历的年月日和当前同步
                        c.setTimeInMillis(System.currentTimeMillis());
                        //设置小时分钟,秒和毫秒都设置为0
                        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
                        c.set(Calendar.MINUTE, minute);
                        c.set(Calendar.SECOND, 0);
                        c.set(Calendar.MILLISECOND, 0);  

                        int requestCode = 0;//闹钟的唯一标示
                        Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
                        intent.putExtra("requestCode", requestCode);
                        PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, requestCode, intent, 0);
                        //得到AlarmManager实例
                        AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
                        //根据当前时间预设一个警报
                        am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);
                        /**
                         * 第一个参数是警报类型;第二个参数是第一次执行的延迟时间,可以延迟,也可以马上执行;第三个参数是重复周期为一天
                         * 这句话的意思是设置闹铃重复周期,也就是执行警报的间隔时间
                         */
//                      am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(60*1000),
//                              (24*60*60*1000), pi);
//                        am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),
//                                1000*60*5, pi);  

                        String msg = hourOfDay+":"+minute;
                        tv.setText("当前设置的闹钟时间:"+msg);
                    }
                }, hour, minute, true).show();
                //上面的TimePickerDialog中的5个参数参考:http://blog.csdn.net/yang_hui1986527/article/details/6839342
            }  

        });  

        cancelTime.setOnClickListener(new Button.OnClickListener()
        {  

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
                PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0,
                        intent, 0);
                AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
                //取消警报
                am.cancel(pi);
                tv.setText("闹钟取消");
                //取消闹钟的同时取消音乐
                stopService(new Intent("com.yqy.yqy_alarm.MUSIC"));
            }  

        });
    }
}

AlarmReceiver

package com.yqy.yqy_alarm;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class AlarmReceiver extends BroadcastReceiver {

	Intent intent;
	int requestCode = -1;

	@Override
	public void onReceive(Context context, Intent arg1) {

		requestCode = arg1.getIntExtra("requestCode", 0);

		NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
		Notification n = new Notification(R.drawable.ic_launcher, "Hello,there!", System.currentTimeMillis());
		n.flags = Notification.FLAG_AUTO_CANCEL;
		intent = new Intent(context, MainActivity.class);
		intent.putExtra("alarm", "alarm");
		intent.setComponent(new ComponentName("com.yqy.yqy_alarm", "com.yqy.yqy_alarm.MainActivity"));
		intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);//关键的一步,设置启动模式
		PendingIntent contentIntent = PendingIntent.getActivity(context, 0,  intent, PendingIntent.FLAG_CANCEL_CURRENT);  

		n.setLatestEventInfo(
		        context,
		        "Hello,there!",
		        "Hello,there,I'm john.",
		        contentIntent);
		nm.notify(R.string.app_name, n);

        Toast.makeText(context, "闹钟时间到", Toast.LENGTH_SHORT).show();
        intent = new Intent("com.yqy.yqy_alarm.MUSIC");
        //启动Service播放音乐
        context.stopService(new Intent("com.yqy.yqy_alarm.MUSIC"));
        context.startService(intent);  

	}

}

MusicService

package com.yqy.yqy_alarm;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class MusicService extends Service {
    private MediaPlayer player;
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }  

    public void onStart(Intent intent, int startId)
    {
        super.onStart(intent, startId);
        player = MediaPlayer.create(this, R.raw.beep);
        player.setLooping(true);
        player.start();
    }
    public void onDestroy()
    {
        super.onDestroy();
        if(player != null){
            player.stop();
        }
    }  

}

时间: 2024-08-29 23:49:38

android Alarm闹钟发送广播播放音乐的相关文章

Android应用程序发送广播(sendBroadcast)的过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6744448 前面我们分析了Android应用程序注册广播接收器的过程,这个过程只完成了万里长征的第一步,接下来它还要等待 ActivityManagerService将广播分发过来.ActivityManagerService是如何得到广播并把它分发出去的呢?这就是 本文要介绍的广播发送过程了. 广播的发送过程比广播接收器的注册过程要复杂得多了

Android如何判断当前手机是否正在播放音乐,并获取到正在播放的音乐的信息

我想实现如下的场景,判断当前Android手机上是否正在播放音乐,如果是,通过某个特定的手势, 或者点击某个按键,将当前我正在听的音乐共享出去. 第一步,就是判断当前是否有音乐正在播放. 最开始我想得有点复杂,以为要深入framework或更下层去做手脚才行,找了一下资料,发现AudioManager对外暴露了接口. [java] /** Checks whether any music is active. */ isMusicActive() 通过这个接口就可以判断当前系统是否有音乐在播放了

Android开发本地及网络Mp3音乐播放器(十)最近播放界面与数据保存更新

实现功能: 实现MyLoveMusicActivity(音乐收藏界面) 实现MyRecordMusicActivity(最近播放界面) 实现MyMusicListFragment(本地音乐界面)ItemClick事件发生后,切换到PlayActivity(独立音乐播放界面)只播放 本地音乐. 实现MyLoveMusicActivity(音乐收藏界面)ItemClick事件发生后,切换到PlayActivity(独立音乐播放界面)只播放 音乐收藏. 实现MyRecordMusicActivity(

Android 通过adb shell am broadcast发送广播

Android 通过adb shell am broadcast发送广播 adb shell am broadcast 后面的参数有: [-a <ACTION>][-d <DATA_URI>][-t <MIME_TYPE>] [-c <CATEGORY> [-c <CATEGORY>] ...] [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...] [--ez <EXTRA_K

android 播放音乐-进度条

今天学渣研究了一下使用MediaPlayer播放音乐时加入进度条,进度条如今用的是android自带的seekbar,后期会跟换UI的,在之前可以播放音乐的基础上,如今加入的主要功能有两个: 1实时显示播放进度 2手动调节播放进度 如今学渣新建了一个项目来进行測试,后期会和之前博客介绍的滑动页面进行整合,预计会在service建好后整合,敬请期待.... 好了先上效果图: 关于使用进度条的基本原理非常easy,用到了几个參数: 1 歌曲的时长:单位为毫秒,MediaPlayer的getDurat

Android小功能实现-sim卡读取,发短信,播放音乐

1.读取sim卡信息 private TelephonyManager tm; tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); String sim = tm.getSimSerialNumber(); 需要TelephonyManager 加权限 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 2.发短信 S

Android Socket 发送广播包的那些坑

Socket广播包经常被用于局域网内的两台设备之间互相发现和消息传递,在Android应用开发过程中,也经常会遇到这样的需求,例如:两台Android设备之间.Android与手环等智能硬件之间.Android与Windows电脑之间等等. 本文主要介绍在Android中使用Socket开发广播包程序时需要注意的编程事项,以及解决方法. 首先给出一段Android发送广播包的示例代码: DatagramSocket socket = new DatagramSocket(8000); socke

android在广播接收器BroadcastReceiver里面再进行发送广播,造成当前广播接收器不断循环执行问题

最近在公司处理项目时,用到锁屏状态弹出activity进行提示,类似QQ消息弹屏提示的功能.当中用到了,假如该弹出activity已经位于锁屏界面外时,将不进行再次弹窗,而是发送广播进行通知数据更新,但是在广播接收器里面的某个步骤进行了再次发送通知的操作,发现该广播接收器变成了一个死循环的执行.经过仔细检查,发现没有任何一处用错action.  最终将该广播接收器里面的发送广播语句注释,死循环不在.代码如下: 注:里面的所有action都经过仔细检查,使用均正确,没任何错误,或者引用错误. pa

Android安全问题 抢先接收广播 - 内因篇之广播发送流程

导读:本文说明系统发送广播的部分流程,如何利用Intent查找到对应接收器.我们依然只关注接收器的排序问题 这篇文章主要是针对我前两篇文章 android安全问题(四) 抢先开机启动 - 结果篇 android安全问题(五) 抢先拦截短信 - 结果篇 现在给出第二步分的分析 下面就来看看发送广播的流程 Context中的sendBroadCast函数的实现是在ContextImpl中,和发送广播相关的有如下六个函数 void android.app.ContextImpl.sendBroadca