2 u011080560 u011080560 于 2016.02.12 09:03 提问

我勒个缺android 闹钟设置异常!!!!!alarmManger所发送的广播启动一个activity 200C

虚拟机上没问题,一到手机上就各种问题,我的android5.1手机上不是准点报时,要晚4分钟,我的Android5.0系统里无视定点直接报时。我真没辙了。

5个回答

devmiao
devmiao   Ds   Rxr 2016.02.12 09:30

Android闹钟 AlarmManager的使用

AlarmManager介绍
  AlarmManager这个类提供对系统闹钟服务的访问接口。

  你可以为你的应用设定一个在未来某个时间唤醒的功能。

  当闹钟响起,实际上是系统发出了为这个闹钟注册的广播,会自动开启目标应用。

  注册的闹钟在设备睡眠的时候仍然会保留,可以选择性地设置是否唤醒设备,但是当设备关机和重启后,闹钟将会被清除。

  在alarm的receiver的onReceive()方法被执行的时候,Alarm Manager持有一个CPU唤醒锁,这样就保证了设备在处理完广播之前不会sleep。

  一旦onReceive()方法返回,Alarm Manager就会释放这个锁,表明一些情况下可能onReceive()方法一执行完设备就会sleep。

  如果你的alarm receiver中调用了Context.startService(),那么很可能service还没起来设备就sleep了。

  为了阻止这种情况,你的BroadcastReceiver和Service需要实现不同的唤醒锁机制,来确保设备持续运行到service可用为止。

  注意:Alarm Manager主要是用来在特定时刻运行你的代码,即便是你的应用在那个特定时刻没有跑的情况。

  对于常规的计时操作(ticks, timeouts, etc),使用Handler处理更加方便和有效率。

  另:从API 19开始,alarm的机制都是非准确传递,操作系统将会转换闹钟,来最小化唤醒和电池使用。

  有一些新的API会支持严格准确的传递,见 setWindow(int, long, long, PendingIntent)和setExact(int, long, PendingIntent)。

  targetSdkVersion在API 19之前应用仍将继续使用以前的行为,所有的闹钟在要求准确传递的情况下都会准确传递。

闹钟Demo
  Android Api demos中就有关于闹钟使用的Demo:

  com.example.android.apis.app.AlarmController

  其中设定了两种闹钟,一种是一次性的,一种是重复的。

Manifest中的声明,process属性

  自定义的receiver,在manifest中声明如下:

    <receiver
        android:name=".OneShotAlarm"
        android:process=":remote" />
    <receiver
        android:name=".RepeatingAlarm"
        android:process=":remote" />

  Demo中两个Receiver的onReceive方法中显示了各自的Toast提示,所以不再列出。

  在此讨论一下process属性,它规定了组件(activity, service, receiver等)所在的进程。

  通常情况下,没有指定这个属性,一个应用所有的组件都运行在应用的默认进程中,进程的名字和应用的包名一致。

  比如manifest的package="com.example.helloalarm",则默认进程名就是com.example.helloalarm。

  元素的process属性可以为全部的组件设置一个不同的默认进程。

  组件可以override这个默认的进程设置,这样你的应用就可以是多进程的。

  如果你的process属性以一个冒号开头,进程名会在原来的进程名之后附加冒号之后的字符串作为新的进程名。当组件需要时,会自动创建这个进程。这个进程是应用私有的进程。

  如果process属性以小写字母开头,将会直接以属性中的这个名字作为进程名,这是一个全局进程,这样的进程可以被多个不同应用中的组件共享。

一次性闹钟

复制代码
// When the alarm goes off, we want to broadcast an Intent to our
// BroadcastReceiver. Here we make an Intent with an explicit class
// name to have our own receiver (which has been published in
// AndroidManifest.xml) instantiated and called, and then create an
// IntentSender to have the intent executed as a broadcast.
Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);
PendingIntent sender = PendingIntent.getBroadcast(
AlarmController.this, 0, intent, 0);

        // We want the alarm to go off 10 seconds from now.
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.SECOND, 10);

        // Schedule the alarm!
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);

复制代码

重复闹钟

  闹钟设置:

复制代码
// When the alarm goes off, we want to broadcast an Intent to our
// BroadcastReceiver. Here we make an Intent with an explicit class
// name to have our own receiver (which has been published in
// AndroidManifest.xml) instantiated and called, and then create an
// IntentSender to have the intent executed as a broadcast.
// Note that unlike above, this IntentSender is configured to
// allow itself to be sent multiple times.
Intent intent = new Intent(AlarmController.this,
RepeatingAlarm.class);
PendingIntent sender = PendingIntent.getBroadcast(
AlarmController.this, 0, intent, 0);

        // We want the alarm to go off 10 seconds from now.
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.SECOND, 10);
        // Schedule the alarm!
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        am.setRepeating(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(), 10 * 1000, sender);

复制代码

  闹钟取消:

复制代码
// Create the same intent, and thus a matching IntentSender, for
// the one that was scheduled.
Intent intent = new Intent(AlarmController.this,
RepeatingAlarm.class);
PendingIntent sender = PendingIntent.getBroadcast(
AlarmController.this, 0, intent, 0);

        // And cancel the alarm.
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        am.cancel(sender);

复制代码

AlarmManager说明
  AlarmManager这个类提供对系统闹钟服务的访问接口。

  对它的获取是通过系统服务:

  Context.getSystemService(Context.ALARM_SERVICE)。

  相关方法说明:

  cancel(PendingIntent operation)方法将会取消Intent匹配的任何闹钟。

  关于Intent的匹配,查看filterEquals(Intent other)方法的说明可知,两个Intent从intent resolution(filtering)(Intent决议或过滤)的角度来看是一致的,即认为两个Intent相等。即是说,Intent的action,data,type,class,categories是相同的,其他的数据都不在比较范围之内。

  set(int type, long triggerAtMillis, PendingIntent operation)方法将会设置一个闹钟。

  注意:对于计时操作,可能使用Handler更加有效率和简单。

  设置闹钟的时候注意:

  1.如果声明的triggerAtMillis是一个过去的时间,闹钟将会立即被触发。

  2.如果已经有一个相同intent的闹钟被设置过了,那么前一个闹钟将会取消,被新设置的闹钟所代替。

  注意这里说的intent相同指的都是Intent在 filterEquals(Intent)的定义下匹配。

  闹钟是一个广播,接收器需要自己定义和注册,注册使用动态注册( registerReceiver(BroadcastReceiver, IntentFilter) )或者静态注册( tag in an AndroidManifest.xml file)都可以。

  setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)方法将会设置一个重复性的闹钟。

  比set方法多了一个间隔参数。

  type的类型是四种:

  ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC, RTC_WAKEUP.

  区分的是时间标准和是否在睡眠状态下唤醒设备。

  具体查看官方文档吧不再详细解释啦。

实例

  比如要设置一个每晚21:30唤醒的重复闹钟:

复制代码
private static final int INTERVAL = 1000 * 60 * 60 * 24;// 24h

//...

    Intent intent = new Intent(context, RequestAlarmReceiver.class);
    PendingIntent sender = PendingIntent.getBroadcast(context,
            REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    // Schedule the alarm!
    AlarmManager am = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 21);
    calendar.set(Calendar.MINUTE, 30);
    calendar.set(Calendar.SECOND, 10);
    calendar.set(Calendar.MILLISECOND, 0);

    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            INTERVAL, sender);

复制代码

参考资料
  AlarmManager:

  http://developer.android.com/reference/android/app/AlarmManager.html

  闹钟Demo解析:

  http://blog.csdn.net/mapdigit/article/details/7644134

u011080560
u011080560 额呃呃呃,为什么模拟器没问题,手机有问题
2 年多之前 回复
u011080560
u011080560   2016.02.12 09:46
            TimePicker timePicker = (TimePicker) view1.findViewById(R.id.timePicker);

            timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
                @Override
                public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
                    InsertActivity.this.hour = hourOfDay;
                    InsertActivity.this.minute = minute;
                }
            });

            calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
                @Override
                public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
                    InsertActivity.this.years = year;
                    InsertActivity.this.months = month;
                    Toast.makeText(InsertActivity.this, month + "  ", Toast.LENGTH_SHORT).show();
                    InsertActivity.this.days = dayOfMonth;
                }
            });

            //TimePicker
            AlertDialog1.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    Log.i("Tag", "          year   " + InsertActivity.this.years);
                    Log.i("Tag", "          mouths  " + InsertActivity.this.months);
                    Log.i("Tag", "          day    " + InsertActivity.this.days);


                    if (InsertActivity.this.days != 0) {
                        calendar_dialog.set(Calendar.YEAR, InsertActivity.this.years);
                        calendar_dialog.set(Calendar.MONTH, InsertActivity.this.months);
                        calendar_dialog.set(Calendar.DAY_OF_MONTH, InsertActivity.this.days);
                    }

                    calendar_dialog.set(Calendar.HOUR_OF_DAY, InsertActivity.this.hour);
                    calendar_dialog.set(Calendar.MINUTE, InsertActivity.this.minute);
                    calendar_dialog.set(Calendar.SECOND, 00);

                    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar_dialog.getTimeInMillis(), 10000, alert());

                    Toast.makeText(InsertActivity.this,"成功",Toast.LENGTH_SHORT).show();
                }
            });
u011080560
u011080560   2016.02.12 09:47

上边是我的代码,同样的代码,我的手机竟然不好使

u011080560
u011080560   2016.02.12 11:28

别粘贴,谁跟我交流一下啊

u011080560
u011080560   2016.02.12 09:11

在没回答我就抑郁啦啦啦

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Android开发之AlarmManager的使用(开启Activity、开启服务、开启广播)
Android开发之AlarmManager的使用(开启Activity、开启服务、开启广播) 近来做项目,需要在固定的时间间隔内开启一次广播,本人立马想到了Alarmmanager,在此就科普下,描述下本人的实现过程吧! 1. AlarmManager,是Android中常用的一种系统级别的提示服务   使用AlarmManager可为我们在特定的时刻为我们广播一个指定
使用AlarmManager启动广播、服务、页面(Android定时器)
AlarmManager是Android中的一种系统级别的提醒服务,它会为我们在特定的时刻广播一个指定的Intent。而使用Intent的时候,我们还需要它执行一个动作,如startActivity,startService,startBroadcast,才能使Intent有用。通常我们使用PendingIntent,它可以理解为对Intent的封装,包含了指定的动作。 AlarmManag
Android AlarmManager设置多个定时事件时只最后一个有效问题解决
最近用到了AlarmManager,遇到了问题,当我设置多个定时器时,发现只有一个起作用,百思不得其解,后来在网上找到了原因,把人家的解决办法贴上: AlarmManager的常用方法有三个: (1)set(int type,long startTime,PendingIntent pi);         该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第
AlarmManager 定时广播,定时服务
AlarmManager的作用文档中的解释是:在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent。  对应AlarmManager更深层的了解可以参考:  http://www.programbbs.com/doc/5888.htm  http://jinguo.iteye.com/
Android定时广播和定时服务两种实现方式
自己写了个Demo来实现定时发送广播和定时执行服务 地址https://github.com/wds1181977/TimerBroadcastReceiver-Service.git package com.example.h2; import android.app.Activity; import android.app.AlarmManager; import android
AlarmManager闹钟定时操作
AlarmManager的常用方法有三个:(1)set(int type,long startTime,PendingIntent pi);该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。(2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);该...
锁屏状态下点亮屏幕,并弹出闹钟提示信息,可以在锁屏界面上取消闹钟;使用广播接收闹钟定时:
锁屏状态下点亮屏幕,并弹出闹钟提示信息,可以在锁屏界面上取消闹钟;使用广播接收闹钟定时:下面是例子里的核心代码如下android 设置定时闹钟(包括提醒一次和循环提醒):Intent intent = new Intent(MainActivity.this,MyAlarmBroadCast.class); /** * context 指定实例 * requestcode 可以作为闹钟的唯一性标识
AlarmManager定时发送广播,定时保活,兼容个版本
由于android个手机版本的迭代和厂商对内核的修改导致AlarmManager的使用不想以前那么准确了。在api19以前可以使用setRepeating设置重复发送广播,只用就需要自己在发送闹钟后,在接收处再次发送相同的闹钟,实现重复执行的效果;下面对AlarmManager的使用做了一些兼容性的处理,可以定时发送广播: /** * 每5分钟唤醒一次service *
Android中AlarmManager详解以及利用PendingIntent设置闹钟
AlarmManager是提供一种访问系统闹钟服务的方式,允许你去设置在将来的某个时间点去执行你的应用程序。当你的闹钟响起(时间到)时,在它上面注册的一个意图(Intent)将会被系统以广播发出,然后自动启动目标程序,如果它没有正在运行。注册的闹钟会被保留即使设备处于休眠中(如果闹钟在给定时间响起可以选择是否唤醒设备)。如果闹钟关闭或者重启,闹钟将被清除。        比如说我想在在每天的八点
android Alarm闹钟发送广播播放音乐
通过网上的例子  自己根据相关功能修改的  如有不合理的地方  请提出来  互相学习 一共有3个类 MainActivity.java 主程序 AlarmReceiver.java 广播接收器 MusicService.java service播放音乐 MainActivity.java package com.yqy.yqy_alarm; impor