android4.4中自动更新时间机制

名词解释:

NITZ:NITZ(Network Identity and Time Zone)或网络标识和时区,是一种用于自动配置本地的时间和日期的机制,同时也通过无线网向移动设备提供运营商信息。NITZ是自从PHASE 2+ RELEASE 96 的GSM中的可选功能,经常被用来自动更新移动电话的系统时钟。

NTP:NTP(Network Time Protocol)提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间UTC。 NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。这样就有了准确而可靠的时间源。时间按NTP服务器的等级传播。

1.在setting中勾选“自动确定时间和日期”,“自动确定时区”后只是对key值为AUTO_TIME和AUTO_TIME_ZONE的Preference进行了赋值.

源码路径:packages/apps/Settings/src/com/android/settings/DateTimeSettings.java

2.在/frameworks/base/services/java/com/android/server/NetworkTimeUpdateService中对上述的key值进行了监听,在检测到key值改变的时候,就会发送消息mHandler.obtainMessage(mMsg).sendToTarget();

void observe(Context context) {
            ContentResolver resolver = context.getContentResolver();
            resolver.registerContentObserver(Settings.Global.getUriFor(Settings.Global.AUTO_TIME),
                    false, this);
        }

        @Override
        public void onChange(boolean selfChange) {
            mHandler.obtainMessage(mMsg).sendToTarget();
        }

handler接到消息后进行消息处理调用onPollNetworkTime(msg.what),发现无论是数据或者是wifi下都是调用该方法进行更新

       public void handleMessage(Message msg) {
            switch (msg.what) {
                case EVENT_AUTO_TIME_CHANGED:
                case EVENT_POLL_NETWORK_TIME:
                case EVENT_NETWORK_CONNECTED:
                    onPollNetworkTime(msg.what);
                    break;
            }
        }

3.在onPollNetworkTime方法中先判断是否勾选“自动更新时间”,如果没勾选直接退出,如果勾选了再看,如果更新的NITZ时间不为NOT_SET(-1),且更新间隔小于mPollingIntervalMs,mPollingIntervalMs=24小时,那么就直接更新NITZ的时间,否则用NTP同步时间。

// If NITZ time was received less than mPollingIntervalMs time ago,
// no need to sync to NTP.
if (mNitzTimeSetTime != NOT_SET && refTime - mNitzTimeSetTime < mPollingIntervalMs) {
       resetAlarm(mPollingIntervalMs);
 return;
        }
 final long ntp = mTime.currentTimeMillis();
 mTryAgainCounter = 0;
 // If the clock is more than N seconds off or this is the first time it's been
 // fetched since boot, set the current time.
 if (Math.abs(ntp - currentTime) > mTimeErrorThresholdMs
            || mLastNtpFetchTime == NOT_SET) {
          // Set the system time
          ......
           if (ntp / 1000 < Integer.MAX_VALUE) {
                        SystemClock.setCurrentTimeMillis(ntp);
         }

当从时间服务器上获取的NTP时间和当前时间之差的绝对值大于一个阀值,系统认为当前时间错误,需要更新时间。

总结:

如果时间自动同步选项未勾选,直接返回;

如果NITZ已同步且上次NITZ同步未超过24小时,则设置定时器24小时后再触发同步,即广播NetworkTimeUpdateService.ACTION_POLL;

如果NTP上次成功同步超过24小时或用户勾选自动同步选项,则进行下面的NTP同步,否则同上设置定时器24小时后再触发同步;

如果上次NTP成功同步超过24小时,则发起同步mTime.forceRefresh();

如果同步成功,获取此刻NTP时间ntp=mTime.currentTimeMillis();

如果同步时间与当前本机时间误差超过指定值阀值,则把ntp设置为本机时间SystemClock.setCurrentTimeMillis(ntp)

时间: 2024-08-28 02:14:05

android4.4中自动更新时间机制的相关文章

mysql中自动更新时间CURRENT_TIMESTAMP

timestamp的两个属性:CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP http://blog.163.com/[email protected]/blog/static/2142429620122611356554/ http://www.cnblogs.com/yjf512/archive/2012/11/02/2751058.html http://blog.sina.com.cn/s/blog_49a665e10100cb52.html

MySQL数据库时间设置自动添加时间和自动更新时间

说明: MySQL字段中设置时间字段自动添加创建时间和自动更新时间设置,设置字段类型为:timestamp 默认值设置为current_timestamp(),更新时间字段字段类型为:timestamp 默认值设置为 current_timestamp() ON UPDATE current_timestamp() SQL语法和实例 create table tb_name( join_time timestamp NULL DEFAULT current_timestamp(), update

自动更新时间死循环脚本

1 #!/bin/sh 2 #Author:nulige 3 # qqinfo:1034611705 4 # Date: 2015-6-8 5 #实现功能:自动更新时间死循环脚本 6 7 while true 8 do 9 uptime 10 sleep 1 11 done [[email protected] script]# date2016年 04月 15日 星期五 11:54:45 CST [[email protected] script]# ll总用量 16-rw-r--r--. 1

linux系统初始化--&#8203;配置ntp自动更新时间

配置ntp自动更新时间 安装ntpdate程序 Shell># yum –y install ntpdate 使用crontab将系统设定为每天0:00与NTP服务器同步时间 Shell># crontab –e 0   0  *  *  *  ntpdate   your_ntp_server_domain_name   or  your_ntp_server_ip_addr 保存退出, 为了我们步骤继续下去,我们执行一次同步 Shell># ntpdate ntp.jn.idc 如果

Android技术4:Android4.4中如何更新相册信息

当你到这篇文章时,你肯定遇到了在Android4.4版本中需要使用本地相册时,无法找到最新的照片这一问题.在Android4.4以前在需要获取手机本地图片信息时,只需要发送一个广播更新相册信息,然而系统更新到4.4之后该广播无效且报错. 广播如下: sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

mysql字段值自动更新时间

在生产环境中可能会出现,项目已经上线,但是更新时间的字段没有赋值,也就是说这条数据每次更新时,更新的时间依旧是null.为了解决这个问题,一般是将程序更新数据时,把更新时间给更新了.但是上线后更改程序需要重新升级,挺麻烦.现在可以通过修改更新时间的字段,来保证每次更新数据时,数据的更新时间自动更新. 在一个已经建好的表执行如下sql即可完成更新时间自动更新: ALTER TABLE checker_barcode MODIFY COLUMN update_time TIMESTAMP NOT N

Yii2 自动更新时间created_at updated_at

创建model之后,新建一条记录,结果设计的表中created_at 字段 updated_at 字段 都是datetime 类型的,却不能自动插入当前时间.查看了资料,解决如下: 1.在class CrmBusiness extends \yii\db\ActiveRecord {}中 引入use  yii\behaviors\TimestampBehavior;use yii\db\Expression; 2.覆盖父类的behaviors 方法 /*** @inheritdoc*/ publ

Linux系统自动更新时间

转载自:http://www.cnblogs.com/choyaooo/p/8012923.html NTP服务器(上海) :ntp.api.bz    中国ntp服务器:cn.pool.ntp.org  pool.ntp.org    安装NTP客户端:    yum -y install ntp修改时区为Asia:    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime     vim  /etc/sysconfig/clock     

CentOS 7 自动更新时间日期

# ntpdate time.nist.gov 或 # rdate -s time.nist.gov 下列服务器可用 time-nw.nist.gov