在Android中大概又两种实现方式:一种是java中的Timer类,一种是Android中的Alerm机制。两者功能差不多。
Alerm具有cup运行锁,而Timer不具有cpu锁。
每种手机都具有自己的休眠策略,当长时间不是手机的情况下,cpu就会进入休眠状态。在这种情况下Timer将无法工作。而Alerm具有cpu锁,将会导致cpu无法休眠。
AlarmManager manger=(AlarManger)getSystemService(ContextALARM_SERVICE);
mangerset(int flag,long time,PendingIntent pendingIntent);
set方法参数说明:
第一个参数flag为工作类型:
AlarmManger ELAPSED_REALTIME:让定时时间从开机算起时间算起,但不会唤醒cpu。
AlarmMangerELAPSED_REALTIME_WAKEUP:同样表示让定时时间从开机算起,但会唤醒 CPU。
RTC:表示让定时任务从1970年1月1日算起,但是不唤醒cpu。
RTC_WAKEUP:表示让定时任务从1970年1月1日算起,但是唤醒cpu。
提示:SystemClockelapsedReadtime()---获取系统开机至今所经历的毫秒数;
SystemcurrentTimeMillis()-------方法获取1970年1月1日至今天的毫秒数;
第二个参数: 延时的时间,单位毫秒;
第三个参数: PendingIntent指定具体动作;
注意:Android44版本后set方法触发不准确,有可能会延时一段时间执行(这不是Bug,是电池性能优化,系统会检测目前有多少个Alarm任务存在,然后将触发相近的几个任务一起执行)
如果要精确执行,将 setExact() 方法代替set()方法。
cancel ( PendingIntent operation )
方法将会取消Intent匹配的任何闹钟。
setRepeating(int type,long triggerAtTime,long interval,PendingIntent operation);
参数说明:interval重复时间间隔;(44后触发不准时)
AlarmManger的其它功能:
设置系统时间和时区
添加权限:androidpermissionSET_TIME;
通过setTime(long millis)方法设置系统时间;
需要添加androidpermissionSET_TIME_ZONE权限。
通过setTimeZone(String tz)方法设置时区;
计算的下载速度,举例说明一下吧。
例如每隔N秒就改变当前下载速度数字的,N秒前的下载进度百分比m%,
N秒后的下载进度百分比n%,当前下载问题的总大小Size换算成多少kb
(m%-n%)Size/N就是 这段时间的下载或上传速度了。
注意:记得增加判断一些边界问题。
public class XuanfuTestActivity extends Activity {
/ Called when the activity is first created /
int num=10;
String text;
Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutmain);
button=new Button(getApplicationContext());//这里不能写this 否则没有效果
WindowManager wmManager=(WindowManager)getApplicationContext() getSystemService(ContextWINDOW_SERVICE);
WindowManagerLayoutParams params=new WindowManagerLayoutParams();
paramstype=WindowManagerLayoutParamsTYPE_PHONE ;
paramstype=2002;
paramsflags=40;
paramswidth=50;
paramsheight=50;
wmManageraddView(button, params);
handlersendEmptyMessageDelayed(1, 1000);
}
Handler handler=new Handler(){
public void handleMessage(androidosMessage msg) {
if (msgwhat==1) {
text=""+num--;
buttonsetText(text);
}
if (num<=0) {
num=0;
}else {
handlersendEmptyMessageDelayed(1, 1000);
}
};
};
}
Android获取当前时间代码
//需要引用的
import javasqlTimestamp;
import javatextSimpleDateFormat;
//详细代码
javautilDate currentdate = new javautilDate();//当前时间
//long i = (currentdategetTime()/1000-timestamp)/(60);
//Systemoutprintln(currentdategetTime());
//Systemoutprintln(i);
Timestamp now = new Timestamp(SystemcurrentTimeMillis());//获取系统当前时间
Systemoutprintln("now-->"+now);//返回结果精确到毫秒。
时间戳转日期
int timestamp = 1310457552; //将这个时间戳转为日期
return getTime(timestamp);
定义getTime, getDate, IntToLong
public static String getTime(int timestamp){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time= null;
try {
String str = sdfformat(new Timestamp(IntToLong(timestamp)));
time = strsubstring(11, 16);
String month = strsubstring(5, 7);
String day = strsubstring(8,10 );
time =getDate(month, day)+ time;
} catch (Exception e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
return time;
}
public static String getDate(String month,String day){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制
javautilDate d = new javautilDate(); ;
String str = sdfformat(d);
String nowmonth = strsubstring(5, 7);
String nowday = strsubstring(8,10 );
String result = null;
int temp = IntegerparseInt(nowday)-IntegerparseInt(day);
switch (temp) {
case 0:
result="今天";
break;
case 1:
result = "昨天";
break;
case 2:
result = "前天";
break;
default:
StringBuilder sb = new StringBuilder();
sbappend(IntegerparseInt(month)+"月");
sbappend(IntegerparseInt(day)+"日");
result = sbtoString();
break;
}
return result;
}
//java Timestamp构造函数需传入Long型
public static long IntToLong(int i){
long result = (long)i;
result=1000;
return result;
}
以上就是关于Android定时的基本实现全部的内容,包括:Android定时的基本实现、android怎么计算每秒钟的上传和下载速度、怎么在android悬浮窗口上实现倒计时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)