`
ice.k
  • 浏览: 286796 次
  • 性别: Icon_minigender_1
  • 来自: 荷兰
社区版块
存档分类
最新评论

Android中的网络时间同步

阅读更多
http://blog.csdn.net/absurd/archive/2011/01/09/6125588.aspx
在 Android的系统设置中,有自动同步网络时间的选项。因为Broncho A1移植到froyo版本之后,我们发现时间同步选项无效了。所以我花了一点时间去研究 Android的网络时间同步的流程。研究的结果让我感到惊讶,Android的网络时间同步居然与SNTP协议无关,甚至与TCP/IP协议也毫无关系。

从设置的应用程序中可以了解到,自动同步网络时间的选项只是修改了Settings.System.AUTO_TIME这个设置:

private void setAutoState(boolean isEnabled, boolean autotimeStatus) {
       if (isEnabled == false) {
           mAutoPref.setChecked(autotimeStatus);
           mAutoPref.setEnabled(isEnabled);
       }
       else {
           Settings.System.putInt(getContentResolver(),
              Settings.System.AUTO_TIME, autotimeStatus ? 1 : 0);
       }
       mTimePref.setEnabled(!autotimeStatus);
       mDatePref.setEnabled(!autotimeStatus);
       mTimeZone.setEnabled(!autotimeStatus);
    }
谁会用这个设置呢?然后从代码中查找Settings.System.AUTO_TIME,主要有下面两处:

telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
GSM和CDMA的实现应该是类似的,这里只是看看GSM: 1. reference-ril/reference-ril.c处理主动上报消息。

    if (strStartsWith(s, "%CTZV:")) {
        /* TI specific -- NITZ time */
        char *response;

        line = p = strdup(s);
        at_tok_start(&p);

        err = at_tok_nextstr(&p, &response);

        free(line);
        if (err != 0) {
            LOGE("invalid NITZ line %s\n", s);
        } else {
            RIL_onUnsolicitedResponse (
                RIL_UNSOL_NITZ_TIME_RECEIVED,
                response, strlen(response));
        }
}

这里是处理模组主动上报的消息,如果是时间和时区消息,则调用RIL_onUnsolicitedResponse。

2. RIL_onUnsolicitedResponse会把消息发送给RIL的客户端。
ret = sendResponse(p, client_id);

时间和时区信息的格式在RIL_UNSOL_NITZ_TIME_RECEIVED消息的定义处有说明:

"data" is const char * pointing to NITZ time string in the form "yy/mm/dd,hh:mm:ss(+/-)tz,dt"
3. RIL客户端处理RIL_UNSOL_NITZ_TIME_RECEIVED消息(telephony/java/com/android/internal/telephony/RIL.java: processUnsolicited)
            case RIL_UNSOL_NITZ_TIME_RECEIVED:
                if (RILJ_LOGD) unsljLogRet(response, ret);

                // has bonus long containing milliseconds since boot that the NITZ
                // time was received
                long nitzReceiveTime = p.readLong();

                Object[] result = new Object[2];

                result[0] = ret;
                result[1] = Long.valueOf(nitzReceiveTime);

                if (mNITZTimeRegistrant != null) {

                    mNITZTimeRegistrant
                        .notifyRegistrant(new AsyncResult (null, result, null));
                } else {
                    // in case NITZ time registrant isnt registered yet
                    mLastNITZTimeInfo = result;
                }

是GsmServiceStateTracker向RIL注册的,所以事件会由GsmServiceStateTracker来处理。
4. GsmServiceStateTracker 处理EVENT_NITZ_TIME事件:
            case EVENT_NITZ_TIME:
                ar = (AsyncResult) msg.obj;
                String nitzString = (String)((Object[])ar.result)[0];
                long nitzReceiveTime = ((Long)((Object[])ar.result)[1]).longValue();
                setTimeFromNITZString(nitzString, nitzReceiveTime);
                break;

这里nitzString是时间字符串,由setTimeFromNITZString负责解析。
private void setTimeFromNITZString (String nitz, long nitzReceiveTime) {
            String[] nitzSubs = nitz.split("[/:,+-]");

            int year = 2000 + Integer.parseInt(nitzSubs[0]);
            c.set(Calendar.YEAR, year);

            // month is 0 based!
            int month = Integer.parseInt(nitzSubs[1]) - 1;
            c.set(Calendar.MONTH, month);

            int date = Integer.parseInt(nitzSubs[2]);
            c.set(Calendar.DATE, date);

            int hour = Integer.parseInt(nitzSubs[3]);
            c.set(Calendar.HOUR, hour);

            int minute = Integer.parseInt(nitzSubs[4]);
            c.set(Calendar.MINUTE, minute);

如果在系统设置中,用户选择了自动同步网络时间,才会去设置系统时间。
           if (getAutoTime()) {
               setAndBroadcastNetworkSetTimeZone(zone.getID());
           }
           if (getAutoTime()) {
setAndBroadcastNetworkSetTime(c.getTimeInMillis());
           }

关于NITZ在WIKI上有说明:
NITZ, or Network Identity and Time Zone[1], is a mechanism for provisioning local time and date, as well as network provider identity information to mobile devices via a wireless network[2]. NITZ has been part of the official GSM standard since phase 2+ release 96[3]. NITZ is often used to automatically update the system clock of mobile phones.
由于NITZ的实现是可选的,如果运营商不支持它,Android手机就无法使用此功能了。此时用最好用SNTP来代替,否则用户会感到迷惑。但Android
分享到:
评论

相关推荐

    Android系统时间同步服务

    在Android系统中,时间同步服务是一项至关重要的功能,它确保设备的时间与互联网上的标准时间保持一致,从而保证各种应用程序的正常运行,如日程管理、网络通信等。本压缩包中的"syncClockService"可能包含了实现这...

    NTP时间同步在Android平台的应用

    随着全球信息化和通络通讯技术的迅速发展,人们对时间的精准性要求越来越高。本文通过对NTP 网络时间同步协议和原理的研究,分析了时间同步的架构与流程,提出了NTP 网络时间同步在Android 平台的实现方案。

    android手机时间自动同步

    在Android系统中,时间同步是一项重要的功能,确保设备时间的准确性和一致性。通常,Android设备会通过NITZ(Network Identity and Time Zone)服务来自动同步时间,这依赖于移动网络运营商提供的时间信息。NITZ...

    Android 9.0增加系统同步时间戳接口,同步本机时间

    1. **系统时间同步**:Android系统以往已有与网络时间服务器同步时间的功能,如NTP(Network Time Protocol)。但在Android 9.0中,可能进一步强化了这一功能,提供了更便捷的API接口,允许应用程序或系统服务直接...

    android 网络音乐 歌词同步

    在Android平台上开发一款网络音乐播放应用,实现歌词同步功能,是一项技术挑战但也充满乐趣。这里我们探讨的关键知识点包括Android应用程序开发、网络数据获取、JSON解析、音频播放以及歌词同步技术。 首先,...

    NTP内网时间同步

    在IT行业中,时间同步是一项至关重要的任务,尤其是在网络通信、数据记录和系统管理等领域。"NTP内网时间同步"的标题和描述指向了一个具体的解决方案,即使用Network Time Protocol(NTP)在局域网(内网)环境中...

    Android获取网络时间

    在Android应用开发中,获取网络时间是一项常见的需求,主要用于确保应用程序中的时间信息准确无误,避免用户手动修改设备时间导致的潜在问题。本教程将详细讲解如何在Android中实现网络时间的获取,并提供相关的代码...

    Android中实现用命令行同步网络时间

    主要介绍了Android中实现用命令行同步网络时间,本文讲解使用BusyBox实现同步网络时间,并给出了详细操作步骤,需要的朋友可以参考下

    安卓手机自带同步时间,Android NTP获取时间 网络时间同步

    安卓手机自带同步时间,Android NTP获取时间 网络时间同步Android 获取时间demo包含apk 和里面的代码本文 不是系统ntp获取时间代码,不过是有借鉴系统ntp service代码开发的demo

    android通过访问网络获取网络时间,并修改系统时间

    在Android平台上,获取网络时间并校准系统时间是一项常见的任务,尤其对于那些需要精确时间同步的应用来说至关重要。本文将深入探讨如何实现这一功能,并提供相关的编程知识点。 首先,要获取网络时间,通常我们会...

    NTP时间同步

    总结,NTP时间同步在Android系统中扮演着不可或缺的角色,它确保了设备时间的准确性,从而支持了众多功能的正常运行。理解和掌握NTP的工作原理以及如何在Android环境中实现它是每个Android开发者必备的知识点。

    android基于UDP局域网实现视频同步播放

    1. **时间同步**:所有设备需要有一个共同的时间基准,可以使用NTP(Network Time Protocol)服务或者在启动时同步一个参考时间。 2. **数据同步**:确保每个设备在同一时间点播放相同的数据帧。发送端需要按照特定...

    设置系统时间、同步网络时间

    网络时间同步是通过NTP协议实现的,它允许计算机与远程服务器校准时间,以确保精确性。NTP服务器通常是一组全球分布的高精度原子钟,它们之间相互校对,提供统一的时间标准。客户端计算机通过发送请求到这些服务器,...

    android-获取网络时间、获取特定时区时间、时间同步的方法

    最近整理出android-获取网络时间、获取特定时区时间、时间同步的方法。具体如下: 方法一: SimpleDateFormat dff = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); dff.setTimeZone(TimeZone.getTimeZone(GMT+08)); ...

    android修改头像并同步服务器

    在Android应用开发中,"修改头像并同步服务器"是一个常见的功能需求,用户可以自定义他们的个人形象,而这些更改需要实时同步到云端服务器,以便其他设备或服务能够获取最新的头像信息。以下是对这个功能的详细解释...

    android网络操作

    在Android平台上进行网络操作是应用程序开发中的重要环节,它允许应用与远程服务器进行数据交互,如获取用户信息、上传下载文件、同步数据等。本文将深入探讨“Android网络操作”的核心概念、常用方法以及如何利用...

    Android 获取网络时间

    首先明确目标:在Android应用中实现网络时间的获取功能。这通常涉及到以下几个步骤: 1. **建立网络连接**:访问提供时间服务的服务器。 2. **发送请求**:向服务器发送获取时间的请求。 3. **接收响应**:从服务器...

    Android代码-开源文件同步安卓版

    【Android代码-开源文件同步安卓版】是一款专为Android设备设计的开源文件同步应用,它允许用户在不同的设备之间安全地、实时地同步和共享文件。这个项目基于Syncthing,一个跨平台的、自由开源的文件同步工具,旨在...

    同步系统时间功能实现

    "同步系统时间功能实现"这个主题聚焦于如何在Android平台上获取网络时间并更新本地系统时间,以确保时间的一致性和准确性。以下是对这个功能的详细阐述: 1. **NTP协议**:网络时间协议(Network Time Protocol, ...

    android http同步与异步通讯包

    在Android网络编程中,还需要注意以下几点: 1. **权限声明**:确保在AndroidManifest.xml中添加了`INTERNET`权限,否则应用无法进行网络访问。 2. **网络连接检测**:在发起请求前,检查设备是否已连接到网络,避免...

Global site tag (gtag.js) - Google Analytics