Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
iOS APP ¼Ü¹¹Âþ̸
 
×÷Õߣºzhenby's blog ·¢²¼ÓÚ 2015-8-11
  2361  次浏览      30
 

×î½ü¿´ÁËһЩÓйØserverµÄ¶«Î÷£¬Ò»Ð©ºÜ¼òµ¥µÄ¶«Î÷£¬²»ÍâºõÊÇһЩÎĵµ¹æ·¶£¬ÁíÍâ½áºÏ×î½ü¿´µÄwwdcµÄһЩvideo£¬¾õµÃ¶ÔÈí¼þ¼Ü¹¹£¨software architecture£©ÈÏʶÓÖÇå³þÁËһЩ£¬ÕâÀï¼Ç¼ÏÂÀ´¡£

software architecture ÌýÉÏÈ¥ÊÇÒ»¸öºÜ´óµÄ¸ÅÄʵ¼ÊÉÏÒ²°üÀ¨ºÜ¶à¶«Î÷£¬ÀïÃæµÄÕùÒéÒ²ºÜ¶à¡£ÔÚÎÒ¿´À´Èí¼þ¼Ü¹¹×îºÃ·ÅÔÚСµÄ³¡¾°ÖÐÀí½â¡£

ÎÊÌâ1

ÎÒÃÇÓÐ2¸öÒ³Ãæ¡£

1.Ò³ÃæA£ºÖ÷Ò³Ãæ

2.Ò³ÃæB£ºÏêÇéÒ³Ãæ

2¸öÒ³Ãæ·Ö±ðÏÔʾһ¸öÊý×Ö£¬Õâ¸öÊý×ÖÓ¦¸ÃÏàͬ¡£ÏêÇé»áÐÞ¸ÄÕâ¸öÊý×Ö£¬ÕâÀïÎÒÃÇ·¢ÏÖ£¬ÏêÇéÒ³ÃæºÍÖ÷Ò³ÃæÊý×Ö²»Ò»Ñù¡£

Êý¾Ý²»Ò»ÖÂ

ÎÊÌâ1 ½â¾ö·½·¨A

ÕâÀïÊ×Ïȵĸоõ¾ÍÊÇ£¬ÏêÇéÒ³Ãæ·µ»Ø£¬Ö÷Ò³ÃæÊý¾ÝûÓÐˢУ¬µ¼ÖÂÊý¾Ý²»Ò»Ö¡£ ÄÇôFixÕâ¸öBugµÄ·½·¨£¬¾ÍÊÇÔÚÖ÷Ò³Ãæ³öÏÖµÄʱºòˢнçÃæ

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

self.displayLabel.text = [[CUDataDAO selectData].data stringValue];
}

ÏÖÔÚÀ´¿´£¬»¹²»´í¡£µ«ÊÇ£¬ÎÒÃǵ÷ÓÃselectDataµÄ´ÎÊýÔò±äµÃ·Ç³£·Ç³£¶à¡£Êý¾Ý²»ÊǾ­³£±ä»¯µÄ¡£

ÎÊÌâ1 ½â¾ö·½·¨B

ÎÒÃÇ·¢ÏÖ¼ÈÈ»Êý¾ÝµÄ¸Ä±äÊÇÔÚÒ³ÃæB½øÐеģ¬ÄÇÃ´Ò³ÃæBÐÞ¸ÄÕâ¸öÊý¾ÝµÄʱºò£¬Ó¦¸Ã°ÑÊý¾Ý±ä»¯¡±Í¨Öª¡±¸øÒ³ÃæA£¬ÄÇôÎÒÃÇдÁËÒ»¸öDelegate

@protocol CUDetailViewControllerDelegate <NSObject>

- (void)detailVC:(CUDetailViewController *)vc dataChanged:(NSNumber *)data;

@end

ÔÚÒ³ÃæBÐÞ¸ÄÊý¾ÝÖ®ºó£¬Í¨¹ýdelegate ֪ͨ¸øÒ³ÃæA¡£

- (IBAction)changeButtonClicked:(id)sender {
int value = arc4random() % 100;
[CUDataDAO setData:value];

self.displayLabel.text = [@(value) stringValue];

if ([self.delegate respondsToSelector:@selector(detailVC:dataChanged:)]) {
[self.delegate detailVC:self dataChanged:@(value)];
}
}

µ½´Ë³¡¾°1µÃµ½Á˲»´íµÄ½â¾ö¡£

ÎÊÌâ2

ÕâʱÎÒÃÇÔö¼ÓÁËÁíÒ»¸öÒ³ÃæC¡£Õâ¸ö³¡¾°»áÉÔ΢³éÏóÒ»µã£¬ÎÒÃǶ¨ÒåÁË3¸öÊý¾Ý

1.Ò³ÃæAµÄÊý¾ÝdataA

2.Ò³ÃæBµÄÊý¾ÝdataB

3.Ò³ÃæCµÄÊý¾ÝdataC

ÎÊÌâ1ÖÐ dataA = dataB¡£ÔÚÎÊÌâ2ÖÐdataA = dataB + dataC;

ÎÊÌâ2 ½â¾ö·½·¨C

Ò²¾ÍÊÇËµÒ³ÃæCµÄÐ޸ģ¬Ò²»áÓ°ÏìÒ³ÃæAµÄÊý¾Ý£¬ÄÇôÎÒÃÇÊDz»ÊÇҲҪдһ¸öXXXXDelegateÄØ£¿

ÕâʱÎÒÃǵĴóÄÔÐá³öÁËһЩ²»ºÃµÄζµÀ£¬Èç¹ûÔÙÀ´¸öʲôdataD£¬dataE£¬ÎÒÃÇҪдÕâô¶àµÄDelegateô£¿¶ÔÓÚ¶à¶ÔÒ»¡±Í¨Öª¡±ÕâÖÖζµÀ£¬ºÜ×ÔÈ»µÄÏëµ½Á˲»ÓÃDelegate£¬¶øÊÇÓÃNSNotificationÀ´×ö¡£ÈÃÎÒÃÇδÓê³ñçÑһϣ¬¶¨ÒåÒ»¸öNotificaiton

NSString *const kCUDataChangedNotification = @"CUDataChangedNotification";

[[NSNotificationCenter defaultCenter] postNotificationName:kCUDataChangedNotification
object:nil
userInfo:nil];

ÄÇÕâ¸ö±ä»¯broadcastµ½listener£¬¿´ÉÏÈ¥ÊÇÒ»¸öºÜÔÞµÄidea¡£

ÎÊÌâ3

¹ýÁËÒ»¶Îʱ¼ä£¬ÎÒÃÇ·¢ÏÖÎÊÌâ2µÄ·½·¨ÓÐÒ»¸öBug£¬µ±½çÃæÍ£ÔÚÒ³ÃæBµÄʱºò£¬Çл»µ½Ò³ÃæC£¬ÐÞ¸ÄÊý¾Ý£¬BÖÐÔÙ·µ»ØÊ±£¬Êý¾ÝºÍÒ³ÃæAµÄÊý¾Ý²»Ò»Ö¡£

Êý¾Ý²»Ò»ÖÂ

ÄÇÒ²¿ÉÒÔÀà±È½â¾ö·½·¨B£¬µÃµ½ÁËÏÂÃæµÄ·½·¨

½â¾ö·½·¨D

¼ÈÈ»AºÍBµÄÊý¾Ý²»Ò»Ö£¬¶øAµÄÊý¾Ý±ÈBµÄУ¬ÄÇô±£ÁôÒ»¸öBµÄÖ¸Õ룬ȻºóA±ä»¯µÄʱºò£¬¸üÐÂB¾ÍºÃÁË¡£

- (void)handleDataChangedNotification {
[self updateLabel];
[self.vc updateLabel];
}

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"push"]) {
CUDetailViewController *vc = [segue destinationViewController];
if ([vc isKindOfClass:[CUDetailViewController class]]) {
self.vc = vc;
}
}
}

ÎÊÌâ4

Ò³ÃæCʵÔÚÊÇÌ«¼òµ¥ÁË£¬Õâ´ÎÎÒÃÇÏ£ÍûÔÚÒ³ÃæCÖÐÏÔÊ¾Ò³ÃæAµÄÊý¾Ý¡£ÒòΪÉÏ´ÎÎÒÃǾͲúÉúÁËÒ»¸öÊý¾Ý²»Ò»ÖµÄÎÊÌ⣬Õâ´ÎÎÒÃÇ×¢Òâµ½ÁË£¬ÄÇôÔõôÐÞ¸ÄÄØ£¿

½â¾ö·½·¨E

ÔÚ¿´ÁË¿´Õû¸öAPP¸÷ÖÖ֪֮ͨºó£¬¾õµÃͦÂé·³£¬×¼±¸ÓÃÒ»¸öÈ¡Çɵķ½·¨¡£¿ÉÒÔÀà±È½â¾ö·½·¨A¡£ÔÚÒ³ÃæC³öÏÖµÄʱºò£¬Ë¢ÐÂÊý¾Ý£¬ÖÁÓÚʲôÐÔÄÜÎÊÌ⣬²»¹ÜÁË£¬ÏÈfix bug¡£

- (void)viewWillAppear:(BOOL)animated {
[self updateLabel];
}

- (void)updateLabel {
int dataB = [[CUDataDAO selectData].data intValue];
int dataC = [[CUDataDAO selectOtherData].data intValue];

self.dataLabel.text = [@(dataB + dataC) stringValue];
}

ÎÊÌâ5

ÕâʱµÄÊý¾ÝÐèÒª²»¶ÏµÄ±ä»¯£¬ÎÒÃÇÔÚCUDataDAO¼ÓÁËÒ»¸ötimer Ä£ÄâÊý¾Ý±ä»¯£¬Êý¾Ý±ä»¯µÄÔ­Òò¿ÉÄÜÊÇserver push һЩÊý¾Ý¡£client ±¾µØÊý¾Ý¿â¸üÐÂÁËÊý¾Ý£¬ÐèÒªÔÚÒ³ÃæA¡¢B¡¢CÖÐÏÔʾ¡£

Ò³ÃæCµÄÊý¾ÝÓÖ²»Ò»ÖÂÁË¡£¡£¡£¡£

ÎÊÌâµ½µ×ÔÚÄÄÀïÄØ

×ßµ½ÕâÀÎÒÃÇÐèÒªÖØÐÂ˼¿¼ÎªÊ²Ã´Õâ¸öÎÊÌâ»á²»¶ÏµÄÖØ¸´³öÏÖÄØ£¿software architecture¾ÍÊÇÀ´½â¾öÕâ¸öÎÊÌâµÄ¡£µ«ÊÇÔÚÌá³öÒ»¸öºÏÀíµÄ·½°¸Ö®Ç°£¬ÏÈ˼¿¼Ò»¸ö¸ÅÄî¡£

ÎÒÃǰÑÊý¾Ý¿âÖеÄÊý¾Ý£¬ÏÔʾµ½ÆÁÄ»ÉÏ£¬»òÊÇ´«µÝ¸øViewʱ£¬Õâ¸ö¹ý³ÌÆäʵÊǶÔdata ×öÁËÒ»´Îcopy¡£¶øÇÒÖ»Òª²»ÊÇͨ¹ýÒýÓûòÊÇÖ¸ÕëÕâЩ·½Ê½£¬Í¨¹ýÖµ´«µÝµÄ·½Ê½¶¼ÊǶÔdata×öÁËÒ»´Îcopy¡£¶øÕâ¸öcopyµÄ¹ý³Ì£¬·Ç³£ÀàËÆCache¡£

ͨ³£½¨Á¢Ò»¸öCache»áÓöµ½2ÖÖÎÊÌâ¡£

1.CacheÇé¿öA: Óëoriginal Data Êý¾Ý²»Ò»Ö£¬Ã»Óм°Ê±¸üÐÂ

2.CacheÇé¿öB: ÖØ¸´½¨Á¢Cache

ÈÃÎÒÃÇÓÃÕâ¸ö˼·À´¿´ÎÒÃǵĽâ¾ö·½°¸

½â¾ö·½·¨A

ÕâÊÇÒ»¸ö·Ç³£µäÐ͵ÄCacheÇé¿öB¡£Êý¾Ý¿âµÄÊý¾Ý²¢Ã»Óб仯£¬µ«ÎÒÃÇÈ´¶à´ÎÖØ¸´¼ÆËãcache

½â¾ö·½·¨B

Ò³ÃæÖ®¼äµÄ¹ØÏµ¿ÉÒÔÓÃÏÂÃæÀ´ÃèÊö

ÕâÀïÎÒÃÇÒþÒþÄܹ»¸Ð¾õµ½ÎÊÌ⣬AµÄÊý¾Ý±ä»¯ÒÀÀµÓÚ2¸öµØ·½¡£²»¼±£¬ÔÙÍùºó¿´

½â¾ö·½·¨C

½â¾ö·½·¨D

ÊÂÇé±äµÃ¸üÔãÁË

½â¾ö·½·¨E

ºÍ½â¾ö·½·¨AÀàËÆ£¬Í¬ÑùµÄÖØ¸´¼ÆËãCacheÎÊÌâ¡£

ʵ¼ÊÉÏÎÊÌ⻹»á¸üÔã

ÏÖÔÚ»¹ÊÇÒ»¸ö¼òµ¥µÄModel£¬Èç¹ûproject±äµÃºÜ´ó£¬ÄÇô¾Í»á±ä³ÉÕâ¸öÑù×Ó

ÿһ¸öX¶¼¿ÉÄÜÊÇÒ»¸öBug¡£

ÎÒÃÇËÆºõÒѾ­ÕÒµ½ÎÊÌâÁË

¡¶Advanced iOS Application Architecture and Patterns¡· ÖУ¬°ÑÕâ¸öͼ½Ð×öinformation flow¡£ÎÒÃǵÄÖ±¾õ»á¸æËßÎÒÃÇ£¬Õâ¸öÐÅÏ¢µÄ´«µÝ£¬Ó¦¸ÃÊÇ×ÔÉ϶øÏµÄÊ÷»òÊÇÉ­ÁÖ£¬¶øÇÒ×îºÃÊÇÒ»¸ö²ã´Îƽºâ½á¹¹£¬ÒªÇåÎú£¬Ã¿Ò»¸öλÖö¼ÓÐÏà¶ÔÓÚµÄÖ°Ôð¡£ÄÇÎÒÃǾÍÐèÒªÖÆ¶¨Ò»¸ö¹æÔò¡£

ÔÚÏëÕâ¸ö¹æÔò֮ǰ£¬Èç¹û°ÑÉÏÃæµÄͼ±³ºóµÄÊý¾ÝÍü¼Ç£¬ÎÒÃǸоõÕâºÜÀàËÆÄÚ´æÄ£ÐÍ¡£µ±È»ÄÚ´æÄ£ÐÍ»á±È½Ï¸´ÔÓ¡£µ«ÊÇÎÒÃÇ¿ÉÒÔ½è¼øºÜ¶à¡±ÄÚ´æ¹ÜÀíÖеĹæÔò¡±£¬±ÈÈçË­´´½¨£¬Ë­Ïú»Ù¡£Í¬Ñù£¬ÔÚÎÒÃǵÄinformation flowÖУ¬ÎÒÃÇÏ£ÍûË­´´½¨Cache£¬Ë­¸üÐÂCache±ä»¯

DAOµÄÊý¾Ý¿âËÆºõºÜÄÑ×öÕâ¼þÊÂÇ飬ÎÒÃÇÒýÈëÁËÒ»¸öеÄÔªËØdataSource£¨µ±È»Ëû±¾ÉíÓÖÊÇDAOµÄÒ»¸öCache)¡£ÆäÖÐA¡¢B¡¢C3¸ö¶¼»áÏÔʾÊý¾Ý£¬ÄÇôËûÃÇÓ¦¸ÃÔÚÒ»¸ö²ã¼¶£¬ÆäÖÐB¡¢C»áÐÞ¸ÄÊý¾Ý£¬ËûÃÇ»á°ÑÕâ¸öÊý¾Ý·µ»Ø¸ødataSource£¬¶øÍ¨¹ýdataSourceÀ´°ÑÕâ¸ö±ä»¯Í¨Öªµ½A¡¢B¡¢C¡£

ÕâÑù´øÀ´µÄºÃ´¦ºÜÃ÷ÏÔ£¬ÎÒÃÇÔÙÌí¼ÓÒ»¸öD£¬Ò²²»»á¶ÔÆäËûµØ·½µÄÊý¾Ý²úÉúÈκÎÓ°Ï죬ÎÒÃǵÄUnit Test¡¢MockÒ²¸ü¼ÓºÃд¡£

ÎÒÃÇ֮ǰµÄ˼·´íÔÚÄÄÀïÄØ£¿

´Ó¾Ö²¿À´¿´£¬ÎÒÃÇ֮ǰµÄ˼·¶¼Ã»ÓÐÈκÎÎÊÌ⣬µ«ÊÇÕûÌåÀ´¿´È´°ÑÎÊÌâÒþ²Ø»¯¡£¹Ø¼üµÄÎÊÌâÊÇÔÚÓÚûÓÐÕÒµ½Truth£¬ÕÒµ½ÎÊÌâÕæÕýµÄµØ·½¡£¶øÕÒµ½ÕæÕýµÄµØ·½£¬ÐèÒªÎÒÃÇÔÚ´óÄÔÖÐÓÐÒ»¸öÇåÎúµÄinformation flow»òÊÇdata flow¡£Á˽âÖ®¼äÔªËØµÄÏ໥¹ØÏµ£¬²ÅÄܽ¨Á¢Ò»¸ö¸öµÄ²ã¡£²ÅÄÜ×øµ½ÕæÕýµÄ½âñî,½âñî²¢²»Êǽö½öÒ»¸ö¸öµÄManager£¬¸üÖØÒªµÄÊǽ¨Á¢Ò»Ì×ÇåÎúµÄflow»úÖÆ£¬»òÊÇÏûÏ¢»úÖÆ£¬Èç¹ûûÓÐÒ»Ì×flow£¬ÖмäÒýÈëµÄ¸÷ÖÖ¸÷ÑùµÄ·½·¨£¬¼´±ãʹÓÃÁ˸÷ÖÖÉè¼ÆÄ£Ê½£¬Õû¸ösoftware ÒÀÈ»ÊÇÉî¶ÈñîºÏ¡£

ÒÉÎÊ

Õâ¸öAPP¿´ÉÏÈ¥½»»¥·Ç³£¸´ÔÓ

ÉÏÃæµÄmodel£¬ÓÐЩͬѧ»¹¿ÉÄܾõµÃÕâÊǽ»»¥ÉÏÃæµÄÎÊÌ⣬Õâ¸ö½»»¥¿´ÉÏÈ¥·Ç³£µÄ¸´ÔÓ£¬²»ÊÇÒ»¸öºÃÉè¼Æ¡£

ÎÒÕâÀïÁоÙÒ»¸öʵ¼ÊµÄÀý×Ó£º

AÒ³ÃæÒª´´½¨¶¯»­£¬¶¯»­±³ºó°üÀ¨ºÜ¶àÊý¾Ý£¬ÕâЩÊý¾Ý»áÔÚB£¬CÉõÖÁ¸ü¶àµÄÒ³Ãæ£¬»òÊǺǫ́±»Ð޸ġ£¶¯»­±¾Éíʵ¼ÊÉÏÌåÏÖÔÚView£¬¶øÕâЩview¿ÉÄܲ»½ö½öÔÚAÖÐÓУ¬B£¬C¿ÉÄÜÒ²»áÓв¿·ÖµÄView¡£

µ¥ÀýÔõôÑù

µ±È»ÎÒÃÇ¿ÉÒÔÓõ¥ÀýµÄ·¨×Ó¡£µ¥ÀýÊǸöħ¹í£¬±»ºÜ¶àÀÄÓã¬Õâ¸ö³¡¾°Óõ¥Àý£¬Æäʵ½ö½öÊǰÑÈ«¾Ö±äÁ¿ºÏÀíµÄ·â×°ÔÚÁ˵¥ÀýÏ£¬ÒòΪÕâ·ÝÊý¾Ý£¬²¢Ã»ÓÐÈκÎÀíÓÉÒªÒ»¶¨ÊÇÒ»·Ýcopy¡£

recap

ÔÚÁ˽âÕâ¸ö¸ÅÄîºó£¬ÔÙ¿´Ò»Ð©serverµÄ¼Ü¹¹£¬¹æÔòʱ£¬Ò²»á¸üÈÝÒ×Àí½âÕâЩ²ãÖ®¼äµÄ¹ØÏµ¡£°üÀ¨

ΪʲôҪ¹æ¶¨ÄÇЩ²ãÖ®¼ä£¬²»ÄÜÏ໥µ÷Ó㬲»ÄÜÓо²Ì¬·½·¨¡£

Ò»¸ö²ãÖ®¼äµÄmodel£¬²»ÄÜÓÐÖØµþ¹¦ÄÜ£¬²»ÄÜÁ¬±í²éѯ¡£

ÔÚÄĸö²ã²ÅÄܵ÷ÓÃÁíÒ»¸ö·þÎñ£¬¶øµ÷ÓÃÕâ¸ö·þÎñ»¹±ØÐëҪͨ¹ýͳһµÄ½Ó¿Ú

software architecture º­¸ÇµÄ¶«Î÷·Ç³£¶à¡£ÕâÆªÖ»ÊÇÒ»¸öÒý×Ó£¬½éÉÜÁËÉè¼ÆÖ®Ç°µÄ×¼±¸¹¤×÷¡£µ«ÊÇÔÚʵ¼Ê¹ý³ÌÖУ¬ÎÒÃǵÄÄ£ÐÍ¿ÉÄÜÒª±ÈÎÒÕâÀïдµÄ»¹Òª¸´ÔӺܶࡣÏÂһƪ»á½éÉÜÒ»ÖÖ²ßÂÔÓÃÀ´´¦Àí¸ü¼Ó¸´ÔÓÄ£Ð͵ÄÇé¿ö¡£

×îºó¸½ÉÏÒ»¸öÍêÕû¹¦ÄÜµÄ demo code

   
2361 ´Îä¯ÀÀ       30
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ

ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ