本文介绍Android系统应用设置中时区的开发。开发时区功能用到系统供给的SettingsLib.jar包。文章结尾会供给RK3588SettingLib.jar,咱们依据自己实际项目判别是否可行。

1、标准API下的时区挑选

在没有firmware工程师供给jar包情况下,自己完成的时区列表效果如下,其中时刻代表时刻偏移。

Android设置时区功能开发

完成代码如下:

object TimezoneUtils {
    private const val TAG = "TimezoneUtils"
    fun getTimeZoneInfo(): List<TimeZoneInfo> {
        val list = mutableListOf<TimeZoneInfo>()
        val default = getCurTimeZone()
        TimeZone.getAvailableIDs().forEach {
            val zone = TimeZone.getTimeZone(it)
            val name: String = zone.getDisplayName(false,TimeZone.LONG)
            val offset = "${zone.rawOffset / (1000 * 60 * 60)}"
            val info = TimeZoneInfo(name, it, offset, default.id == it)
            list.add(info)
        }
        return list
    }
    fun setCurTimeZone(id: String) {
        val zone = java.util.TimeZone.getTimeZone(id)
        java.util.TimeZone.setDefault(zone)
    }
}
data class TimeZoneInfo(var name: String, val id: String, var time: String = "", var selected: Boolean = false)

代码中将相关时区信息封装成TimeZoneInfo,属性name便是上图的格林尼治标准时刻,id便是用于设置和获取时区的仅有标识,例如Asia/Shanghai,time便是各个时区相对于格林尼治标准时刻的偏移。

TimezoneUtils东西类中,咱们经过getTimeZoneInfo函数列表获取时区列表即可用于进一步操作,例如显现。

2、在jar情况下时区挑选

其实原理也是经过扒firmware的代码来完成,着手能力强的完全可以自己完成,这儿也是为了咱们便利快速开发。相关资源会在结尾供给。

完成效果如下:

Android设置时区功能开发

经过这种方法完成,咱们可以获取愈加准确地址显现,而不是标准时刻。

public static List<TimeZoneBean> getTimeZoneList()  {
    List<TimeZoneBean> timeZoneBeanList=new ArrayList<>();
    List<Map<String, Object>> timezones = ZoneGetter.getZonesList(BaseApplication.context);
    for(Map<String, Object> zones:timezones)
    {
        String name= (String) zones.get("name");
        String gmt = (String) zones.get("gmt");
        String ids=(String) zones.get("id");
        TimeZoneBean timeZoneBean=new TimeZoneBean(ids,gmt,name);
        timeZoneBeanList.add(timeZoneBean);
    }
    return timeZoneBeanList;
}

这儿将时区信息封装了TimeZoneBean实体类,然后经过ZoneGetter获取时区信息。文字结尾供给一个压缩包,内容有一个timezones.xml文件,放在xml文件夹下即可,一个jar包,依靠到工程中,一个ZoneGetter类,放在哪个package下都可以。然后咱们正常使用,调用上面的getTimeZoneList函数即可。

3、获取当时时区

  fun getCurTimeZone(): TimeZoneInfo {
      val zone = TimeZone.getDefault()
      val name = zone.getDisplayName()
      val offset = "${zone.rawOffset / (1000 * 60 * 60)}"
      val info = TimeZoneInfo(name, zone.id, offset)
      return info
  }

即经过TimeZone.getDefault获取当时时区。

4、设置当时时区

这儿的id便是前面获取时区列表的ID,例如Asia/Shanghai,然后经过AlarmManager进行设置。

public static void setTimeZone(String id)
{
    TimeZone tz = TimeZone.getTimeZone(id);
    TimeZone.setDefault(tz);
    AlarmManager alarm = (AlarmManager)BaseApplication.context.getSystemService(Context.ALARM_SERVICE);
    alarm.setTimeZone(id);
}

或者:

  fun setCurTimeZone(id: String) {
      val zone = TimeZone.getTimeZone(id)
      TimeZone.setDefault(zone)
  }

好了,你现已学会了。

时区资源

Android设置时区功能开发