本文介绍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)
}
好了,你已经学会了。