Ⅰ android定时的基本实现
在Android中大概又两种实现方式:一种是java中的Timer类,一种是Android中的Alerm机制。两者功能差不多。
Alerm具有cup运行锁,而Timer不具有cpu锁。
每种手机都具有自己的休眠策略,当长时间不是手机的情况下,cpu就会进入休眠状态。在这种情况下Timer将无法工作。而Alerm具有cpu锁,将会导致cpu无法休眠。
AlarmManager manger=(AlarManger)getSystemService(Context.ALARM_SERVICE);
manger.set(int flag,long time,PendingIntent pendingIntent);
set方法参数说明:
第一个参数flag为工作类型:
AlarmManger .ELAPSED_REALTIME:让定时时间从开机算起时间算起,但不会唤醒cpu。
AlarmManger.ELAPSED_REALTIME_WAKEUP:同样表示让定时时间从开机算起,但会唤醒 激辩运 CPU。
RTC:表示让定时任务从1970年1月1日算起,但是不唤醒cpu。
RTC_WAKEUP:表示让定时任务从1970年1月1日算起,但是唤醒cpu。
提示:SystemClock.elapsedReadtime()---获取系统开机至今所经历的毫秒数;
System.currentTimeMillis()-------方法获取1970年1月1日至今天的毫秒数;
第二个参数: 延时的时间,单位毫秒;
第三个参数: PendingIntent指定具体动作;
注意:Android4.4版本后set方法触发不准确,有可能会延时一段时间执行(这不是Bug,是电池性能优化,系统会检测目前有多少个Alarm任务存在,然后将触发相近的几个任务一起灶团执行)
如果要精确执行,将 setExact() 方法代替set()方法。
cancel ( PendingIntent operation )
方法将会取消Intent匹配的任何闹钟。
setRepeating(int type,long triggerAtTime,long interval,PendingIntent operation);
参数说明:interval重复时间间隔;(4.4后触发不准时)
AlarmManger的其它功能:
设置系统时间和时区
添加权限:android.permission.SET_TIME;
通过setTime(long millis)方法设置系统时间;
需要添加android.permission.SET_TIME_ZONE权限。
通过setTimeZone(String tz)方法明梁设置时区;
Ⅱ Android AlarmManger+service设置通知栏定时推送,清理后失效
我自己整理的:
有问题再问我吧。
Ⅲ android中如何实现定时提醒
android中可以使用闹钟进行提醒,你只需要告知系统你想在什么时候被提醒,然后需要一个闹钟的广播接收器,当到你设置的时间时,系统会给你发送一条广播,当你接收到广播后你就可以做一些操作,比如启动你的app,或者跳转到你app中的任何一个界面。代码如下:
//发送闹钟请求
Intent intent = new Intent(mContext, AlarmReceiver.class);
intent.setAction("something");
intent.setType("something");
intent.setData(Uri.EMPTY);
intent.addCategory(“something”);
intent.setClass(context, AlarmReceiver.class);
// 以上给intent设置的四个属性是用来区分你发给系统的闹钟请求的,当你想取消掉之前发的闹钟请求,这四个属性,必须严格相等,所以你需要一些比较独特的属性,比如服务器返回给你的json中某些特定字段。
//当然intent中也可以放一些你要传递的消息。
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmCount, intent, 0);
//alarmCount是你需要记录的闹钟数量,必须保证你所发的alarmCount不能相同,最后一个参数填0就可以。
AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
//这样闹钟的请求就发送出去了。time是你要被提醒的时间,单位毫秒,注意不是时间差。第一个参数提醒的需求用我给出的就可以,感兴趣的朋友,可以去google一下,这方面的资料非常多,一共有种,看一下就知道区别了。
//取消闹钟请求
Intent intent = new Intent(mContext, AlarmReceiver.class);
intent.setAction("something");
intent.setType(something);
intent.setData(Uri.EMPTY);
intent.addCategory(something);
intent.setClass(context, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, alarmCount, intent, 0);
//alarmCount对应到你设定时的alarmCount,
AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
am.cancel(pendingIntent);
//接着,你需要一个广播接收的类:
public class AlarmReceiver extends BroadcastReceiver{
private NotificationManager manager;
@Override
public void onReceive(Context context, Intent intent) {
manager = (NotificationManager)context.getSystemService(android.content.Context.NOTIFICATION_SERVICE);
//例如这个id就是你传过来的
String id = intent.getStringExtra("id");
//MainActivity是你点击通知时想要跳转的Activity
Intent playIntent = new Intent(context, MainActivity.class);
playIntent.putExtra("id", id);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, playIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setContentTitle("title").setContentText("提醒内容").setSmallIcon(R.drawable.app_icon).setDefaults(Notification.DEFAULT_ALL).setContentIntent(pendingIntent).setAutoCancel(true).setSubText("二级text");
manager.notify(1, builder.build());
}
}
Ⅳ android 设置系统闹钟和系统日历提醒
现在有一个定时提醒的功能, 用 AlarmManager 自己来做,有多少坑做过的都知道。(应用被kill, 应用保活,息屏,关机重启,多版本兼容问题。。。)。要自己做一个完善的不是 1-2天就能搞定的。当然如果是应用内简单的定时执行,定时提醒 AlarmManager 还是很好用的。
https://www.jianshu.com/p/1f919c6eeff6
对于这种需求可以调用系统闹钟或用系统日历的提醒事件来做。
日历提醒功能可以直接用 Intent 起日历提醒界面,这样最简单,不需要权限。
调用API 直接设置需要动态申请权限
https://www.cnblogs.com/loaderman/p/10489592.html
https://developer.android.com/guide/topics/providers/calendar-provider
设置系统闹钟需要 SET_ALARM 权限
取消闹钟用 AlarmClock.ACTION_DISMISS_ALARM
Ⅳ android 中alarm是什么意思
alarm的意搭岁厅思是知隐定雀此时任务。
import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast; public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, R.string.hello_world, Toast.LENGTH_SHORT).show(); } }