本文介绍Android系统应用设置中时区的开发。开发时区功能用到系统供给的SettingsLib.jar
包。文章结尾会供给RK3588
的SettingLib.jar
,咱们依据自己实际项目判别是否可行。
1、标准API下的时区挑选
在没有firmware
工程师供给jar
包情况下,自己完成的时区列表效果如下,其中时刻代表时刻偏移。
完成代码如下:
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
的代码来完成,着手能力强的完全可以自己完成,这儿也是为了咱们便利快速开发。相关资源会在结尾供给。
完成效果如下:
经过这种方法完成,咱们可以获取愈加准确地址显现,而不是标准时刻。
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)
}
好了,你现已学会了。
时区资源