当前位置:文档之家› android生日提醒分析和源码提供

android生日提醒分析和源码提供

android生日提醒分析和源码提供
android生日提醒分析和源码提供

获取将过生日的人

1.DECLARE @d DATETIME

2.SET @d='2010-12-25'

3.SELECT *

4.FROM

5.(SELECT https://www.doczj.com/doc/2e18970549.html,_id,https://www.doczj.com/doc/2e18970549.html,_username,https://www.doczj.com/doc/2e18970549.html,_birthday

6. ,ISNULL(DATEDIFF(DAY,@d,dbo.fn_GetSolar(LEFT(dbo.fn_GetLunar(@d),4)+RIGHT(CONVE

RT(CHAR(10),https://www.doczj.com/doc/2e18970549.html,_birthday,23),6))),-1) CountDay

7.FROM users u

8.WHERE https://www.doczj.com/doc/2e18970549.html,_islunar=1

9.UNION ALL

10.SELECT https://www.doczj.com/doc/2e18970549.html,_id,https://www.doczj.com/doc/2e18970549.html,_username,https://www.doczj.com/doc/2e18970549.html,_birthday

11. ,DATEDIFF(DAY,@d,DATEADD(YEAR,DATEDIFF(YEAR,https://www.doczj.com/doc/2e18970549.html,_birthday,@d), https://www.doczj.com/doc/2e18970549.html,_birthday))

12.FROM users u

13.WHERE https://www.doczj.com/doc/2e18970549.html,_islunar=0

14.) A

15.WHERE a.CountDay>=0 AND a.CountDay<=3

复制代码

此处是获取3内之内将过生日的人数。

以下内容会员跟帖回复才能看到

==============================

注意点:1.有人是农历过生日,有人是公历过生日,所以分开处理

2.为了准确计算相差日期,用到函数DATE DIFF,所以要用公历来计算

3.注意一年过两个生日的情况

流程:

1.查询公历过生日情况

直接用D ATEDIFF函数计算会员生日与指定日期的时间差,如果在规定提醒区间,则提醒。这个比较简单

2.查询农历过生日情况

2.1 先把指定日期转换为农历,一般是系统日期

2.2 获取指定日期在农历属于哪一年

2.3 将会员生日转换到指定日期农历年的日期,即为会员某一农历年的生日

2.4 计算出指定日期农历年的生日后,再将其转换成对应的公历

2.5 比照农历生日转换成公历生日与指定日期的时间差在不在规定的提醒敬意,同样用DATE DIFF函数。

==============================

生日提醒之农历,公历问题(三) [复制链接]

s021368

?组别51Aspx专家

?生日

?帖子459

?积分594

?性别男

?注册时间

2008-01-03

1#

字体大小:

发表于 2010-10-17 09:54 |只看楼主

1.创建应用表

1 CREATE TABLE [users](

2 [us_id] [int] IDENTITY(1,1) NOT NULL,

3 [us_username] [nvarchar](40) NOT NULL,

4 [us_password] [nvarchar](64) NOT NULL,

5 [us_firstname] [nvarchar](60) NULL,

6 [us_lastname] [nvarchar](60) NULL,

7 [us_birthday] [datetime] NULL,

8 [us_islunar] [bit] NULL,

9 CONSTRAINT [pk_users] PRIMARY KEY CLUSTERED

10 (

11 [us_id] ASC

12 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_

13 ) ON [PRIMARY]

14

15 GO

16

17 ALTER TABLE [dbo].[users] ADD CONSTRAINT [DF_users_us_islunar] DEFAULT ((

8 GO

4.生成数据于公历农历详细比照表

1.TRUNCATE TABLE SolarLunarData

2.GO

3.DECLARE @i INT

4.SET @i=0

5.WHILE @i<3000

6.BEGIN

7.INSERT INTO SolarLunarData(SolarDate,LunarDate)

8.SELECT CONVERT(CHAR(10),DATEADD(d,@i,'2010-01-01'),23),

9. dbo.fn_GetLunar(DATEADD(d,@i,'2010-01-01'))

10.SET @i=@i+1

11.END

复制代码

--因为生日提醒都在2010年后,所以我从2010年生成数据,并往后3000天,估计3K天后客户也不会用这个系统了。

5.创建农历获取公历函数

1.IF object_id('fn_GetSolar') IS NOT NULL

2. DROP FUNCTION fn_GetSolar

3.GO

4.CREATE FUNCTION dbo.fn_GetSolar(@day VARCHAR(10))

5.RETURNS DATETIME

6.AS

7.BEGIN

8. RETURN(SELECT SolarDate FROM SolarLunarData WHERE LunarDate=@day)

9.END

10.GO

复制代码

--此函数可以从农历获取公历,前提是你要找的数据已在上表中生成。iggle

生日提醒之农历,公历问题(一)

生日提醒之农历,公历问题(一)

1.创建基础数据--1900至2049年公历,农历比照表

1.CREATE TABLE SolarData

2.(

3. yearId int not null,

4. data char(7) not null,

5. dataInt int not null

6.)

7.GO

8.--插入数据

9.INSERT INTO

10.SolarData SELECT 1900,'0x04bd8',19416 UNION ALL SELECT 1901,'0x04ae0',19168

11.UNION ALL SELECT 1902,'0x0a570',42352 UNION ALL SELECT 1903,'0x054d5',21717

12.UNION ALL SELECT 1904,'0x0d260',53856 UNION ALL SELECT 1905,'0x0d950',55632

13.UNION ALL SELECT 1906,'0x16554',91476 UNION ALL SELECT 1907,'0x056a0',22176

14.UNION ALL SELECT 1908,'0x09ad0',39632 UNION ALL SELECT 1909,'0x055d2',21970

15.UNION ALL SELECT 1910,'0x04ae0',19168 UNION ALL SELECT 1911,'0x0a5b6',42422

16.UNION ALL SELECT 1912,'0x0a4d0',42192 UNION ALL SELECT 1913,'0x0d250',53840

17.UNION ALL SELECT 1914,'0x1d255',119381 UNION ALL SELECT 1915,'0x0b540',46400

18.UNION ALL SELECT 1916,'0x0d6a0',54944 UNION ALL SELECT 1917,'0x0ada2',44450

19.UNION ALL SELECT 1918,'0x095b0',38320 UNION ALL SELECT 1919,'0x14977',84343

20.UNION ALL SELECT 1920,'0x04970',18800 UNION ALL SELECT 1921,'0x0a4b0',42160

21.UNION ALL SELECT 1922,'0x0b4b5',46261 UNION ALL SELECT 1923,'0x06a50',27216

22.UNION ALL SELECT 1924,'0x06d40',27968 UNION ALL SELECT 1925,'0x1ab54',109396

23.UNION ALL SELECT 1926,'0x02b60',11104 UNION ALL SELECT 1927,'0x09570',38256

24.UNION ALL SELECT 1928,'0x052f2',21234 UNION ALL SELECT 1929,'0x04970',18800

25.UNION ALL SELECT 1930,'0x06566',25958 UNION ALL SELECT 1931,'0x0d4a0',54432

26.UNION ALL SELECT 1932,'0x0ea50',59984 UNION ALL SELECT 1933,'0x06e95',28309

27.UNION ALL SELECT 1934,'0x05ad0',23248 UNION ALL SELECT 1935,'0x02b60',11104

28.UNION ALL SELECT 1936,'0x186e3',100067 UNION ALL SELECT 1937,'0x092e0',37600

29.UNION ALL SELECT 1938,'0x1c8d7',116951 UNION ALL SELECT 1939,'0x0c950',51536

30.UNION ALL SELECT 1940,'0x0d4a0',54432 UNION ALL SELECT 1941,'0x1d8a6',120998

31.UNION ALL SELECT 1942,'0x0b550',46416 UNION ALL SELECT 1943,'0x056a0',22176

32.UNION ALL SELECT 1944,'0x1a5b4',107956 UNION ALL SELECT 1945,'0x025d0',9680

33.UNION ALL SELECT 1946,'0x092d0',37584 UNION ALL SELECT 1947,'0x0d2b2',53938

34.UNION ALL SELECT 1948,'0x0a950',43344 UNION ALL SELECT 1949,'0x0b557',46423

35.UNION ALL SELECT 1950,'0x06ca0',27808 UNION ALL SELECT 1951,'0x0b550',46416

36.UNION ALL SELECT 1952,'0x15355',86869 UNION ALL SELECT 1953,'0x04da0',19872

37.UNION ALL SELECT 1954,'0x0a5d0',42448 UNION ALL SELECT 1955,'0x14573',83315

38.UNION ALL SELECT 1956,'0x052d0',21200 UNION ALL SELECT 1957,'0x0a9a8',43432

39.UNION ALL SELECT 1958,'0x0e950',59728 UNION ALL SELECT 1959,'0x06aa0',27296

40.UNION ALL SELECT 1960,'0x0aea6',44710 UNION ALL SELECT 1961,'0x0ab50',43856

41.UNION ALL SELECT 1962,'0x04b60',19296 UNION ALL SELECT 1963,'0x0aae4',43748

42.UNION ALL SELECT 1964,'0x0a570',42352 UNION ALL SELECT 1965,'0x05260',21088

43.UNION ALL SELECT 1966,'0x0f263',62051 UNION ALL SELECT 1967,'0x0d950',55632

44.UNION ALL SELECT 1968,'0x05b57',23383 UNION ALL SELECT 1969,'0x056a0',22176

45.UNION ALL SELECT 1970,'0x096d0',38608 UNION ALL SELECT 1971,'0x04dd5',19925

46.UNION ALL SELECT 1972,'0x04ad0',19152 UNION ALL SELECT 1973,'0x0a4d0',42192

47.UNION ALL SELECT 1974,'0x0d4d4',54484 UNION ALL SELECT 1975,'0x0d250',53840

48.UNION ALL SELECT 1976,'0x0d558',54616 UNION ALL SELECT 1977,'0x0b540',46400

49.UNION ALL SELECT 1978,'0x0b5a0',46496 UNION ALL SELECT 1979,'0x195a6',103846

50.UNION ALL SELECT 1980,'0x095b0',38320 UNION ALL SELECT 1981,'0x049b0',18864

51.UNION ALL SELECT 1982,'0x0a974',43380 UNION ALL SELECT 1983,'0x0a4b0',42160

52.UNION ALL SELECT 1984,'0x0b27a',45690 UNION ALL SELECT 1985,'0x06a50',27216

53.UNION ALL SELECT 1986,'0x06d40',27968 UNION ALL SELECT 1987,'0x0af46',44870

54.UNION ALL SELECT 1988,'0x0ab60',43872 UNION ALL SELECT 1989,'0x09570',38256

55.UNION ALL SELECT 1990,'0x04af5',19189 UNION ALL SELECT 1991,'0x04970',18800

56.UNION ALL SELECT 1992,'0x064b0',25776 UNION ALL SELECT 1993,'0x074a3',29859

57.UNION ALL SELECT 1994,'0x0ea50',59984 UNION ALL SELECT 1995,'0x06b58',27480

58.UNION ALL SELECT 1996,'0x055c0',21952 UNION ALL SELECT 1997,'0x0ab60',43872

59.UNION ALL SELECT 1998,'0x096d5',38613 UNION ALL SELECT 1999,'0x092e0',37600

60.UNION ALL SELECT 2000,'0x0c960',51552 UNION ALL SELECT 2001,'0x0d954',55636

61.UNION ALL SELECT 2002,'0x0d4a0',54432 UNION ALL SELECT 2003,'0x0da50',55888

62.UNION ALL SELECT 2004,'0x07552',30034 UNION ALL SELECT 2005,'0x056a0',22176

63.UNION ALL SELECT 2006,'0x0abb7',43959 UNION ALL SELECT 2007,'0x025d0',9680

64.UNION ALL SELECT 2008,'0x092d0',37584 UNION ALL SELECT 2009,'0x0cab5',51893

65.UNION ALL SELECT 2010,'0x0a950',43344 UNION ALL SELECT 2011,'0x0b4a0',46240

66.UNION ALL SELECT 2012,'0x0baa4',47780 UNION ALL SELECT 2013,'0x0ad50',44368

67.UNION ALL SELECT 2014,'0x055d9',21977 UNION ALL SELECT 2015,'0x04ba0',19360

68.UNION ALL SELECT 2016,'0x0a5b0',42416 UNION ALL SELECT 2017,'0x15176',86390

69.UNION ALL SELECT 2018,'0x052b0',21168 UNION ALL SELECT 2019,'0x0a930',43312

70.UNION ALL SELECT 2020,'0x07954',31060 UNION ALL SELECT 2021,'0x06aa0',27296

71.UNION ALL SELECT 2022,'0x0ad50',44368 UNION ALL SELECT 2023,'0x05b52',23378

72.UNION ALL SELECT 2024,'0x04b60',19296 UNION ALL SELECT 2025,'0x0a6e6',42726

73.UNION ALL SELECT 2026,'0x0a4e0',42208 UNION ALL SELECT 2027,'0x0d260',53856

74.UNION ALL SELECT 2028,'0x0ea65',60005 UNION ALL SELECT 2029,'0x0d530',54576

75.UNION ALL SELECT 2030,'0x05aa0',23200 UNION ALL SELECT 2031,'0x076a3',30371

76.UNION ALL SELECT 2032,'0x096d0',38608 UNION ALL SELECT 2033,'0x04bd7',19415

77.UNION ALL SELECT 2034,'0x04ad0',19152 UNION ALL SELECT 2035,'0x0a4d0',42192

78.UNION ALL SELECT 2036,'0x1d0b6',118966 UNION ALL SELECT 2037,'0x0d250',53840

79.UNION ALL SELECT 2038,'0x0d520',54560 UNION ALL SELECT 2039,'0x0dd45',56645

80.UNION ALL SELECT 2040,'0x0b5a0',46496 UNION ALL SELECT 2041,'0x056d0',22224

81.UNION ALL SELECT 2042,'0x055b2',21938 UNION ALL SELECT 2043,'0x049b0',18864

82.UNION ALL SELECT 2044,'0x0a577',42359 UNION ALL SELECT 2045,'0x0a4b0',42160

83.UNION ALL SELECT 2046,'0x0aa50',43600 UNION ALL SELECT 2047,'0x1b255',111189

84.UNION ALL SELECT 2048,'0x06d20',27936 UNION ALL SELECT 2049,'0x0ada0',44448 2.获取农历的方法

1.ALTER FUNCTION fn_GetLunar(@solarDay DATETIME)

2.RETURNS VARCHAR(10)

3.

4.AS

5.BEGIN

6. DECLARE @solData int

7. DECLARE @offset int

8. DECLARE @iLunar int

9. DECLARE @i INT

10. DECLARE @j INT

11. DECLARE @yDays int

12. DECLARE @mDays int

13. DECLARE @mLeap int

14. DECLARE @mLeapNum int

15. DECLARE @bLeap smallint

16. DECLARE @temp int

17.

18. DECLARE @YEAR INT

19. DECLARE @MONTH INT

20. DECLARE @DAY INT

21.

22. DECLARE @OUTPUTDATE VARCHAR(10)

23.

24. --保证传进来的日期是不带时间

25. SET @solarDay=CONVERT(NVARCHAR(10),@solarDay,120) --cast(@solarDay AS char(10))

26. SET @offset=CAST(@solarDay-'1900-01-30' AS INT)

27.

28.

29. --确定农历年开始

30. SET @i=1900

31. --SET @offset=@solData

32. WHILE @i<2050 AND @offset>0

33. BEGIN

34. SET @yDays=348

35. SET @mLeapNum=0

36. SELECT @iLunar=dataInt FROM SolarData WHERE yearId=@i

37.

38. --传回农历年的总天数

39. SET @j=32768

40. WHILE @j>8

41. BEGIN

42. IF @iLunar & @j >0

43. SET @yDays=@yDays+1

44. SET @j=@j/2

45. END

46.

47. --传回农历年闰哪个月 1-12 , 没闰传回 0

48. SET @mLeap = @iLunar & 15

49.

50. --传回农历年闰月的天数 ,加在年的总天数上

51. IF @mLeap > 0

52. BEGIN

53. IF @iLunar & 65536 > 0

54. SET @mLeapNum=30

55. ELSE

56. SET @mLeapNum=29

57.

58. SET @yDays=@yDays+@mLeapNum

59. END

60.

61. SET @offset=@offset-@yDays

62. SET @i=@i+1

63. END

64.

65. IF @offset <= 0

66. BEGIN

67. SET @offset=@offset+@yDays

68. SET @i=@i-1

69. END

70. --确定农历年结束

71. SET @YEAR=@i

72.

73. --确定农历月开始

74. SET @i = 1

75. SELECT @iLunar=dataInt FROM SolarData WHERE yearId=@YEAR

76.

77. --判断那个月是润月

78. SET @mLeap = @iLunar & 15

79. SET @bLeap = 0

80.

81. WHILE @i < 13 AND @offset > 0

82. BEGIN

83. --判断润月

84. SET @mDays=0

85. IF (@mLeap > 0 AND @i = (@mLeap+1) AND @bLeap=0)

86. BEGIN--是润月

87. SET @i=@i-1

88. SET @bLeap=1

89. --传回农历年闰月的天数

90. IF @iLunar & 65536 > 0

91. SET @mDays = 30

92. ELSE

93. SET @mDays = 29

94. END

95. ELSE

96. --不是润月

97. BEGIN

98. SET @j=1

99. SET @temp = 65536

100. WHILE @j<=@i

101. BEGIN

102. SET @temp=@temp/2

103. SET @j=@j+1

104. END

105.

106. IF @iLunar & @temp > 0

107. SET @mDays = 30

108. ELSE

109. SET @mDays = 29

110. END

111.

112. --解除闰月

113. IF @bLeap=1 AND @i= (@mLeap+1)

114. SET @bLeap=0

115.

116. SET @offset=@offset-@mDays

117. SET @i=@i+1

118. END

119.

120. IF @offset <= 0

121. BEGIN

122. SET @offset=@offset+@mDays

123. SET @i=@i-1

124. END

125.

126. --确定农历月结束

127. SET @MONTH=@i

128.

129. --确定农历日结束

130. SET @DAY=@offset

131.

132. SET @OUTPUTDATE=CAST(@YEAR AS VARCHAR(4))+'-'+RIGHT('0'+CAST(@MONTH AS VARCHAR(2)),2)+'-'+RIGHT('0'+CAST(@DAY AS VARCHAR(2)),2) --CAST((CAST(@YEAR AS

VARCHAR(4))+'-'+CAST(@MONTH AS VARCHAR(2))+'-'+CAST(@DAY AS VARCHAR(2))) AS DATETIME) 133. RETURN @OUTPUTDATE

134.END

135.

136.--调用方法

137.--DECLARE @d DATETIME;

138.--SET @d=GETDATE();

139.--SELECT dbo.fn_GetLunar(@d)

140.GO

3.创建公历,农历详细对照表

1.CREATE TABLE [dbo].[SolarLunarData](

2. [RecID] [int] IDENTITY(1,1) NOT NULL,

3. [SolarDate] [datetime] NOT NULL,

4. [LunarDate] [varchar](10) NOT NULL,

Android Hotfix 新方案——Amigo 源码解读

Android Hotfix 新方案——Amigo 源码解读 首先我们先来看看如何使用这个库。 用法 在project 的build.gradle中 dependencies { classpath 'me.ele:amigo:0.0.3' } 在module 的build.gradle中 apply plugin: 'me.ele.amigo' 就这样轻松的集成了Amigo。 生效补丁包 补丁包生效有两种方式可以选择: ? 稍后生效补丁包 ? 如果不想立即生效而是用户第二次打开App 时才打入补丁包,则可以将新的Apk 放到/data/data/{your pkg}/files/amigo/demo.apk,第二次打开时就会自动生效。可以通过这个方法 ? File hotfixApk = Amigo.getHotfixApk(context); ?

获取到新的Apk。 同时,你也可以使用Amigo 提供的工具类将你的补丁包拷贝到指定的目录当中。 ? FileUtils.copyFile(yourApkFile, amigoApkFile); ? ? 立即生效补丁包 ? 如果想要补丁包立即生效,调用以下两个方法之一,App 会立即重启, 并且打入补丁包。 ? Amigo.work(context); ? Amigo.work(context, apkFile); ? 删除补丁包 如果需要删除掉已经下好的补丁包,可以通过这个方法 Amigo.clear(context); 提示:如果apk 发生了变化,Amigo 会自动清除之前的apk。 自定义界面 在热修复的过程中会有一些耗时的操作,这些操作会在一个新的进程中的Activity 中执行,所以你可以通过以下方式来自定义这个Activity。

Android源码下载方法详解

Android: Android源码下载方法详解 分类:Android平台 安卓源码下载地址:https://www.doczj.com/doc/2e18970549.html,/source/downloading.html 相信很多下载过内核的人都对这个很熟悉 git clone git://https://www.doczj.com/doc/2e18970549.html,/kernel/common.git kernel 但是这是在以前,现在如果这么执行的话,会显示如下内容 Initialized empty Git repository in /home/star/working/kernel/.git/ https://www.doczj.com/doc/2e18970549.html,[0: 149.20.4.77]: errno=Connection refused fatal: unable to connect a socket (Connection refused) 通过浏览器输入https://www.doczj.com/doc/2e18970549.html,/,发现该网站已经被重定向为 https://www.doczj.com/doc/2e18970549.html,/source/downloading.html 可以在该页面的最后发现内核的下载方法。 下面我们介绍一下Android源码下载的步骤。 工作环境: 操作系统:Ubuntu 10.04 或Ubuntu10.10 git程序:1.7.0.4 或1.7.1 转载请注明出处:https://www.doczj.com/doc/2e18970549.html,/pku_android 方法一: 1.1 初始化安装环境 参考网页https://www.doczj.com/doc/2e18970549.html,/source/initializing.html 主要要做的就是安装jdk和安装一些软件包 $ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev \ libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown \ libxml2-utils 如果已经安装了,就不许要这步了 1.2 无论下载内核和源码,都需要进行如下操作 参考网页https://www.doczj.com/doc/2e18970549.html,/source/downloading.html $ mkdir ~/bin $ PATH=~/bin:$PATH $ curl https://https://www.doczj.com/doc/2e18970549.html,/dl/googlesource/git-repo/repo > ~/bin/repo 如果出现: repo init error: could not verify the tag 'v1.12.7',

Android源代码结构分析

目录 一、源代码结构 (2) 第一层次目录 (2) bionic目录 (3) bootloader目录 (5) build目录 (7) dalvik目录 (9) development目录 (9) external目录 (13) frameworks目录 (19) Hardware (20) Out (22) Kernel (22) packages目录 (22) prebuilt目录 (27) SDK (28) system目录 (28) Vendor (32)

一、源代码结构 第一层次目录 Google提供的Android包含了原始Android的目标机代码,主机编译工具、仿真环境,代码包经过解压缩后,第一级别的目录和文件如下所示: . |-- Makefile (全局的Makefile) |-- bionic (Bionic含义为仿生,这里面是一些基础的库的源代码) |-- bootloader (引导加载器),我们的是bootable, |-- build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具) |-- dalvik (JAVA虚拟机) |-- development (程序开发所需要的模板和工具) |-- external (目标机器使用的一些库) |-- frameworks (应用程序的框架层) |-- hardware (与硬件相关的库) |-- kernel (Linux2.6的源代码) |-- packages (Android的各种应用程序) |-- prebuilt (Android在各种平台下编译的预置脚本) |-- recovery (与目标的恢复功能相关) `-- system (Android的底层的一些库)

Android USB 驱动分析

Android USB 驱动分析 一、USB驱动代码架构和使用 1、代码简介 USB驱动代码在/drivers/usb/gadget下,有三个文件:android.c, f_adb.c, f_mass_storage.c;g_android.ko 是由这三个文件编译而来,其中android.c 依赖于 f_adb.c 和 f_mass_storage.c(这两个文件之间无依赖关系)。 可在android.c中看到: static int __init android_bind_config(struct usb_configuration *c) { struct android_dev *dev = _android_dev; int ret; printk(KERN_DEBUG "android_bind_config\n"); ret = mass_storage_function_add(dev->cdev, c, dev->nluns); if (ret) return ret; return adb_function_add(dev->cdev, c); } 2、驱动使用 要使USB mass storage连接到主机: 打开/sys/devices/platform/usb_mass_storage/lun0/file文件,向 file文件写入一个存储 设备的路径,例如/dev/block/vold/179:0 (major:minor)路径; 这里的usb_mass_storage根据实际应用可以改的,由 platform_device_register函数的参数决 定。 例如: static struct platform_device fsg_platform_device = { .name = "usb_mass_storage", .id = -1, }; static void __init tegra_machine_init(void) { .... (void) platform_device_register(&fsg_platform_device); .... }

Android 串口编程原理和实现方式附源码

提到串口编程,就不得不提到JNI,不得不提到JavaAPI中的文件描述符类:。下面我分别对JNI、以及串口的一些知识点和实现的源码进行分析说明。这里主要是参考了开源项目android-serialport-api。 串口编程需要了解的基本知识点:对于串口编程,我们只需对串口进行一系列的设置,然后打开串口,这些操作我们可以参考串口调试助手的源码进行学习。在Java中如果要实现串口的读写功能只需操作文件设备类:即可,其他的事都由驱动来完成不用多管!当然,你想了解,那就得看驱动代码了。这里并不打算对驱动进行说明,只初略阐述应用层的实现方式。 (一)JNI: 关于JNI的文章网上有很多,不再多做解释,想详细了解的朋友可以查看云中漫步的技术文章,写得很好,分析也很全面,那么在这篇拙文中我强调3点: 1、如何将编译好的SO文件打包到APK中?(方法很简单,直接在工程目录下新建文件夹libs/armeabi,将SO文件Copy到此目录即可) 2、命名要注意的地方?(在编译好的SO文件中,将文件重命名为:lib即可。其中是编译好后生成的文件) 3、MakeFile文件的编写(不用多说,可以直接参考package/apps目录下用到JNI的相关项目写法) 这是关键的代码: [cpp]view plaincopy

(二):

文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的或。这是API的描述,不太好理解,其实可简单的理解为:就是对一个文件进行读写。 (三)实现串口通信细节 1) 建工程:SerialDemo包名:org.winplus.serial,并在工程目录下新建jni和libs两个文件夹和一个org.winplus.serial.utils,如下图: 2) 新建一个类:SerialPortFinder,添加如下代码: [java]view plaincopy 1.package org.winplus.serial.utils; 2. 3.import java.io.File; 4.import java.io.; 5.import java.io.IOException; 6.import java.io.LineNumberReader; 7.import java.util.Iterator; 8.import java.util.Vector; 9. 10.import android.util.Log; 11. 12.public class SerialPortFinder { 13. 14.private static final String TAG = "SerialPort"; 15.

App工程结构搭建:几种常见Android代码架构分析

App工程结构搭建:几种常见Android代码架构分析 关于Android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优美的分层总是一种舒服的享受的。 从艺术的角度看,其实我们是在追求一种美。 本文先分析几个当今比较流行的android软件包,最后我们汲取其中觉得优秀的部分,搭建我们自己的通用android工程模板。 1. 微盘 微盘的架构比较简单,我把最基本,最主干的画了出来: 第一层:com.sina.VDisk:com.sina(公司域名)+app(应用程序名称) 。 第二层:各模块名称(主模块VDiskClient和实体模块entities)第三层:各模块下具体子包,实现类。 从图中我们能得出上述分析中一个最简单最经典的结构,一般在应用程序包下放一些全局的包或者类,如果有多个大的模块,可以分成多个包,其中包括一个主模块。 在主模块中定义基类,比如BaseActivity等,如果主模块下还有子模块,可以在主模块下建立子模块相应的包。说明一点,有的时候如果只有一个主模块,我们完全可以省略掉模

块这一层,就是BaseActivity.java及其子模块直接提至第二层。 在实体模块中,本应该定义且只定义相应的实体类,供全局调用(然而实际情况可能不是这样,后面会说到)。在微盘应用中,几乎所有的实体类是以xxx+info命名的,这种命名也是我赞成的一种命名,从语义上我觉得xxxModel.java这种命名更生动更真实,xxxModel给我一种太机械太死板的感觉,这点完全是个人观点,具体操作中以个人习惯为主。还有一点,在具体的xxxInfo,java中有很多实体类中是没有get/set的方法,而是直接使用public的字段名。这一点,我是推荐这种方式的,特别是在移动开发中,get/set方法很多时候是完全没有必要的,而且是有性能消耗的。当然如果需要对字段设置一定的控制,get/set方法也是可以酌情使用的。 2. 久忆日记 相比于微盘的工程结构,久忆日记的结构稍微复杂了一些。如下图: 1).第一层和前面微盘一样的. 2).第二层则没有模块分类,直接把需要的具体实现类都放在下面,主要日记的一些日记相关的Activity。 3).第二层的实体包命令为model包,里面不仅存放了实体类

最全的Android源码目录结构详解

最全的Android源码目录结构详解 Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等基础开发包配置) |-- cts (Android兼容性测试套件标准) |-- dalvik (dalvik JAVA虚拟机) |-- development (应用程序开发相关) |-- external (android使用的一些开源的模组) |-- frameworks (核心框架——java及C++语言) |-- hardware (部分厂家开源的硬解适配层HAL代码) |-- out (编译完成后的代码输出与此目录) |-- packages (应用程序包) |-- prebuilt (x86和arm架构下预编译的一些资源) |-- sdk (sdk及模拟器) |-- system (底层文件系统库、应用及组件——C语言) `-- vendor (厂商定制代码) bionic 目录 |-- libc (C库) | |-- arch-arm (ARM架构,包含系统调用汇编实现) | |-- arch-x86 (x86架构,包含系统调用汇编实现) | |-- bionic (由C实现的功能,架构无关) | |-- docs (文档) | |-- include (头文件) | |-- inet (?inet相关,具体作用不明) | |-- kernel (Linux内核中的一些头文件) | |-- netbsd (?nesbsd系统相关,具体作用不明) | |-- private (?一些私有的头文件) | |-- stdio (stdio实现) | |-- stdlib (stdlib实现) | |-- string (string函数实现) | |-- tools (几个工具) | |-- tzcode (时区相关代码) | |-- unistd (unistd实现) | `-- zoneinfo (时区信息) |-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能)|-- libm (libm数学库的实现,) | |-- alpha (apaha架构) | |-- amd64 (amd64架构) | |-- arm (arm架构) | |-- bsdsrc (?bsd的源码)

android源码分析精典

Android 2.1 源码结构分析 lee Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等基础开发包配置)|-- cts (Android兼容性测试套件标准) |-- dalvik (dalvik JAVA虚拟机) |-- development (应用程序开发相关) |-- external (android使用的一些开源的模组) |-- frameworks (核心框架——java及C++语言) |-- hardware (主要保护硬解适配层HAL代码) |-- out (编译完成后的代码输出与此目录) |-- packages (应用程序包) |-- prebuilt (x86和arm架构下预编译的一些资源) |-- sdk (sdk及模拟器) |-- system (文件系统库、应用及组件——C语言) `-- vendor (厂商定制代码) bionic 目录 |-- libc (C库) | |-- arch-arm (ARM架构,包含系统调用汇编实现) | |-- arch-x86 (x86架构,包含系统调用汇编实现) | |-- bionic (由C实现的功能,架构无关) | |-- docs (文档) | |-- include (头文件) | |-- inet (?inet相关,具体作用不明) | |-- kernel (Linux内核中的一些头文件) | |-- netbsd (?nesbsd系统相关,具体作用不明) | |-- private (?一些私有的头文件) | |-- stdio (stdio实现) | |-- stdlib (stdlib实现) | |-- string (string函数实现) | |-- tools (几个工具) | |-- tzcode (时区相关代码) | |-- unistd (unistd实现) | `-- zoneinfo (时区信息) |-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能) |-- libm (libm数学库的实现,) | |-- alpha (apaha架构) | |-- amd64 (amd64架构) | |-- arm (arm架构)

Android Galler2源码分析

图库Gallery2 Gallery2主要功能是实现本地存储器、MTP存储器和网络存储器中媒体(图像和视频)的浏览、显示和更多操作(删除、分享、选择和缩放等)。下面用一张简单的用例图描述了Gallery2的功能和职责。 Gallery 主要是4个页面的跳转: AlbumSetPage.Java(相册缩略图); AlbumPage.java(单个相册照片缩略图); PhotoPage.java(单张照片); SlideShowPage.java(幻灯片界面); 跳转过程: AlbumSetPage.Java→AlbumPage.java→PhotoPage.java SlideShowPage.java是单独的。 这些界面类父类为ActivityState.java;这些界面的切换由StateManager.java负责。 1 界面跳转过程: 在Galley2模块,我们先从程序的入口看起,在androidManifest.xml中注册Application标签(Android 系统会为每个程序运行时创建一个Application的类对象且仅创建一个,他的生命周期等于这个程序的生命周期,它是全局的单实例的,一般做一些全局的初始化操作),应用创建时就会被初始化,维护应用内部全局数据,主要看几个函数:initializeAsyncTask(), GalleryUtils.initialize(this),GalleryUtil是Gallery的工具类,获得了屏幕参数,WindowManager,Resource等

Gallery 从launcher进入Gallery,进入GalleryActivity.ava @Override protected void onCreate(Bundle savedInstanceState) { …... setContentView(https://www.doczj.com/doc/2e18970549.html,yout.main); if (savedInstanceState != null) { getStateManager().restoreFromState(savedInstanceState); } else { initializeByIntent(); } } private void initializeByIntent() { Intent intent = getIntent(); String action = intent.getAction(); if (Intent.ACTION_GET_CONTENT.equalsIgnoreCase(action)){ startGetContent(intent); } else if(Intent.ACTION_PICK.equalsIgnoreCase(action)) { // We do NOT really support the PICKintent. Handle it as // the GET_CONTENT. However, we needto translate the type // in the intent here. Log.w(TAG, "action PICK is notsupported"); String type =Utils.ensureNotNull(intent.getType()); if(type.startsWith("vnd.android.cursor.dir/")) { if(type.endsWith("/image")) intent.setType("image/*"); if(type.endsWith("/video")) intent.setType("video/*"); } startGetContent(intent);

Android系统分析

Android操作系统分析 穆英华 基于Linux内核的Android操作系统尽管非常年轻,却已经占领了智能手机9%的市场,而且还在向其它移动平台及嵌入式领域迅速扩张着。下图为2010年一季度的智能手机操作系统占有率统计。在国内外制造商纷纷推出基于Android的产品、Android Market中的应用程序飞速增长的背景下,有必要对Android操作系统的情况进行调研,对比其与Midinux的优劣势、估计其机遇或威胁。本文将从以下几个方面分析Android:目标用户群、支持硬件架构、平台技术架构、应用程序数量、未来发展方向。 一.目标用户群 覆盖高、中、低端智能手机用户是Android的主要目标,尤其是市场上基于ARM11处理器的智能手机已经降到1000元人民币的价格,让低成本的硬件配置也可以运行Android系统,更使得Android从中高端扩展到低端成为可能。除智能手机外,Android已经渗透到了平板电脑、上网本,乃至汽车电子、机顶盒、电子相册、无绳电话等各移动平台和嵌入式产品领域。 对于Android的智能手机和平板电脑用户,Android Market中种类丰富和数量众多的应用程序是其选择Android的重要原因,没有众多可选择的第三方应用程序,操作系统就是再性能优异,也不会对用户有任何杀伤力。这一点类似于苹果的iOS,但总体来说,Android 的用户不会像苹果用户那样忠诚、他们中的很大一部分也不会像苹果用户那样为数码产品花费那么多金钱,可以说Android更大众一些。 二. 支持硬件架构 1.支持的硬件架构 目前Android已经移植到了ARM、X86、M IP S各体系架构中的很多处理器核、处理器芯片、以及更多的板级结构上,对PPC等体系架构的移植也早已开始。如高通、三星等芯片制造商推出的基于ARM C ortex-A8处理器核及P o w er V R显示核心的处理器芯片早已移植Android成功,并被联想的Le Ph one、魅族的M9等许多手机采用,多核的C ortex-A9也蓄势待发。随着

最全的Android源码目录结构详解

最全的Android源码目录结构详解 收藏 转自http: 67."html Android 2."1 |-- Makefile |-- bionic(bionic C库) |-- bootable(启动引导相关代码) |-- build(存放系统编译规则及generic等基础开发包配置)|-- cts(Android 兼容性测试套件标准) |-- dalvik |-- development |-- external |-- frameworks |-- hardware |-- out |-- packages |-- prebuilt |-- sdk |-- system

`-- vendor bionic目录 |-- libc ||-- arch-arm ||-- arch-x86 ||-- bionic ||-- docs ||-- include ||-- kernel ||-- private ||-- stdio ||-- stdlib ||-- string ||-- tools ||-- tzcode ||-- unistd |`-- zoneinfo |-- libdl |-- libm ||-- alpha ||-- amd64(dalvik JAVA虚拟机)

(应用xx相关) (android使用的一些开源的模组) (核心框架——java及C++语言) (部分厂家开源的硬解适配层HAL代码) (编译完成后的代码输出与此目录) (应用程序包) (x86和arm架构下预编译的一些资源) (sdk及模拟器) (底层文件系统库、应用及组件——C语言)(厂商定制代码)(Cxx) ARM架构,包含系统调用汇编实现) x86架构,包含系统调用汇编实现) (由C实现的功能,架构无关) (文档) (头文件) (Linux内核中的一些头文件) (?nesbsd系统相关,具体作用不明) (?一些私有的头文件) (stdio实现) (stdlib实现) (string函数实现)

Android 5.0 Camera系统源码分析(5):Camera预览3A流程

Android 5.0 Camera系统源码分析(5):Camera预览3A流程 1. 前言 本文分析的是Android Hal层的源码,硬件平台基于mt6735。之前几篇讲的预览流程中3A 相关的环节都忽略了,现在重新整理下。 3A指的是Auto Exposure,Auto Focus,Auto White Balance。这三个一起放上来代码实在太多了,这里将重点记录AF的代码。AF的部分工作是由ISP完成的,而ISP的大部分代码mtk都没有开放给我们,比如ISP是如何计算得到对焦位置信息的,但得到对焦位置之后怎么操作对焦马达的代码我们是看得到的,所以涉及到ISP的一些代码将被略过 2. 初始化3A 3A的初始化在DefaultCam1Device的onInit函数里面开始,之前在camera打开流程里面已经提到过 bool DefaultCam1Device:: onInit() { ...... // (1) Open 3A mpHal3a = NS3A::IHal3A::createInstance( NS3A::IHal3A::E_Camera_1, getOpenId(), LOG_TAG); ...... } 构造一个Hal3A对象,看下Hal3A::createInstance的实现 Hal3A* Hal3A:: createInstance(MINT32 i4SensorDevId, MINT32 i4SensorOpenIndex) { switch (i4SensorDevId) { case SENSOR_DEV_MAIN: Hal3ADev::getInstance()->init(i4SensorDevId, i4SensorOpenIndex); return Hal3ADev::getInstance();

最全的Android源码目录结构详解

最全的Android源码目录结构详解收藏 转自https://www.doczj.com/doc/2e18970549.html,/a/android/2010/0622/67.html Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等基础开发包配置) |-- cts (Android兼容性测试套件标准) |-- dalvik (dalvik JAVA虚拟机) |-- development (应用程序开发相关) |-- external (android使用的一些开源的模组) |-- frameworks (核心框架——java及C++语言) |-- hardware (部分厂家开源的硬解适配层HAL代码) |-- out (编译完成后的代码输出与此目录) |-- packages (应用程序包) |-- prebuilt (x86和arm架构下预编译的一些资源) |-- sdk (sdk及模拟器) |-- system (底层文件系统库、应用及组件——C语言) `-- vendor (厂商定制代码) bionic 目录 |-- libc (C库) | |-- arch-arm (ARM架构,包含系统调用汇编实现) | |-- arch-x86 (x86架构,包含系统调用汇编实现) | |-- bionic (由C实现的功能,架构无关) | |-- docs (文档) | |-- include (头文件) | |-- inet (?inet相关,具体作用不明) | |-- kernel (Linux内核中的一些头文件) | |-- netbsd (?nesbsd系统相关,具体作用不明) | |-- private (?一些私有的头文件) | |-- stdio (stdio实现) | |-- stdlib (stdlib实现) | |-- string (string函数实现) | |-- tools (几个工具) | |-- tzcode (时区相关代码) | |-- unistd (unistd实现) | `-- zoneinfo (时区信息) |-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能)|-- libm (libm数学库的实现,) | |-- alpha (apaha架构) | |-- amd64 (amd64架构)

android天气预报源代码解析

通过google接口在Android中实现天气预报效果 Android可以通过google实现获取指定经纬度位置或者某一个城市的天气信息。如果是根据经纬度查询天气信息,需要对精度为进行转换,例如lat值为31.174165,需要过滤掉小数点,变为31174165传到接口中,维度也一样处理,处理后传 给https://www.doczj.com/doc/2e18970549.html,/ig/api?weather=,,,31174165,121433841既可以获取数据。这里要注意一个问题,如果大家获取的经纬度序列很长,直接去掉小数点,有时候也无法获取天气信息,例如40.478224838152528,124.97828006744385,去掉小数点后,传到参数位置,无法获取值,需要大家将经纬度按下面方式转换一下,只取小数点后6位就可以了。int latI = (int) (lat * 1E6); int lonI = (int) (lon * 1E6); 下面的例子演示了根据输入城市,获取该城市的天气预报,Weather.java的61行,是根据经纬度获取天气信息。 工程结构:

Weather.java类 package com.AndroidWeather; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import android.app.Activity; import android.graphics.Bitmap; import android.os.Bundle;

android应用程序源码结构分析

1、src文件夹存放源码。 2、gen下有跟src中一样的包文件,内部有一个名为R.java类,它是自动生成的一个类;该目录不用我们开发人员维护,但又非常重要的目录。该目录用来存放由Android 开发工具所生成的目录。该目录下的所有文件都不是我们创建的,而是由系统自动生成的。这个R,javav文件是只读类型,用户一般式不需要修改的! R.java 文件中默认有attr 、drawable 、layout 、string 等四个静态内部类,每个静态内部类分别对应一种资源,layout 静态内部类对应layout 中的界面文件main.xml,其中每个静态内部类中的静态常量分别定义一条资源标识符,如“ publicstatic final int main =0x7f030000; ” 用一个十六进制的数来代表常量,当开发者在res文件夹下添加或删除任何一个文件或一个属性,R.java都会随之进行更新! 3、android 2.3.3/ 文件夹表明了开发环境的版本,内部存放Android 自身的jar 包。 4、assets/该目录用来存放应用中用到的类似于视频文件、MP3 一些媒体文件。 5、res/ 该目录为资源目录。该目录可以存放一些应用图标、界面文件、应用中用到的文字信息等。 res/目录下有三个dawable 文件夹,区别只是将图标按分辨率高低来放入不同的目录中,drawable-hdpi存放高分辨率的图标,drawable-mdpi存放中等分辨率的图标, drawable-ldpi存放低分辨率的图标。程序运行时可以根据手机分辨率的高低选取相应目录下的图标。 值得注意的是: 如果是老版本的,比如是1.5版本的,res下的drawable文件夹只有一个,如需修改需要手动添加, res/目录下layout/的文件main.xml是布局文件, main.xml < LinearLayout xmlns:android = "https://www.doczj.com/doc/2e18970549.html,/apk/res/android" android:orientation = "vertical" android:layout_width = "fill_parent"

Android程序启动过程源码分析

Android应用程序启动过程源代码分析 分类:Android 2011-08-19 00:58 5447人阅读评论(40) 收藏举报 前文简要介绍了Android应用程序的Activity的启动过程。在Android系统中,应用程序是由Activity组成的,因此,应用程序的启动过程实际上就是应用程序中的默认Activity 的启动过程,本文将详细分析应用程序框架层的源代码,了解Android应用程序的启动过程。 在上一篇文章Android应用程序的Activity启动过程简要介绍和学习计划中,我们举例子说明了启动Android应用程序中的Activity的两种情景,其中,在手机屏幕中点击应用程序图标的情景就会引发Android应用程序中的默认Activity的启动,从而把应用程序启动起来。这种启动方式的特点是会启动一个新的进程来加载相应的Activity。这里,我们继续以这个例子为例来说明Android应用程序的启动过程,即MainActivity的启动过程。 MainActivity的启动过程如下图所示:

点击查看大图下面详细分析每一步是如何实现的。 Step 1. Launcher.startActivitySafely

在Android系统中,应用程序是由Launcher启动起来的,其实,Launcher本身也是一个应用程序,其它的应用程序安装后,就会Launcher的界面上出现一个相应的图标,点击这个图标时,Launcher就会对应的应用程序启动起来。 Launcher的源代码工程在packages/apps/Launcher2目录下,负责启动其它应用程序的源代码实现在src/com/android/launcher2/Launcher.java文件中: view plaincopy to clipboardprint? 1./** 2.* Default launcher application. 3.*/ 4.public final class Launcher extends Activity 5. implements View.OnClickListener, OnLongClickListener, LauncherMod el.Callbacks, AllAppsView.Watcher { 6. 7. ...... 8. 9. /** 10. * Launches the intent referred by the clicked shortcut. 11. * 12. * @param v The view representing the clicked shortcut. 13. */ 14. public void onClick(View v) { 15. Object tag = v.getTag(); 16. if (tag instanceof ShortcutInfo) { 17. // Open shortcut 18. final Intent intent = ((ShortcutInfo) tag).intent; 19. int[] pos = new int[2]; 20. v.getLocationOnScreen(pos); 21. intent.setSourceBounds(new Rect(pos[0], pos[1], 22. pos[0] + v.getWidth(), pos[1] + v.getHeight())); 23. startActivitySafely(intent, tag); 24. } else if (tag instanceof FolderInfo) { 25. ...... 26. } else if (v == mHandleView) {

Android锁屏与解屏相关代码分析

我觉得对于普通人来说,最常见的是Android解屏的界面,然后应该是Home 界面。今天就来分析一下解屏界面的相关代码(以索爱的解锁界面为例)。 首先看解屏的界面,我把解屏的界面分为两个部分,最上部是status Bar,下面是LockScreenSemc,在LockScreenSemc上有一个可供滑动解锁的界面,每个界面对应的类如图所示。

两个类所在包: com.Android.internal.policy.impl.LockScreenSemc.java com.Android.internal.widget.SlidingTabSemc.java SlidingTabSemc.java分析: 分析我们的Touch在SlidingTabSemc 上产生的效果,主要看onTouchEvent ()的处理。 ACTION_DOWN 时会调用disableButtonPress(),产生手指点击时的动画效果。 ACTION_MOVE 时会调用moveControl()产生图片跟随手指移动的效果。 ACTION_UP 时会判断移动的位置是否已经到了,可以触发Trigger的程度,如果到了,则调用dispatchTriggerEvent,通知在SlidingTabSemc上的Trigger Listener。由于SlidingTabSemc上的Trigger Listener是在LockScreenSemc里实现的,所以会代用到LockScreenSemc中。

LockScreenSemc.java分析: 代码中有一行:private SlidingTabSemc mSelector; 将SlidingTabSemc 作为它的一个属性值, 另外此类实现了SlidingTabSemc.OnTriggerListener。这个listener用来执行我们从左到右或者从右到左的滑动,在构造函数中有 mSelector.setOnTriggerListener(this);这样我们在SlidingTabSemc上的滑动会调用到public void onTrigger(View v, int whichHandle)方法中。 onTrigger的执行为两个分支,一个为从右滑向左,执行了mAudioManager.setRingerMode(),设置了声音的模式,并更新右边声音的图片。另一个为从左滑向右,执行的是mCallback.goToUnlockScreen();这个mCallback 是何方神圣呢?它是KeyguardScreenCallback类型,并且在LockScreenSemc初始化的时候传进来的,跟踪后我们发现,LockScreenSemc是类LockPatternKeyguardView的一个属性值(private View mLockScreen);KeyguardScreenCallback的实现在LockPatternKeyguardView中。 LockPatternKeyguardView中LockPatternKeyguardView的逻辑是,如果用户在设置->位置和安全->设置屏幕锁定中设置了解锁画面,则调用了updateScreen(Mode.UnlockScreen)进入相应的解锁画面,否则调用:getCallback().keyguardDone(true); 这个getCallback() 返回的是KeyguardViewMediator。 KeyguardViewMediator 中keyguardDone()方法,最终会给Handler发送KEYGUARD_DONE 的消息,Handler会执行handleKeyguardDone()方法,在方法中会调用handleHide(),这个函数会将我们的LockScreenSemc给隐藏。 总结:总体来说,上面提到的类基本上可以这么认为,SlidingTabSemc属于LockScreenSemc,LockScreenSemc属于LockPatternKeyguardView, LockPatternKeyguardView 属于KeyguardViewManager,KeyguardViewManager 来统管所有与锁解屏相关的操作,另外通过KeyguardViewMediator,来实现KeyguardViewManager和PhoneWindowManager之间的交互与通信,如图所示: 画面的更新实现

相关主题
文本预览
相关文档 最新文档