±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎĽéÉÜÁËÃÀÍÅÐÐÒµÊÕÒøÑз¢×éAndroidÍŶӵÄ×é¼þ»¯Êµ¼ù£¬ÒÔ¼°Òµ½çÊ×´´Ç¿Ô¼Êø×é¼þÏûÏ¢×ÜÏßmodular-eventµÄÔÀíºÍʹÓᣠ|
|
±³¾°
×é¼þ»¯×÷ΪAndroid¿Í»§¶Ë¼¼ÊõµÄÒ»¸öÖØÒª·ÖÖ§£¬½üÄêÀ´Ò»Ö±ÊÇÒµ½ç»ý¼«Ì½Ë÷ºÍʵ¼ùµÄ·½Ïò¡£ÃÀÍÅÄÚ²¿¸÷¸öAndroid¿ª·¢ÍŶÓÒ²ÔÚ³¢ÊÔºÍʵ¼ù²»Í¬µÄ×é¼þ»¯·½°¸£¬²¢ÇÒÔÚ×é¼þ»¯Í¨ÐÅ¿ò¼ÜÉÏÒ²Óкܶà¸ßÖÊÁ¿µÄ²ú³ö¡£×î½ü£¬ÎÒÃÇÍŶӶÔÃÀÍÅÁãÊÛÊÕÒøºÍÃÀÍÅÇáÊÕÒøÁ½¿îAndroid
App½øÐÐÁË×é¼þ»¯¸ÄÔì¡£±¾ÎÄÖ÷Òª½éÉÜÎÒÃǵÄ×é¼þ»¯·½°¸£¬Ï£Íû¶Ô´ÓÊÂAndroid×é¼þ»¯¿ª·¢µÄͬѧÄÜÓÐËùÆô·¢¡£
ΪʲôҪ×é¼þ»¯
½üÄêÀ´£¬ÎªÊ²Ã´Õâô¶àÍŶÓÒª½øÐÐ×é¼þ»¯Êµ¼ùÄØ£¿×é¼þ»¯¾¿¾¹ÄܸøÎÒÃǵŤ³Ì¡¢´úÂë´øÀ´Ê²Ã´ºÃ´¦£¿ÎÒÃÇÈÏΪ×é¼þ»¯Äܹ»´øÀ´Á½¸ö×î´óµÄºÃ´¦£º
Ìá¸ß×é¼þ¸´ÓÃÐÔ
¿ÉÄÜÓÐЩÈË»á¾õµÃ£¬Ìá¸ß¸´ÓÃÐԺܼòµ¥£¬Ö±½Ó°ÑÐèÒª¸´ÓõĴúÂë×ö³ÉAndroid Module£¬´ò°üAAR²¢ÉÏ´«´úÂë²Ö¿â£¬ÄÇôÕⲿ·Ö¹¦ÄܾÍÄܱ»·½±ãµØÒýÈëºÍʹÓᣵ«ÊÇÎÒÃǾõµÃ½ö½öÕâÑùÊDz»¹»µÄ£¬ÉÏ´«²Ö¿âµÄAAR¿âÊÇ·ñ·½±ã±»¸´Óã¬ÐèÒª×é¼þ»¯µÄ¹æÔòÀ´Ô¼Êø£¬ÕâÑù²ÅÄÜÌá¸ß¸´Óõıã½ÝÐÔ¡£
½µµÍ×é¼þ¼äµÄñîºÏ
ÎÒÃÇÐèҪͨ¹ý×é¼þ»¯µÄ¹æÔò°Ñ´úÂë²ð·Ö³É²»Í¬µÄÄ£¿é£¬Ä£¿éÒª×öµ½¸ßÄÚ¾Û¡¢µÍñîºÏ¡£Ä£¿é¼äÒ²²»ÄÜÖ±½Óµ÷Óã¬ÕâÐèÒª×é¼þ»¯Í¨ÐÅ¿ò¼ÜµÄÖ§³Ö¡£½µµÍÁË×é¼þ¼äµÄñîºÏÐÔ¿ÉÒÔ´øÀ´Á½µãÖ±½ÓµÄºÃ´¦£ºµÚÒ»£¬´úÂë¸ü±ãÓÚά»¤£»µÚ¶þ£¬½µµÍÁËÄ£¿éµÄBugÂÊ¡£
×é¼þ»¯Ö®Ç°µÄ״̬
ÎÒÃǵÄÄ¿±êÊÇÒª¶ÔÍŶӵÄÁ½¿îApp£¨ÃÀÍÅÁãÊÛÊÕÒø¡¢ÃÀÍÅÇáÊÕÒø£©½øÐÐ×é¼þ»¯Öع¹£¬ÄÇôÕâÀïÏȼòµ¥µØ½éÉÜÒ»ÏÂÕâÁ½¿îÓ¦Óõļܹ¹¡£×ܵÄÀ´Ëµ£¬ÕâÁ½¿îÓ¦ÓõĹ¹¼Ü±È½ÏÏàËÆ£¬Ö÷¹¤³ÌModuleÒÀÀµBusiness
Module£¬Business ModuleÊǸ÷ÖÖÒµÎñ¹¦Äܵļ¯ºÏ£¬Business ModuleÒÀÀµService
Module£¬Service ModuleÒÀÀµPlatform Module£¬Service ModuleºÍPlatform
Module¶¼¶ÔÉϲãÌṩ·þÎñ£¬ÓÐËù²»Í¬µÄÊÇPlatform ModuleÌṩµÄ·þÎñ¸üΪ»ù´¡£¬Ö÷Òª°üÀ¨Ò»Ð©¹¤¾ßUtilsºÍ½çÃæWidget£¬¶øService
ModuleÌṩ¸÷ÖÖ¹¦ÄÜ·þÎñ£¬ÈçKNB¡¢Î»Ö÷þÎñ¡¢ÍøÂç½Ó¿Úµ÷Óõȡ£ÕâÑùµÄ»°£¬Business Module¾Í±äµÃ·Ç³£Ó·Ö׺ͷ±ÔÓ£¬¸÷ÖÖÒµÎñÄ£¿éÏ໥µ÷Óã¬ñîºÏÐÔºÜÇ¿£¬¸ÄÒµÎñ´úÂëʱÈÝÒס°Ç£Ò»·¢¶ø¶¯È«Éí¡±£¬¼´Ê¹¸ÄһС¿éÒµÎñ´úÂ룬¿ÉÄÜÒªÁ¬´øÐ޸ĺܶàÏà¹ØµÄµØ·½£¬²»½öÔÚ´úÂë²ãÃæ²»ÀûÓÚ½øÐÐά»¤£¬¶øÇÒ¶ÔÒ»¸öÒµÎñµÄÐ޸ĺÜÈÝÒ×Ôì³ÉÆäËûÒµÎñ²úÉúBug¡£

×é¼þ»¯·½°¸µ÷ÑÐ
ΪÁ˵õ½×îÊʺÏÎÒÃÇҵ̬ºÍ¹¹¼ÜµÄ×é¼þ»¯·½°¸£¬ÎÒÃǵ÷ÑÐÁËÒµ½ç¿ªÔ´µÄһЩ×é¼þ»¯·½°¸ºÍ¹«Ë¾ÄÚ²¿ÆäËûÍŶӵÄ×é¼þ»¯·½°¸£¬ÔÚ´Ë×ö¸ö×ܽᡣ
¿ªÔ´×é¼þ»¯·½°¸µ÷ÑÐ
ÎÒÃǵ÷ÑÐÁËÒµ½çһЩÖ÷Á÷µÄ¿ªÔ´×é¼þ»¯·½°¸¡£ CC
ºÅ³ÆÒµ½çÊ׸öÖ§³Ö½¥½øÊ½×é¼þ»¯¸ÄÔìµÄAndroid×é¼þ»¯¿ªÔ´¿ò¼Ü¡£ÎÞÂÛÒ³ÃæÌø×ª»¹ÊÇ×é¼þ¼äµ÷Ó㬶¼²ÉÓÃCCͳһµÄ×é¼þµ÷Ó÷½Ê½Íê³É¡£ DDComponentForAndroid
µÃµ½µÄ·½°¸²ÉÓ÷ÓÉ + ½Ó¿ÚϳÁµÄ·½Ê½£¬ËùÓнӿÚϳÁµ½baseÖУ¬×é¼þÖÐʵÏÖ½Ó¿Ú²¢ÔÚIApplicationLikeÖÐÌí¼Ó´úÂë×¢²áµ½RouterÖС£ ModularizationArchitecture
×é¼þ¼äµ÷ÓÃÐèÖ¸¶¨Í¬²½ÊµÏÖ»¹ÊÇÒ첽ʵÏÖ£¬µ÷ÓÃ×é¼þʱͳһÄõ½RouterResponse×÷Ϊ·µ»ØÖµ£¬Í¬²½µ÷ÓõÄʱºòÓÃRouterResponse.getData()À´»ñÈ¡½á¹û£¬Òì²½µ÷ÓûñȡʱÐèÒª×Ô¼ºÎ¬»¤Ï̡߳£
ARouter
°¢ÀïÍÆ³öµÄ·ÓÉÒýÇæ£¬ÊÇÒ»¸ö·ÓÉ¿ò¼Ü£¬²¢²»ÊÇÍêÕûµÄ×é¼þ»¯·½°¸£¬¿É×÷Ϊ×é¼þ»¯¼Ü¹¹µÄͨÐÅÒýÇæ¡£
¾ÛÃÀRouter
¾ÛÃÀµÄ·ÓÉÒýÇæ£¬ÔÚ´Ë»ù´¡ÉÏÒ²ÓоÛÃÀµÄ×é¼þ»¯Êµ¼ù·½°¸£¬»ù±¾Ë¼ÏëÊDzÉÓ÷ÓÉ + ½Ó¿ÚϳÁµÄ·½Ê½ÊµÏÖ×é¼þ»¯¡£
ÃÀÍÅÆäËûÍŶÓ×é¼þ»¯·½°¸µ÷ÑÐ
ÃÀÍÅÊÕÒøComponentCenter
ÃÀÍÅÊÕÒøµÄ×é¼þ»¯·½°¸Ö§³Ö½Ó¿Úµ÷ÓúÍÏûÏ¢×ÜÏßÁ½ÖÖ·½Ê½£¬½Ó¿Úµ÷Óõķ½Ê½ÐèÒª¹¹½¨CCPData£¬È»ºóµ÷ÓÃComponentCenter.call£¬×îºóÔÚͳһµÄCallbackÖнøÐд¦Àí¡£ÏûÏ¢×ÜÏß·½Ê½Ò²ÐèÒª¹¹½¨CCPData£¬×îºóµ÷ÓÃComponentCenter.sendEvent·¢ËÍ¡£ÃÀÍÅÊÕÒøµÄÒµÎñ×é¼þ¶¼´ò°ü³ÉAARÉÏ´«ÖÁ²Ö¿â£¬×é¼þ¼ä´æÔÚÏ໥ÒÀÀµ£¬ÕâÑùµ¼ÖÂmainappÒýÓÃÕâЩ×é¼þʱÐèҪСÐĵØexcludeÒ»Ð©ÖØ¸´ÒÀÀµ¡£ÔÚÎÒÃǵÄ×é¼þ»¯·½°¸ÖУ¬ÎÒÃDzÉÓÃÁËÒ»ÖÖÇÉÃîµÄ·½·¨À´½â¾öÕâ¸öÎÊÌâ¡£
ÃÀÍÅApp ServiceLoader
ÃÀÍÅAppµÄ×é¼þ»¯·½°¸²ÉÓÃServiceLoaderµÄÐÎʽ£¬ÕâÊÇÒ»ÖÖµäÐ͵Ľӿڵ÷ÓÃ×é¼þͨÐÅ·½Ê½¡£ÓÃ×¢½â¶¨Òå·þÎñ£¬»ñÈ¡·þÎñʱȡµÃÒ»¸ö½Ó¿ÚµÄList£¬ÅжÏÕâ¸öListÊÇ·ñΪ¿Õ£¬Èç¹û²»Îª¿Õ£¬Ôò»ñÈ¡ÆäÖÐÒ»¸ö½Ó¿Úµ÷Óá£
WMRouter
ÃÀÍÅÍâÂôÍŶӿª·¢µÄÒ»¿îAndroid·ÓÉ¿ò¼Ü£¬»ùÓÚ×é¼þ»¯µÄÉè¼ÆË¼Â·¡£Ö÷ÒªÌṩ·ÓÉ¡¢ServiceLoaderÁ½´ó¹¦ÄÜ¡£WMRouterÌṩÁËʵÏÖ×é¼þ»¯µÄÁ½´ó»ù´¡ÉèÊ©¿ò¼Ü£ºÂ·ÓɺÍ×é¼þ¼ä½Ó¿Úµ÷Óá£Ö§³ÖºÍÎĵµÒ²ºÜ³ä·Ö£¬¿ÉÒÔ¿¼ÂÇ×÷ΪÎÒÃÇÍŶÓʵÏÖ×é¼þ»¯µÄ»ù´¡ÉèÊ©¡£
×é¼þ»¯·½°¸
×é¼þ»¯»ù´¡¿ò¼Ü
ÔÚǰÆÚµÄµ÷Ñй¤×÷ÖУ¬ÎÒÃÇ·¢ÏÖÍâÂôÍŶӵÄWMRouterÊÇÒ»¸ö²»´íµÄÑ¡Ôñ¡£Ê×ÏÈ£¬WMRouterÌṩÁË·ÓÉ+ServiceLoaderÁ½´ó×é¼þ¼äͨÐŹ¦ÄÜ£¬Æä´Î£¬WMRouter¼Ü¹¹ÇåÎú£¬À©Õ¹ÐԱȽϺ㬲¢ÇÒÎĵµºÍÖ§³ÖÒ²±È½ÏÍ걸¡£ËùÒÔÎÒÃǾö¶¨ÁËʹÓÃWMRouter×÷Ϊ×é¼þ»¯»ù´¡ÉèÊ©¿ò¼ÜÖ®Ò»¡£È»¶ø£¬Ö±½ÓʹÓÃWMRouterÓÐÁ½¸öÎÊÌ⣺
ÎÒÃǵÄÏîÄ¿ÒѾÔÚʹÓÃÒ»¸ö·ÓÉ¿ò¼Ü£¬Èç¹ûʹÓÃWMRouter£¬ÐèÒª°Ñ֮ǰʹÓõÄ·ÓÉ¿ò¼Ü¸Ä³ÉWMRouter·ÓÉ¿ò¼Ü¡£
WMRouterûÓÐÏûÏ¢×ÜÏß¿ò¼Ü£¬ÎÒÃǵ÷ÑÐµÄÆäËûÏîĿҲûÓÐÊʺÏÎÒÃÇÏîÄ¿µÄÏûÏ¢×ÜÏß¿ò¼Ü£¬Òò´ËÎÒÃÇÐèÒª¿ª·¢Ò»¸öÄܹ»Âú×ãÎÒÃÇÐèÇóµÄÏûÏ¢×ÜÏß¿ò¼Ü£¬Õⲿ·Ö»áÔÚºóÃæÏêϸÃèÊö¡£
×é¼þ»¯·Ö²ã½á¹¹
Ôڲο¼Á˲»Í¬µÄ×é¼þ»¯·½°¸Ö®ºó£¬ÎÒÃDzÉÓÃÁËÈçÏ·ֲã½á¹¹£º
App¿Ç¹¤³Ì£º¸ºÔð¹ÜÀí¸÷¸öÒµÎñ×é¼þºÍ´ò°üAPK£¬Ã»ÓоßÌåµÄÒµÎñ¹¦ÄÜ¡£
ÒµÎñ×é¼þ²ã£º¸ù¾Ý²»Í¬µÄÒµÎñ¹¹³É¶ÀÁ¢µÄÒµÎñ×é¼þ£¬ÆäÖÐÿ¸öÒµÎñ×é¼þ°üº¬Ò»¸öExport ModuleºÍImplement
Module¡£
¹¦ÄÜ×é¼þ²ã£º¶ÔÉϲãÌṩ»ù´¡¹¦ÄÜ·þÎñ£¬ÈçµÇ¼·þÎñ¡¢´òÓ¡·þÎñ¡¢ÈÕÖ¾·þÎñµÈ¡£
×é¼þ»ù´¡ÉèÊ©£º°üÀ¨WMRouter£¬Ìá¹©Ò³ÃæÂ·ÓÉ·þÎñºÍServiceLoader½Ó¿Úµ÷Ó÷þÎñ£¬ÒÔ¼°ºóÃæ»á½éÉܵÄ×é¼þÏûÏ¢×ÜÏß¿ò¼Ü£ºmodular-event¡£
ÕûÌå¼Ü¹¹ÈçÏÂͼËùʾ£º

ÒµÎñ×é¼þ²ð·Ö
ÎÒÃǵ÷ÑÐÆäËû×é¼þ»¯·½°¸µÄʱºò£¬·¢Ïֺܶà×é¼þ·½°¸¶¼ÊǰÑÒ»¸öÒµÎñÄ£¿é²ð·Ö³ÉÒ»¸ö¶ÀÁ¢µÄÒµÎñ×é¼þ£¬Ò²¾ÍÊDzð·Ö³ÉÒ»¸ö¶ÀÁ¢µÄModule¡£¶øÔÚÎÒÃǵķ½°¸ÖУ¬Ã¿¸öÒµÎñ×é¼þ¶¼²ð·Ö³ÉÁËÒ»¸öExport
ModuleºÍImplement Module£¬ÎªÊ²Ã´ÒªÕâÑù×öÄØ£¿
±ÜÃâÑ»·ÒÀÀµ
Èç¹û²ÉÓÃÒ»¸öÒµÎñ×é¼þÒ»¸öModuleµÄ·½Ê½£¬Èç¹ûModule AÐèÒªµ÷ÓÃModule BÌṩµÄ½Ó¿Ú£¬ÄÇôModule
A¾ÍÐèÒªÒÀÀµModule¡£Í¬Ê±£¬Èç¹ûModule BÐèÒªµ÷ÓÃModule AµÄ½Ó¿Ú£¬ÄÇôModule
B¾ÍÐèÒªÒÀÀµModule A¡£´Ëʱ¾Í»áÐγÉÒ»¸öÑ»·ÒÀÀµ£¬ÕâÊDz»ÔÊÐíµÄ¡£

Ò²ÐíÓÐЩ¶ÁÕß»á˵£¬Õâ¸öºÃ½â¾ö£º¿ÉÒÔ°ÑModule AºÍModule BÒªÒÀÀµµÄ½Ó¿Ú·Åµ½ÁíÒ»¸öModuleÖÐÈ¥£¬È»ºóÈÃModule
AºÍModule B¶¼È¥ÒÀÀµÕâ¸öModule¾Í¿ÉÒÔÁË¡£ÕâȷʵÊÇÒ»¸ö½â¾ö°ì·¨£¬²¢ÇÒÓÐЩÏîÄ¿×éÔÚʹÓÃÕâÖְѽӿÚϳÁµÄ·½·¨¡£
µ«ÊÇÎÒÃÇÏ£ÍûÒ»¸ö×é¼þµÄ½Ó¿Ú£¬ÊÇÓÉÕâ¸ö×é¼þ×Ô¼ºÌṩ£¬¶ø²»ÊÇ·ÅÔÚÒ»¸ö¸ü¼ÓϳÁµÄ½Ó¿ÚÀïÃæ£¬ËùÒÔÎÒÃDzÉÓÃÁ˰Ñÿ¸öÒµÎñ×é¼þ¶¼²ð·Ö³ÉÁËÒ»¸öExport
ModuleºÍImplement Module¡£ÕâÑùµÄ»°£¬Èç¹ûModule AÐèÒªµ÷ÓÃModule
BÌṩµÄ½Ó¿Ú£¬Í¬Ê±Module BÐèÒªµ÷ÓÃModule AµÄ½Ó¿Ú£¬Ö»ÐèÒªModule AÒÀÀµModule
B Export£¬Module BÒÀÀµModule A Export¾Í¿ÉÒÔÁË¡£

ÒµÎñ×é¼þÍêȫƽµÈ
ÔÚʹÓõ¥Module·½°¸µÄ×é¼þ»¯·½°¸ÖУ¬ÕâЩҵÎñ×é¼þÆäʵ²»ÊÇÍêȫƽµÈ£¬ÓÐЩ±»ÒÀÀµµÄ×é¼þÔڲ㼶ÉÏÒª¸üϳÁһЩ¡£µ«ÊDzÉÓÃExport
Module+Implement ModuleµÄ·½°¸£¬ËùÓÐÒµÎñ×é¼þÔڲ㼶ÉÏÍêȫƽµÈ¡£
¹¦ÄÜ»®·Ö¸ü¼ÓÇåÎú
ÿ¸öÒµÎñ×é¼þ¶¼»®·Ö³ÉÁËExport Module+Implement ModuleµÄģʽ£¬Õâ¸öʱºòÿ¸öModuleµÄ¹¦ÄÜ»®·ÖÒ²¸ü¼ÓÇåÎú¡£Export
ModuleÖ÷Òª¶¨Òå×é¼þÐèÒª¶ÔÍⱩ¶µÄ²¿·Ö£¬Ö÷Òª°üº¬£º
¶ÔÍⱩ¶µÄ½Ó¿Ú£¬ÕâЩ½Ó¿ÚÓÃWMRouterµÄServiceLoader½øÐе÷Óá£
¶ÔÍⱩ¶µÄʼþ£¬ÕâЩʼþÀûÓÃÏûÏ¢×ÜÏß¿ò¼Ümodular-event½øÐж©Ôĺͷַ¢¡£
×é¼þµÄRouter Path£¬×é¼þ»¯Ö®Ç°µÄ¹¤³ÌËäȻҲʹÓÃÁËRouter¿ò¼Ü£¬µ«ÊÇËùÓÐRouter Path¶¼ÊǶ¨ÒåÔÚÁËÒ»¸öϳÁModuleµÄ¹«ÓÐClassÖС£ÕâÑùµ¼ÖµÄÎÊÌâÊÇ£¬ÎÞÂÛÄĸöÄ£¿éÌí¼Ó/ɾ³ýÒ³Ãæ£¬»òÊÇÐ޸ķÓÉ£¬¶¼ÐèҪȥÐÞ¸ÄÕâ¸ö¹«ÓеÄClass¡£ÉèÏëÈç¹û×é¼þ»¯²ð·ÖÖ®ºó£¬Ä³¸ö×é¼þÐÂÔöÁËÒ³Ãæ£¬»¹ÒªÈ¥Ò»¸öÍⲿµÄJavaÎļþÖÐÐÂÔö·ÓÉ£¬ÕâÏÔÈ»ÄÑÒÔ½ÓÊÜ£¬Ò²²»·ûºÏ×é¼þ»¯ÄÚ¾ÛµÄÄ¿±ê¡£Òò´Ë£¬ÎÒÃǰÑÿ¸ö×é¼þµÄRouter
Path·ÅÔÚ×é¼þµÄExport ModuleÖУ¬¼È¿ÉÒÔ±©Â¶¸øÆäËû×é¼þ£¬Ò²¿ÉÒÔ×öµ½Ã¿¸ö×é¼þ¹ÜÀí×Ô¼ºµÄRouter
Path£¬²»»á³öÏÖËùÓÐ×é¼þÈ¥ÐÞ¸ÄÒ»¸öJavaÎļþµÄ¾½¾³¡£
Implement ModuleÊÇ×é¼þʵÏֵIJ¿·Ö£¬Ö÷Òª°üº¬£º
Ò³ÃæÏà¹ØµÄActivity¡¢Fragment£¬²¢ÇÒÓÃWMRouterµÄ×¢½â¶¨Òå·ÓÉ¡£
Export ModuleÖжÔÍⱩ¶µÄ½Ó¿ÚµÄʵÏÖ¡£
ÆäËûµÄÒµÎñÂß¼¡£
×é¼þ»¯ÏûÏ¢×ÜÏß¿ò¼Ümodular-event
ǰÎÄÌáµ½µÄʵÏÖ×é¼þ»¯»ù´¡ÉèÊ©¿ò¼ÜÖУ¬ÎÒÃÇÓÃÍâÂôÍŶӵÄWMRouterʵÏÖÒ³ÃæÂ·ÓɺÍ×é¼þ¼ä½Ó¿Úµ÷Ó㬵«ÊÇȴûÓÐÏûÏ¢×ÜÏߵĻù´¡¿ò¼Ü£¬Òò´Ë£¬ÎÒÃÇ×Ô¼º¿ª·¢ÁËÒ»¸ö×é¼þ»¯ÏûÏ¢×ÜÏß¿ò¼Ümodular-event¡£
ΪʲôÐèÒªÏûÏ¢×ÜÏß¿ò¼Ü
֮ǰ£¬ÎÒÃÇ¿ª·¢¹ýÒ»¸ö»ùÓÚLiveDataµÄÏûÏ¢×ÜÏß¿ò¼Ü£ºLiveDataBus¡£¹ØÓÚÏûÏ¢×ÜÏßµÄʹÓã¬×ÜÊǰéËæ×źܶàÕùÂÛ¡£ÓÐЩÈ˾õµÃÏûÏ¢×ÜÏߺܺÃÓã¬ÓÐЩÈ˾õµÃÏûÏ¢×ÜÏßÈÝÒ×±»ÀÄÓá£
¼ÈÈ»ÒѾÓÐÁËServiceLoaderÕâÖÖ×é¼þ¼ä½Ó¿Úµ÷ÓõĿò¼Ü£¬ÎªÊ²Ã´»¹ÐèÒªÏûÏ¢×ÜÏßÕâÖÖ·½Ê½ÄØ£¿Ö÷ÒªÓÐÁ½¸öÀíÓÉ£º
¸ü½øÒ»²½µÄ½âñî
»ùÓÚ½Ó¿Úµ÷ÓõÄServiceLoader¿ò¼ÜµÄȷʵÏÖÁ˽âñµ«ÊÇÏûÏ¢×ÜÏßÄܹ»ÊµÏÖ¸ü³¹µ×µÄ½âñî¡£½Ó¿Úµ÷Óõķ½Ê½µ÷Ó÷½ÐèÒªÒÀÀµÕâ¸ö½Ó¿Ú²¢ÇÒÖªµÀÄĸö×é¼þʵÏÖÁËÕâ¸ö½Ó¿Ú¡£ÏûÏ¢×ÜÏß·½Ê½·¢ËÍÕßÖ»ÐèÒª·¢ËÍÒ»¸öÏûÏ¢£¬¸ù±¾²»ÓùØÐÄÊÇ·ñÓÐÈ˶©ÔÄÕâ¸öÏûÏ¢£¬ÕâÑù·¢ËÍÕ߸ù±¾²»ÐèÒªÁ˽âÆäËû×é¼þµÄÇé¿ö£¬ºÍÆäËû×é¼þµÄñîºÏÒ²¾ÍÔ½ÉÙ¡£
¶à¶Ô¶àµÄͨÐÅ
»ùÓڽӿڵķ½Ê½Ö»ÄܽøÐÐÒ»¶ÔÒ»µÄµ÷Ó㬻ùÓÚÏûÏ¢×ÜÏߵķ½Ê½Äܹ»Ìṩ¶à¶Ô¶àµÄͨÐÅ¡£
ÏûÏ¢×ÜÏßµÄÓŵãºÍȱµã
×ܵÄÀ´Ëµ£¬ÏûÏ¢×ÜÏß×î´óµÄÓŵã¾ÍÊǽâñÒò´ËºÜÊʺÏ×é¼þ»¯ÕâÖÖÐèÒª¶Ô×é¼þ¼ä½øÐг¹µ×½âñîµÄ³¡¾°¡£È»¶ø£¬ÏûÏ¢×ÜÏß±»ºÜ¶àÈËÚ¸²¡µÄÖØÒªÔÒò£¬Ò²È·ÊµÊÇÒòΪÏûÏ¢×ÜÏßÈÝÒ×±»ÀÄÓá£ÏûÏ¢×ÜÏßÈÝÒ×±»ÀÄÓÃÒ»°ãÌåÏÖÔÚ¼¸¸ö³¡¾°£º
ÏûÏ¢ÄÑÒÔËÝÔ´
ÓÐʱºòÎÒÃÇÔÚÔĶÁ´úÂëµÄ¹ý³ÌÖУ¬ÕÒµ½Ò»¸ö¶©ÔÄÏûÏ¢µÄµØ·½£¬ÏëÒª¿´¿´ÊÇË·¢ËÍÁËÕâ¸öÏûÏ¢£¬Õâ¸öʱºòÍùÍùÖ»ÄÜͨ¹ý²éÕÒÏûÏ¢µÄ·½Ê½È¥¡°ËÝÔ´¡±¡£µ¼ÖÂÎÒÃÇÔÚÔĶÁ´úÂ룬ÊáÀíÂß¼µÄ¹ý³Ì²»Ì«Á¬¹á£¬ÓÐÖÖ±»¸îÁѵĸоõ¡£
ÏûÏ¢·¢ËͱȽÏËæÒ⣬ûÓÐÇ¿ÖÆµÄÔ¼Êø
ÏûÏ¢×ÜÏßÔÚ·¢ËÍÏûÏ¢µÄʱºòÒ»°ãûÓÐÇ¿ÖÆµÄÔ¼Êø¡£ÎÞÂÛÊÇEventBus¡¢RxBus»òÊÇLiveDataBus£¬ÔÚ·¢ËÍÏûÏ¢µÄʱºò¼ÈûÓжÔÏûÏ¢½øÐмì²é£¬Ò²Ã»ÓжԷ¢Ë͵÷ÓýøÐÐÔ¼Êø¡£ÕâÖÖ²»¹æ·¶ÐÔÔÚÌØ¶¨µÄʱ¿Ì£¬ÉõÖÁ»á´øÀ´ÔÖÄÑÐԵĺó¹û¡£±ÈÈç¶©ÔÄ·½¶©ÔÄÁËÒ»¸öÃûΪlogin_successµÄÏûÏ¢£¬±àд·¢ËÍÏûÏ¢µÄÊÇÒ»¸ö±È½ÏËæÒâµÄ³ÌÐòÔ±£¬Ã»ÓаÑÕâ¸öÏûÏ¢¶¨Òå³ÉÈ«¾Ö±äÁ¿£¬¶øÊǶ¨ÒåÁËÒ»¸öÁÙʱ±äÁ¿String·¢ËÍÕâ¸öÏûÏ¢¡£²»ÐÒµÄÊÇ£¬Ëû°ÑÏûÏ¢Ãû³Ælogin_successƴд³ÉÁËlogin_seccess¡£ÕâÑùµÄ»°£¬¶©ÔÄ·½ÓÀÔ¶½ÓÊÕ²»µ½µÇ¼³É¹¦µÄÏûÏ¢£¬¶øÇÒÕâ¸ö´íÎóÒ²ºÜÄѱ»·¢ÏÖ¡£
×é¼þ»¯ÏûÏ¢×ÜÏßµÄÉè¼ÆÄ¿±ê
ÏûÏ¢ÓÉ×é¼þ×Ô¼º¶¨Òå
ÒÔǰÎÒÃÇÔÚʹÓÃÏûÏ¢×ÜÏßʱ£¬Ï²»¶°ÑËùÓеÄÏûÏ¢¶¼¶¨Òåµ½Ò»¸ö¹«¹²µÄJavaÎļþÀïÃæ¡£µ«ÊÇ×é¼þ»¯Èç¹ûÒ²²ÉÓÃÕâÖÖ·½°¸µÄ»°£¬Ò»µ©Ä³¸ö×é¼þµÄÏûÏ¢·¢Éú±ä¶¯£¬¶¼»áÈ¥ÐÞ¸ÄÕâ¸öJavaÎļþ¡£ËùÒÔÎÒÃÇÏ£ÍûÓÉ×é¼þ×Ô¼ºÀ´¶¨ÒåºÍά»¤ÏûÏ¢¶¨ÒåÎļþ¡£
Çø·Ö²»Í¬×é¼þ¶¨ÒåµÄͬÃûÏûÏ¢
Èç¹ûÏûÏ¢ÓÉ×é¼þ¶¨ÒåºÍά»¤£¬ÄÇôÓпÉÄܲ»Í¬×é¼þ¶¨ÒåÁËÖØÃûµÄÏûÏ¢£¬ÏûÏ¢×ÜÏß¿ò¼ÜÐèÒªÄܹ»Çø·ÖÕâÖÖÏûÏ¢¡£
½â¾öǰÎÄÌáµ½µÄÏûÏ¢×ÜÏßµÄȱµã
½â¾öÏûÏ¢×ÜÏßÏûÏ¢ÄÑÒÔËÝÔ´ºÍÏûÏ¢·¢ËÍûÓÐÔ¼ÊøµÄÎÊÌâ¡£
»ùÓÚLiveDataµÄÏûÏ¢×ÜÏß
×é¼þ»¯ÏûÏ¢×ÜÏß¿ò¼Ümodular-eventͬÑù»á»ùÓÚLiveData¹¹½¨¡£Ê¹ÓÃLiveData¹¹½¨ÏûÏ¢×ÜÏßÓкܶàÓŵ㣺
ʹÓÃLiveData¹¹½¨ÏûÏ¢×ÜÏß¾ßÓÐÉúÃüÖÜÆÚ¸ÐÖªÄÜÁ¦£¬Ê¹ÓÃÕß²»ÐèÒªµ÷Ó÷´×¢²á£¬Ïà±ÈEventBusºÍRxBusʹÓøüΪ·½±ã£¬²¢ÇÒûÓÐÄÚ´æÐ¹Â©·çÏÕ¡£
ʹÓÃÆÕͨÏûÏ¢×ÜÏߣ¬Èç¹û»Øµ÷µÄʱºòActivity´¦ÓÚStop״̬£¬Õâ¸öʱºò½øÐе¯DialogÒ»ÀàµÄ²Ù×÷¾Í»áÒýÆð±ÀÀ£¡£Ê¹ÓÃLiveData¹¹½¨ÏûÏ¢×ÜÏßÍêȫûÓÐÕâ¸ö·çÏÕ¡£
×é¼þÏûÏ¢×ÜÏßmodular-eventµÄʵÏÖ
½â¾ö²»Í¬×é¼þ¶¨ÒåÁËÖØÃûÏûÏ¢µÄÎÊÌâ
ÆäʵÕâ¸öÎÊÌ⻹ÊDZȽϺýâ¾öµÄ£¬ÊµÏֵķ½Ê½¾ÍÊDzÉÓÃÁ½¼¶HashMapµÄ·½Ê½½â¾ö¡£µÚÒ»¼¶HashMapµÄ¹¹½¨ÒÔModuleName×÷ΪKey£¬µÚ¶þ¼¶HashMap×÷ΪValue£»µÚ¶þ¼¶HashMapÒÔÏûÏ¢Ãû³ÆEventName×÷ΪKey£¬LiveData×÷ΪValue¡£²éÕÒµÄʱºòÏÈÓÃ×é¼þÃû³ÆModuleNameÔÚµÚÒ»¼¶HashMapÖвéÕÒ£¬Èç¹ûÕÒµ½ÔòÓÃÏûÏ¢ÃûEventNameÔÚµÚ¶þ¼¶HashNameÖвéÕÒ¡£Õû¸ö½á¹¹ÈçÏÂͼËùʾ£º

¶ÔÏûÏ¢×ÜÏßµÄÔ¼Êø
ÎÒÃÇÏ£ÍûÏûÏ¢×ÜÏß¿ò¼ÜÓÐÒÔÏÂÔ¼Êø£º
Ö»Äܶ©Ôĺͷ¢ËÍÔÚ×é¼þÖÐÔ¤¶¨ÒåµÄÏûÏ¢¡£»»¾ä»°Ëµ£¬Ê¹ÓÃÕß²»ÄÜ·¢ËͺͶ©ÔÄÁÙʱÏûÏ¢¡£
ÏûÏ¢µÄÀàÐÍÐèÒªÔÚ¶¨ÒåµÄʱºòÖ¸¶¨¡£
¶¨ÒåÏûÏ¢µÄʱºòÐèÒªÖ¸¶¨ÊôÓÚÄĸö×é¼þ¡£
ÈçºÎʵÏÖÕâÐ©Ô¼Êø
ÔÚÏûÏ¢¶¨ÒåÎļþÉÏʹÓÃ×¢½â£¬¶¨ÒåÏûÏ¢µÄÀàÐͺÍÏûÏ¢ËùÊôModule¡£
¶¨Òå×¢½â´¦ÀíÆ÷£¬ÔÚ±àÒëÆÚ¼äÊÕ¼¯ÏûÏ¢µÄÏà¹ØÐÅÏ¢¡£
ÔÚ±àÒëÆ÷¸ù¾ÝÏûÏ¢µÄÐÅÏ¢Éú³Éµ÷ÓÃʱÐèÒªµÄinterface£¬ÓýӿÚÔ¼ÊøÏûÏ¢·¢ËͺͶ©ÔÄ¡£
ÔËÐÐʱ¹¹½¨»ùÓÚÁ½¼¶HashMapµÄLiveData´æ´¢½á¹¹¡£
ÔËÐÐʱ²ÉÓÃinterface+¶¯Ì¬´úÀíµÄ·½Ê½ÊµÏÖÕæÕýµÄÏûÏ¢¶©Ôĺͷ¢ËÍ¡£
Õû¸öÁ÷³ÌÈçÏÂͼËùʾ£º

ÏûÏ¢×ÜÏßmodular-eventµÄ½á¹¹
modular-event-base£º¶¨ÒåAnotation¼°ÆäËû»ù±¾ÀàÐÍ
modular-event-core£ºmodular-eventºËÐÄʵÏÖ
modular-event-compiler£º×¢½â´¦ÀíÆ÷
modular-event-plugin£ºGradle Plugin
Anotation
@ModuleEvents£ºÏûÏ¢¶¨Òå
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface ModuleEvents {
String module() default "";
} |
@EventType£ºÏûÏ¢ÀàÐÍ
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.FIELD)
public @interface EventType {
Class value();
} |
ÏûÏ¢¶¨Òå
ͨ¹ý@ModuleEvents×¢½âÒ»¸ö¶¨ÒåÏûÏ¢µÄJavaÀ࣬Èç¹û@ModuleEventsÖ¸¶¨ÁËÊôÐÔmodule£¬ÄÇôÕâ¸ömoduleµÄÖµ¾ÍÊÇÕâ¸öÏûÏ¢ËùÊôµÄModule£¬Èç¹ûûÓÐÖ¸¶¨ÊôÐÔmodule£¬Ôò»á°Ñ¶¨ÒåÏûÏ¢µÄJavaÀàËùÔڵİüµÄ°üÃû×÷ΪÏûÏ¢ËùÊôµÄModule¡£
ÔÚÕâ¸öÏûÏ¢¶¨ÒåjavaÀàÖж¨ÒåµÄÏûÏ¢¶¼ÊÇpublic static
final StringÀàÐÍ¡£¿ÉÒÔͨ¹ý@EventTypeÖ¸¶¨ÏûÏ¢µÄÀàÐÍ£¬@EventTypeÖ§³ÖjavaÔÉúÀàÐÍ»ò×Ô¶¨ÒåÀàÐÍ£¬Èç¹ûûÓÐÓÃ@EventTypeÖ¸¶¨ÏûÏ¢ÀàÐÍ£¬ÄÇôÏûÏ¢µÄÀàÐÍĬÈÏΪObject£¬ÏÂÃæÊÇÒ»¸öÏûÏ¢¶¨ÒåµÄʾÀý£º
//¿ÉÒÔÖ¸¶¨module£¬Èô²»Ö¸¶¨£¬ÔòʹÓðüÃû×÷ΪmoduleÃû
@ModuleEvents()
public class DemoEvents {
//²»Ö¸¶¨ÏûÏ¢ÀàÐÍ£¬ÄÇôÏûÏ¢µÄÀàÐÍĬÈÏΪObject
public static final String EVENT1 = "event1";
//Ö¸¶¨ÏûÏ¢ÀàÐÍΪ×Ô¶¨ÒåBean
@EventType(TestEventBean.class)
public static final String EVENT2 = "event2";
//Ö¸¶¨ÏûÏ¢ÀàÐÍΪjavaÔÉúÀàÐÍ
@EventType(String.class)
public static final String EVENT3 = "event3";
} |
interface×Ô¶¯Éú³É
ÎÒÃÇ»áÔÚmodular-event-compilerÖд¦ÀíÕâЩע½â£¬Ò»¸ö¶¨ÒåÏûÏ¢µÄJavaÀà»áÉú³ÉÒ»¸ö½Ó¿Ú£¬Õâ¸ö½Ó¿ÚµÄÃüÃûÊÇEventsDefineOf+ÏûÏ¢¶¨ÒåÀàÃû£¬ÀýÈçÏûÏ¢¶¨ÒåÀàµÄÀàÃûΪDemoEvents£¬×Ô¶¯Éú³ÉµÄ½Ó¿Ú¾ÍÊÇEventsDefineOfDemoEvents¡£ÏûÏ¢¶¨ÒåÀàÖж¨ÒåµÄÿһ¸öÏûÏ¢£¬¶¼»áת»¯³É½Ó¿ÚÖеÄÒ»¸ö·½·¨¡£Ê¹ÓÃÕßÖ»ÄÜͨ¹ýÕâЩ×Ô¶¯Éú³ÉµÄ½Ó¿ÚʹÓÃÏûÏ¢×ÜÏß¡£ÎÒÃÇÓÃÕâÖÖÇÉÃîµÄ·½Ê½ÊµÏÖÁ˶ÔÏûÏ¢×ÜÏßµÄÔ¼Êø¡£Ç°ÎÄÌáµ½µÄÄǸöÏûÏ¢¶¨ÒåʾÀýDemoEvents.java»áÉú³ÉÒ»¸öÈçϵĽӿÚÀࣺ
package com.sankuai.erp.modularevent. generated.com.meituan.jeremy.module_b_export;
public interface EventsDefineOfDemoEvents extends
com.sankuai.erp.modularevent.base.IEventsDefine
{
com.sankuai.erp.modularevent.Observable<java.lang. Object>
EVENT1();
com.sankuai.erp.modularevent.Observable<com.meituan. jeremy.module_b_export.TestEventBean>
EVENT2(
);
com.sankuai.erp.modularevent.Observable<java. lang.String>
EVENT3();
} |
¹ØÓÚ½Ó¿ÚÀàµÄ×Ô¶¯Éú³É£¬ÎÒÃDzÉÓÃÁËsquare/javapoetÀ´ÊµÏÖ£¬ÍøÉϽéÉÜJavaPoetµÄÎÄÕºܶ࣬ÕâÀï¾Í²»ÔÙÀÛÊö¡£
ʹÓö¯Ì¬´úÀíʵÏÖÔËÐÐʱµ÷ÓÃ
ÓÐÁË×Ô¶¯Éú³ÉµÄ½Ó¿Ú£¬¾ÍÏ൱ÓÚÓÐÁËÒ»¸ö¿Ç£¬È»¶ø¿ÇÏÂÃæµÄËùÓÐÂß¼£¬ÎÒÃÇͨ¹ý¶¯Ì¬´úÀíÀ´ÊµÏÖ£¬¼òµ¥½éÉÜһϴúÀíģʽºÍ¶¯Ì¬´úÀí£º
´úÀíģʽ£º
¸øÄ³¸ö¶ÔÏóÌṩһ¸ö´úÀí¶ÔÏ󣬲¢ÓÉ´úÀí¶ÔÏó¿ØÖƶÔÓÚÔ¶ÔÏóµÄ·ÃÎÊ£¬¼´¿Í»§²»Ö±½Ó²Ù¿ØÔ¶ÔÏ󣬶øÊÇͨ¹ý´úÀí¶ÔÏó¼ä½ÓµØ²Ù¿ØÔ¶ÔÏó¡£
¶¯Ì¬´úÀí£º
´úÀíÀàÊÇÔÚÔËÐÐʱÉú³ÉµÄ¡£Ò²¾ÍÊÇ˵Java±àÒëÍêÖ®ºó²¢Ã»ÓÐʵ¼ÊµÄclassÎļþ£¬¶øÊÇÔÚÔËÐÐʱ¶¯Ì¬Éú³ÉµÄÀà×Ö½ÚÂ룬²¢¼ÓÔØµ½JVMÖС£
ÔÚ¶¯Ì¬´úÀíµÄInvocationHandlerÖÐʵÏÖ²éÕÒÂß¼£º
¸ù¾ÝinterfaceµÄtypenameµÃµ½ModuleName¡£
µ÷Óõķ½·¨µÄmethodname¼´ÎªÏûÏ¢Ãû¡£
¸ù¾ÝModuleNameºÍÏûÏ¢ÃûÕÒµ½ÏàÓ¦µÄLiveData¡£
Íê³ÉºóÐø¶©ÔÄÏûÏ¢»òÕß·¢ËÍÏûÏ¢µÄÁ÷³Ì¡£
ÏûÏ¢µÄ¶©Ôĺͷ¢ËÍ¿ÉÒÔÓÃÁ´Ê½µ÷Óõķ½Ê½±àÂ룺
¶©ÔÄÏûÏ¢
ModularEventBus
.get()
.of(EventsDefineOfModuleBEvents.class)
.EVENT1()
.observe(this, new Observer<TestEventBean>()
{
@Override
public void onChanged(@Nullable TestEventBean
testEventBean) {
Toast.makeText(MainActivity.this, "MainActivityÊÕµ½×Ô¶¨ÒåÏûÏ¢:
" + testEventBean.getMsg(),
Toast.LENGTH_SHORT).show();
}
}); |
·¢ËÍÏûÏ¢
ModularEventBus
.get()
.of(EventsDefineOfModuleBEvents.class)
.EVENT1()
.setValue(new TestEventBean("aa")); |
¶©Ôĺͷ¢Ë͵Äģʽ
¶©ÔÄÏûÏ¢µÄģʽ
observe£ºÉúÃüÖÜÆÚ¸ÐÖª£¬onDestroyµÄʱºò×Ô¶¯È¡Ïû¶©ÔÄ¡£
observeSticky£ºÉúÃüÖÜÆÚ¸ÐÖª£¬onDestroyµÄʱºò×Ô¶¯È¡Ïû¶©ÔÄ£¬Stickyģʽ¡£
observeForever£ºÐèÒªÊÖ¶¯È¡Ïû¶©ÔÄ¡£
observeStickyForever£ºÐèÒªÊÖ¶¯È¡Ïû¶©ÔÄ£¬Stickyģʽ¡£
·¢ËÍÏûÏ¢µÄģʽ
setValue£ºÖ÷Ï̵߳÷Óá£
postValue£ººǫ́Ï̵߳÷Óá£
×é¼þ»¯×ܽá
±¾ÎĽéÉÜÁËÃÀÍÅÐÐÒµÊÕÒøÑз¢×éAndroidÍŶӵÄ×é¼þ»¯Êµ¼ù£¬ÒÔ¼°Òµ½çÊ×´´Ç¿Ô¼Êø×é¼þÏûÏ¢×ÜÏßmodular-eventµÄÔÀíºÍʹÓá£ÎÒÃÇÍŶӺÜÔç֮ǰ¾ÍÔÚ̽Ë÷×é¼þ»¯¸ÄÔ죬ǰÆÚÓÐЩ·½°¸ÔÚÂ䵨µÄʱºòÓöµ½ºÜ¶àÀ§ÄÑ¡£ÎÒÃÇÒ²Ñо¿Á˺ܶ࿪ԴµÄ×é¼þ»¯·½°¸£¬ÒÔ¼°¹«Ë¾ÄÚ²¿ÆäËûÍŶӣ¨ÃÀÍÅApp¡¢ÃÀÍÅÍâÂô¡¢ÃÀÍÅÊÕÒøµÈ£©µÄ×é¼þ»¯·½°¸£¬Ñ§Ï°ºÍ½è¼øÁ˺ܶàÓÅÐãµÄÉè¼ÆË¼Ï룬µ±È»Ò²²È¹ý²»ÉٵĿӡ£ÎÒÃÇÖð½¥Òâʶµ½£ºÈκÎÒ»ÖÖ×é¼þ»¯·½°¸¶¼ÓÐÆäÊÊÓó¡¾°£¬ÎÒÃǵÄ×é¼þ»¯¼Ü¹¹Ñ¡Ôñ£¬Ó¦¸Ã¸ü¼ÓÃæÏòÒµÎñ£¬¶ø²»½ö½öÊÇÃæÏò¼¼Êõ±¾Éí¡£
ºóÆÚ¹¤×÷Õ¹Íû
ÎÒÃǵÄ×é¼þ»¯¸ÄÔ칤×÷ԶԶûÓнáÊø£¬Î´À´¿ÉÄÜ»áÔÚÒÔϼ¸¸ö·½Ïò¼ÌÐø½øÐÐÉîÈëµÄÑо¿£º
×é¼þ¹ÜÀí£º×é¼þ»¯¸ÄÔìÖ®ºó£¬Ã¿¸ö×é¼þÊǸö¶ÀÁ¢µÄ¹¤³Ì£¬×é¼þÒ²»áµü´ú¿ª·¢£¬ÈçºÎ¶ÔÕâЩ×é¼þ½øÐа汾»¯¹ÜÀí¡£
×é¼þÖØÓãºÏÖÔÚ¿´ÆðÀ´¶ÔÕâЩ×é¼þµÄÖØÓÃÊǺܷ½±ãµÄ£¬Ö»ÐèÒªÒýÈë×é¼þµÄ¿â¼´¿É£¬µ«ÊÇÈç¹ûÒ»¸öеÄÏîÄ¿µ½À´£¬ÐèÇóÓÐЩ±ä»¯£¬ÎÒÃÇÓ¦¸ÃÔõÑù×î´óÏ޶ȵÄÖØÓÃÕâЩ×é¼þ¡£
CI¼¯³É£ºÈçºÎ¸üºÃµÄÓëCI¼¯³É¡£
¼¯³Éµ½½ÅÊּܣº¼¯³Éµ½½ÅÊּܣ¬ÈÃеÄÏîÄ¿´ÓÒ»¿ªÊ¼¾ÍÒÔ×é¼þ»¯µÄģʽ½øÐпª·¢¡£ |