±à¼ÍƼö: |
±¾ÎÄÖ÷ÒªÕ¾ÔÚAndroid¿ª·¢µÄ½Ç¶ÈÀ´´óÖ½âÎöÏÂBinderÔÚjava²ãµÄһЩ֪ʶÔÀí.
±¾ÎÄÀ´×ÔÓÚ˼·ñ£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
Ò».ÒýÑÔ
×î½üÒ»¶Îʱ¼äÓÉÓÚ¹¤×÷£¬½Ó´¥µ½framework²¿·Ö±È½Ï¶àÒ»µã£¬Ò²ÄÑÃâÒªºÍBinder´òһЩ½»µÀ£¬Ò²ÕûÀíÁËһЩÏà¹ØÖªÊ¶£¬µ«×¼±¸Ð´ÕâÆªÎÄÕÂʱ£¬»¹ÊÇÓÐЩ»Å¡£¶øÇÒ¹ØÓÚÕû¸öBinder»úÖÆµÄ¸´Ôӳ̶Ȳ»ÊÇÈýÑÔÁ½ÓïÄÜÃèÐðÇå³þµÄ£¬Ò²º¦ÅÂ×Ô¼ºµÄÀí½âÓÐЩƫ²î£¬Îóµ¼Ò»Ð©ÅóÓÑ£¨ps:·´ÕýҲûÈË¿´....ÔúÐÄ£©ËùÒÔÒ²²Î¿¼Á˺ܶà×ÊÁÏ,¸ø´ó¼ÒÄÔ×ÓÐγÉÒ»¸öÍêÕûµÄ¸ÅÄ±ÈÈçAIDLµÄʵÏÖÔÀí£¬BinderÊÇÔõôͨÐŵĵȵȣ¬ÎÄÕÂÎÄ×ֽ϶࣬ÇëÄÍÐĹۿ´¡£
¶þ.Binder¸ÅÊö
2.1 AndroidΪʲôѡÔñBinder
AndroidÊÇ»ùÓÚLinuxÄں˵ģ¬ËùÒÔAndroidҪʵÏÖ½ø³Ì¼äµÄͨÐÅ£¬Æäʵ´ó¿ÉʹÓÃlinuxÔÓеÄһЩÊֶΣ¬±ÈÈç¹ÜµÀ£¬¹²ÏíÄڴ棬socketµÈ·½Ê½£¬µ«ÊÇAndroid»¹ÊDzÉÓÃÁËBinder×÷ΪÖ÷Òª»úÖÆ£¬ËµÃ÷Binder¾ßÓÐÎ޿ɱÈÄâµÄÓÅÊÆ¡£
Æäʵ½ø³ÌͨÐÅ´ó¸Å¾ÍÁ½¸ö·½ÃæÒòËØ£¬Ò»ÕßÐÔÄÜ·½Ã棬´«ÊäЧÂÊÎÊÌ⣬´«Í³µÄ¹ÜµÀ¶ÓÁÐģʽ²ÉÓÃÄڴ滺³åÇøµÄ·½Ê½£¬Êý¾ÝÏÈ´Ó·¢ËÍ·½»º´æÇø¿½±´µ½Äں˿ª±ÙµÄ»º´æÇøÖУ¬È»ºóÔÙ´ÓÄں˻º´æÇø¿½±´µ½½ÓÊÕ·½»º´æÇø£¬ÖÁÉÙÓÐÁ½´Î¿½±´¹ý³Ì£¬¶øsocket¶¼ÖªµÀ´«ÊäЧÂʵͣ¬¿ªÏú´ó£¬ÓÃÓÚ¿çÍøÂç½ø³Ì½»»¥±È½Ï¶à£¬¹²ÏíÄÚ´æËäÈ»ÎÞÐ追±´¡£
¶þÕßÕâÊǰ²È«ÎÊÌ⣬Android×÷Ϊһ¸ö¿ª·Åʽ£¬ÓµÓÐÖڶ࿪·¢Õߵĵį½Ì¨£¬Ó¦ÓóÌÐòµÄÀ´Ô´¹ã·º£¬È·±£Öն˰²È«ÊǷdz£ÖØÒªµÄ£¬´«Í³µÄIPCͨÐÅ·½Ê½Ã»ÓÐÈκδëÊ©£¬»ù±¾ÒÀ¿¿ÉϲãÐÒ飬ÆäÒ»ÎÞ·¨È·È϶Է½¿É¿¿µÄÉí·Ý£¬AndroidΪÿ¸ö°²×°ºÃµÄÓ¦ÓóÌÐò·ÖÅäÁË×Ô¼ºµÄUID£¬¹Ê½ø³ÌµÄUIDÊǼø±ð½ø³ÌÉí·ÝµÄÖØÒª±êÖ¾£¬´«Í³µÄIPCÒª·¢ËÍÀàËÆµÄUIDÒ²Ö»ÄÜ·ÅÔÚÊý¾Ý°üÀµ«Ò²ÈÝÒ×±»À¹½Ø£¬¶ñÒâ½ø¹¥£¬socketÔòÐèÒª±©Â¶×Ô¼ºµÄipºÍ¶Ë¿Ú£¬ÖªµÀÕâЩ¶ñÒâ³ÌÐòÔò¿ÉÒÔ½øÐÐÈÎÒâ½ÓÈë¡£
×ÛÉÏËùÊö£¬AndroidÐèÒªÒ»ÖÖ¸ßЧÂÊ£¬°²È«ÐԸߵĽø³ÌͨÐÅ·½Ê½£¬Ò²¾ÍÊÇBinder£¬BinderÖ»ÐèÒªÒ»´Î¿½±´£¬ÐÔÄܽö´ÎÓÚ¹²ÏíÄڴ棬¶øÇÒ²ÉÓõĴ«Í³µÄC/S½á¹¹£¬Îȶ¨ÐÔÒ²ÊÇûµÃ˵£¬·¢ËÍÌí¼ÓUID/PID£¬°²È«ÐԸߡ£
2.2 BinderʵÏÖ»úÖÆ
2.2.1½ø³Ì¸ôÀë
ÎÒÃÇÖªµÀ½ø³ÌÖ®¼äÊÇÎÞ·¨Ö±½Ó½øÐн»»¥µÄ£¬Ã¿¸ö½ø³Ì¶ÀÏí×Ô¼ºµÄÊý¾Ý£¬¶øÇÒ²Ù×÷ϵͳΪÁ˱£Ö¤×ÔÉíµÄ°²È«Îȶ¨ÐÔ£¬½«ÏµÍ³Äں˿ռäºÍÓû§¿Õ¼ä·ÖÀ뿪À´£¬±£Ö¤Óû§³ÌÐò½ø³Ì±ÀÀ£Ê±²»»áÓ°Ïìµ½Õû¸öϵͳ£¬¼òµ¥µÄ˵¾ÍÊÇ£¬Äں˿ռ䣨Kernel£©ÊÇϵͳÄÚºËÔËÐеĿռ䣬Óû§¿Õ¼ä£¨UserSpace£©ÊÇÓû§³ÌÐòÔËÐеĿռ䡣ΪÁ˱£Ö¤°²È«ÐÔ£¬ËüÃÇÖ®¼äÊǸôÀëµÄ£¬ËùÒÔÓû§¿Õ¼äµÄ½ø³ÌÒª½øÐн»»¥ÐèҪͨ¹ýÄں˿ռäÀ´Çý¶¯Õû¸ö¹ý³Ì¡£
2.2.2 C/S½á¹¹
BinderÊÇ»ùÓÚC/S»úÖÆµÄ£¬ÒªÊµÏÖÕâÑùµÄ»úÖÆ£¬server±ØÐëÐèÒªÓÐÌØ¶¨µÄ½ÚµãÀ´½ÓÊܵ½clientµÄÇëÇó£¬Ò²¾ÍÊÇÈë¿ÚµØÖ·£¬ÏñÊäÈëÒ»¸öÍøÖ·£¬Í¨¹ýDNS½âÎö³ö¶ÔÓ¦µÄip£¬È»ºó½øÐзÃÎÊ£¬Õâ¸ö¾ÍÊÇserverÌṩ³öÀ´µÄ½ÚµãµØÖ·£¬¶øBinder¶øÑԵϰ£¬Ó봫ͳµÄC/S²»Ì«Ò»Ñù£¬Binder±¾ÉíÀ´×÷ΪServerÖÐÌṩµÄ½Úµã£¬clientÄõ½BinderʵÌå¶ÔÏó¶ÔÓ¦µÄµØÖ·È¥·ÃÎÊServer£¬¶ÔÓÚclient¶øÑÔ£¬ÔõôÄõ½Õâ¸öµØÖ·²¢½¨Á¢ÆðÕû¸öͨµÀÊÇÕû¸ö½»»¥µÄ¹Ø¼üËùÔÚ£¬¶øÇÒBinder×÷Ϊһ¸öServerÖеÄʵÌ壬¶ÔÏóÌṩһϵÁеķ½·¨À´ÊµÏÖ·þÎñ¶ËºÍ¿Í»§¶ËÖ®¼äµÄÇëÇó£¬Ö»ÒªclientÄõ½Õâ¸öÒýÓþͿÉÒÔ»òÕßÒ»¸öÓÐן÷½·¨´úÀí¶ÔÏóµÄÒýÓ㬾ͿÉÒÔ½øÐÐͨÐÅÁË¡£
ÒýÓÃAndroid BanderÉè¼ÆÓëʵÏÖ - Éè¼ÆÆªÒ»¶Î»°À´×ܽ᣺
ÃæÏò¶ÔÏó˼ÏëµÄÒýÈ뽫½ø³Ì¼äͨÐÅת»¯ÎªÍ¨¹ý¶Ôij¸öBinder¶ÔÏóµÄÒýÓõ÷ÓøöÔÏóµÄ·½·¨£¬¶øÆä¶ÀÌØÖ®´¦ÔÚÓÚBinder¶ÔÏóÊÇÒ»¸ö¿ÉÒÔ¿ç½ø³ÌÒýÓõĶÔÏó£¬ËüµÄʵÌåλÓÚÒ»¸ö½ø³ÌÖУ¬¶øËüµÄÒýÓÃÈ´±é²¼ÓÚϵͳµÄ¸÷¸ö½ø³ÌÖ®ÖС£×îÓÕÈ˵ÄÊÇ£¬Õâ¸öÒýÓúÍjavaÀïÒýÓÃÒ»Ñù¼È¿ÉÒÔÊÇÇ¿ÀàÐÍ£¬Ò²¿ÉÒÔÊÇÈõÀàÐÍ£¬¶øÇÒ¿ÉÒÔ´ÓÒ»¸ö½ø³Ì´«¸øÆäËü½ø³Ì£¬Èôó¼Ò¶¼ÄÜ·ÃÎÊͬһServer£¬¾ÍÏó½«Ò»¸ö¶ÔÏó»òÒýÓø³Öµ¸øÁíÒ»¸öÒýÓÃÒ»Ñù¡£BinderÄ£ºýÁ˽ø³Ì±ß½ç£¬µ»¯Á˽ø³Ì¼äͨÐŹý³Ì£¬Õû¸öϵͳ·Â·ðÔËÐÐÓÚͬһ¸öÃæÏò¶ÔÏóµÄ³ÌÐòÖ®ÖС£ÐÎÐÎɫɫµÄBinder¶ÔÏóÒÔ¼°ÐÇÂÞÆå²¼µÄÒýÓ÷·ðÕ³½Ó¸÷¸öÓ¦ÓóÌÐòµÄ½ºË®£¬ÕâÒ²ÊÇBinderÔÚÓ¢ÎÄÀïµÄÔÒâ¡£
2.2.3 BinderͨÐÅÄ£ÐÍ
Binder»ùÓÚC/SµÄ½á¹¹Ï£¬¶¨ÒåÁË4¸ö½ÇÉ«£ºServer¡¢Client¡¢ServerManager¡¢BinderÇý¶¯£¬ÆäÖÐǰÈýÕßÊÇÔÚÓû§¿Õ¼äµÄ£¬Ò²¾ÍÊDZ˴ËÖ®¼äÎÞ·¨Ö±½Ó½øÐн»»¥£¬BinderÇý¶¯ÊÇÊôÓÚÄں˿ռäµÄ£¬ÊôÓÚÕû¸öͨÐŵĺËÐÄ£¬ËäÈ»½ÐÇý¶¯£¬µ«ÊÇʵ¼ÊÉϺÍÓ²¼þûÓÐÌ«´ó¹ØÏµ£¬Ö»ÊÇʵÏֵķ½Ê½ºÍÇý¶¯²î²»¶à£¬Çý¶¯¸ºÔð½ø³ÌÖ®¼äBinderͨÐŵĽ¨Á¢£¬BinderÔÚ½ø³ÌÖ®¼äµÄ´«µÝ£¬BinderÒýÓüÆÊý¹ÜÀí£¬Êý¾Ý°üÔÚ½ø³ÌÖ®¼äµÄ´«µÝºÍ½»»¥µÈһϵÁеײãÖ§³Ö¡£
ServerManagerµÄ×÷Óã¿
ÎÒÃÇÖªµÀServerManagerÒ²ÊÇÊôÓÚÓû§¿Õ¼äµÄÒ»¸ö½ø³Ì£¬Ö÷Òª×÷ÓþÍÊÇ×÷ΪServerºÍclientµÄÇÅÁº£¬client¿ÉÒÔServerManagerÄõ½ServerÖÐBinderʵÌåµÄÒýÓã¬Õâô˵¿ÉÄÜÓеãÄ£ºý£¬¾Ù¸ö¼òµ¥µÄÀý×Ó£¬ÎÒÃÇ·ÃÎÊ£¬www.baidu.com£¬°Ù¶ÈÊ×Ò³Ò³Ãæ¾ÍÏÔʾ³öÀ´ÁË£¬Ê×ÏÈÎÒÃÇÖªµÀ£¬Õâ¸öÒ³Ãæ¿Ï¶¨ÊÇ·¢²¼ÔÚ°Ù¶Èij¸ö·þÎñÆ÷Éϵģ¬DNSͨ¹ýÄãÕâ¸öµØÖ·£¬½âÎö³ö¶ÔÓ¦µÄipµØÖ·£¬ÔÙÈ¥·ÃÎʶÔÓ¦µÄÒ³Ãæ£¬È»ºóÔÙ°ÑÊý¾Ý·µ»Ø¸ø¿Í»§¶Ë£¬Íê³É½»»¥¡£Õâ¸öºÍBinderµÄC/S·Ç³£ÀàËÆ£¬ÕâÀïµÄDNS¾ÍÊǶÔÓ¦µÄServerManager£¬Ê×ÏÈ£¬ServerÖеÄBinderʵÌå¶ÔÏ󣬽«×Ô¼ºµÄÒýÓã¨Ò²¾ÍÊÇipµØÖ·£©×¢²áµ½ServerManager£¬clientͨ¹ýÌØ¶¨µÄkey£¨Ò²¾ÍÊǰٶÈÕâ¸öÍøÖ·£©ºÍÕâ¸öÒýÓýøÐа󶨣¬ServerManagerÄÚ²¿×Ô¼ºÎ¬»¤Ò»¸öÀàËÆMAPµÄ±íÀ´Ò»Ò»¶ÔÓ¦£¬Í¨¹ýÕâ¸ökey¾Í¿ÉÒÔÏòServerManagerÄõ½ServerÖÐBinderµÄÒýÓ㬶ÔÓ¦µ½Android¿ª·¢ÖУ¬ÎÒÃÇÖªµÀºÜ¶àϵͳ·þÎñ¶¼ÊÇͨ¹ýBinderÈ¥ºÍAMS½øÐн»»¥µÄ£¬±ÈÈç»ñÈ¡ÒôÁ¿·þÎñ£º
AudioManager am = (AudioManager)
context.getSystemService (Context.AUDIO_SERVICE);
ϸÐĵÄÅóÓÑÓ¦¸Ã·¢ÏÖServerManagerºÍServerÒ²ÊÇÁ½¸ö²»Í¬µÄ½ø³Ìѽ£¬ServerÒªÏòServerManagerÈ¥×¢²á²»ÊÇÒ²ÒªÉæ¼°µ½½ø³Ì¼äµÄͨÐÅÂ𣬵±Ç°ÊµÏÖ½ø³Ì¼äͨÐÅÓÖÒªÓõ½½ø³Ì¼äµÄͨÐÅ£¬ÄãÕâ²»Êdz¶¶¿×ÓÂð....μ±Äª¼±£¬BinderµÄÇÉÃîÖ®´¦ÔÚÓÚ£¬µ±ServerManager×÷ΪServe¶ËµÄʱºò£¬ËüÌṩµÄBinder±È½ÏÌØÊ⣬ËüûÓÐÃû×ÖÒ²²»ÐèҪע²á£¬µ±Ò»¸ö½ø³ÌʹÓÃBINDER_SET_CONTEXT_MGRÃüÁ×Ô¼º×¢²á³ÉSMgrʱBinderÇý¶¯»á×Ô¶¯ÎªËü´´½¨BinderʵÌ壬Õâ¸öBinderµÄÒýÓÃÔÚËùÓÐClientÖж¼¹Ì¶¨Îª0¶øÎÞÐëͨ¹ýÆäËüÊֶλñµÃ¡£Ò²¾ÍÊÇ˵£¬Ò»¸öServerÈôÒªÏòServerManager×¢²á×Ô¼ºBinder¾Í±ØÐèͨ¹ý0Õâ¸öÒýÓúźÍServerManagerµÄBinderͨÐÅ,ÓÐÅóÓÑÓÖÒªÎÊÁË£¬serverºÍclientÊôÓÚÁ½¸ö²»Í¬µÄ½ø³Ì£¬clientÔõôÄÜÄõ½serverÖжÔÏ󣬲»·ÁÏÈ¿´¿´ÏÂÃæµÄ½»»¥Í¼

´ÓÉÏͼºÜÇåÎúµÄ¿ÉÒÔ¿´³öÀ´Õû¸öµÄ½»»¥¹ý³Ì£¬Ô±¾´ÓSMÖÐÄõ½binderµÄÒýÓã¬Í¨¹ýBinderÇý¶¯²ãµÄ´¦ÀíÖ®ºó£¬·µ»Ø¸øÁËclientÒ»¸ö´úÀí¶ÔÏó£¬Êµ¼ÊÉÏÈç¹ûclientºÍserver´¦ÓÚͬһ¸ö½ø³Ì£¬·µ»ØµÄ¾ÍÊǵ±Ç°binder¶ÔÏó£¬Èç¹ûclientºÍserver²»´¦ÓÚͬһ¸ö½ø³Ì£¬·µ»Ø¸øclientµÄ¾ÍÊÇÒ»¸ö´úÀí¶ÔÏó£¬ÕâÒ»µã£¬ÓÐÐËȤ¿ÉÒÔ¿´ÏÂÔ´Âë¡£
2.2.4 Binder½ÇÉ«µÄ¶¨Î»
Binder±¾ÖÊÉÏÖ»ÊÇÌṩÁËÒ»ÖÖͨÐŵķ½Ê½£¬ºÍÎÒÃǾßÌåҪʵÏÖµÄÄÚÈÝûÓйØÏµ£¬ÎªÁËʵÏÖÕâ¸ö·þÎñ£¬ÎÒÃÇÐèÒª¶¨ÒåһЩ½Ó¿Ú£¬ÈÃclientÄܹ»Ô¶³Ìµ÷Ó÷þÎñ£¬ÒòΪÊÇ¿ç½ø³Ì£¬Õâʱºò¾ÍÒªÉè¼Æµ½´úÀíģʽ£¬ÒÔ½Ó¿Úº¯Êýλ»ù×¼£¬clientºÍserverȥʵÏÖ½Ó¿Úº¯Êý£¬ServerÊÇ·þÎñÕæÕýµÄʵÏÖ£¬client×÷Ϊһ¸öÔ¶³ÌµÄµ÷Óá£
´ÓServer½ø³ÌÀ´¿´£¬BinderÊÇ´æÔÚµÄʵÌå¶ÔÏó£¬clientͨ¹ýtransact()º¯Êý£¬¾¹ýBinderÇý¶¯£¬×îÖջص÷µ½BinderʵÌåµÄonTransact()º¯ÊýÖС£
´Ó Client½ø³ÌµÄ½Ç¶È¿´£¬Binder Ö¸µÄÊÇ¶Ô Binder ´úÀí¶ÔÏó£¬ÊÇ Binder ʵÌå¶ÔÏóµÄÒ»¸öÔ¶³Ì´úÀí£¬Í¨¹ýBinderÇý¶¯½øÐн»»¥
3.ÊÖд³Ìͨ½øÐÅ
ÉÏÃæËµÁËÄÇô¶à£¬´ó¼Ò»ïÒ²¿´ÀÛÁË£¬ÏÂÃæÍ¨¹ý´úÂëµÄÐÎʽÈôó¼Ò¶ÔBinder¼ÓÉîµãÀí½â£¬ÈÕ³£¿ª·¢ÖУ¬Éæ¼°µ½½ø³Ì¼äͨÐŵϰ£¬ÎÒÃÇÊ×ÏÈÏëµ½µÄ¿ÉÄܾÍÊÇAIDL£¬µ«²»ÖªµÀÓÐûÓкÍÎҸоõÒ»ÑùµÄÅóÓÑ¡£¡£µÚÒ»´ÎдAIDLÊÇÃɱεģ¬Í¨¹ý.aidlÎļþ£¬±àÒëÆ÷×Ô¶¯Éú³É´úÂ룬Éú³ÉÒ»¸öjavaÎļþ£¬ÀïÃæÓÖÓÐStubÀ࣬ÀïÃæ»¹ÓÐProxyÀ࣬ÍêÈ«²»Àí½âÀïÃæµÄ»úÖÆ£¬È·Êµ²»±ãÓÚÎÒÃÇÀí½âѧϰ£¬ÎªÁ˼ÓÉîÀí½â£¬ÎÒÃÇÅׯúaidl£¬ÊÖдһ¸öͨÐÅ´úÂë¡£
Ê×ÏÈÎÒÃÇÒª¶¨ÒåÒ»¸ö½Ó¿Ú·þÎñ£¬Ò²¾ÍÊÇÉÏÊöµÄ·þÎñ¶ËÒª¾ß±¸µÄÄÜÁ¦À´Ìṩ¸ø¿Í»§¶Ë,¶¨ÒåÒ»¸ö½Ó¿Ú¼Ì³ÐIInterface£¬´ú±íÁË·þÎñ¶ËµÄÄÜÁ¦
public interface
PersonManger extends IInterface {
void addPerson(Person mPerson);
List<Person> getPersonList();
}
|
½ÓÏÂÀ´ÎÒÃǾÍÒª¶¨ÒåÒ»¸öServerÖеÄBinderʵÌå¶ÔÏóÁË£¬Ê×Ïȿ϶¨Òª¼Ì³ÐBinder£¬Æä´ÎÐèҪʵÏÖÉÏÃæ¶¨ÒåºÃµÄ·þÎñ½Ó¿Ú
public abstract
class BinderObj extends Binder implements PersonManger
{
public static final String DESCRIPTOR = "com.example.taolin.hellobinder";
public static final int TRANSAVTION_getPerson
= IBinder.FIRST_CALL_TRANSACTION;
public static final int TRANSAVTION_addPerson
= IBinder.FIRST_CALL_TRANSACTION + 1;
public static PersonManger asInterface(IBinder
mIBinder){
IInterface iInterface = mIBinder.queryLocalInterface
(DESCRIPTOR);
if (null!=iInterface &&iInterface instanceof
PersonManger){
return (PersonManger)iInterface;
}
return new Proxy(mIBinder);
}
@Override
protected boolean onTransact (int code, @NonNull
Parcel data, @Nullable Parcel reply, int flags)
throws RemoteException {
switch (code){
case INTERFACE_TRANSACTION:
reply.writeString(DESCRIPTOR);
return true;
case TRANSAVTION_getPerson:
data.enforceInterface(DESCRIPTOR);
List<Person> result = this.getPersonList();
reply.writeNoException();
reply.writeTypedList(result);
return true; case TRANSAVTION_addPerson:
data.enforceInterface(DESCRIPTOR);
Person arg0 = null;
if (data.readInt() != 0) {
arg0 = Person.CREATOR.createFromParcel (data);
}
this.addPerson(arg0);
reply.writeNoException();
return true;
}
return super.onTransact (code, data, reply, flags);
} @Override
public IBinder asBinder() {
return this;
}
}
|
Ê×ÏÈÎÒÃÇ¿´asInterface·½·¨£¬BinderÇý¶¯´«À´µÄIBinder¶ÔÏó£¬Í¨¹ýqueryLocalInterface·½·¨£¬²éÕÒ±¾µØBinder¶ÔÏó£¬Èç¹û·µ»ØµÄ¾ÍÊÇPersonManger£¬ËµÃ÷clientºÍserver´¦ÓÚͬһ¸ö½ø³Ì£¬Ö±½Ó·µ»Ø£¬Èç¹û²»ÊÇ£¬·µ»Ø¸øÒ»¸ö´úÀí¶ÔÏó¡£
µ±È»×÷Ϊ´úÀí¶ÔÏó£¬Ò²ÊÇÐèҪʵÏÖ·þÎñ½Ó¿Ú
public class
Proxy implements PersonManger {
private IBinder mIBinder;
public Proxy(IBinder mIBinder) {
this.mIBinder =mIBinder;
}
@Override
public void addPerson(Person mPerson) {
Parcel data = Parcel.obtain();
Parcel replay = Parcel.obtain(); try {
data.writeInterfaceToken(DESCRIPTOR);
if (mPerson != null) {
data.writeInt(1);
mPerson.writeToParcel(data, 0);
} else {
data.writeInt(0);
}
mIBinder.transact (BinderObj.TRANSAVTION_addPerson,
data, replay, 0);
replay.readException();
} catch (RemoteException e){
e.printStackTrace();
} finally {
replay.recycle();
data.recycle();
}
} @Override
public List<Person> getPersonList() {
Parcel data = Parcel.obtain();
Parcel replay = Parcel.obtain();
List<Person> result = null;
try {
data.writeInterfaceToken(DESCRIPTOR);
mIBinder.transact (BinderObj.TRANSAVTION_getPerson,
data, replay, 0);
replay.readException();
result = replay.createTypedArrayList (Person.CREATOR);
}catch (RemoteException e){
e.printStackTrace();
} finally{
replay.recycle();
data.recycle();
}
return result;
} @Override
public IBinder asBinder() {
return null;
}
}
|
ÕâÀïµÄ´úÀí¶ÔÏóʵÖʾÍÊÇclient×îÖÕÄõ½µÄ´úÀí·þÎñ£¬Í¨¹ýÕâ¸ö¾Í¿ÉÒÔºÍServer½øÐÐͨÐÅÁË£¬Ê×ÏÈͨ¹ýParcel½«Êý¾ÝÐòÁл¯£¬È»ºóµ÷ÓÃ
remote.transact()½«·½·¨code£¬ºÍdata´«Êä¹ýÈ¥£¬¶ÔÓ¦µÄ»á»Øµ÷ÔÚÔÚServerÖеÄonTransact()ÖÐ
È»ºóÊÇÎÒÃǵÄServer½ø³Ì,onBind·½·¨·µ»ØmStub¶ÔÏó£¬Ò²¾ÍÊÇServerÖеÄBinderʵÌå¶ÔÏó
public class
ServerSevice extends Service {
private static final String TAG = "ServerSevice";
private List<Person> mPeople = new ArrayList<>();
@Override
public void onCreate() {
mPeople.add(new Person());
super.onCreate();
} @Nullable
@Override
public IBinder onBind(Intent intent) {
return mStub;
}
private BinderObj mStub = new BinderObj() {
@Override
public void addPerson(Person mPerson) {
if (mPerson==null){
mPerson = new Person();
Log.e(TAG,"null obj");
}
mPeople.add(mPerson);
Log.e(TAG,mPeople.size()+"");
} @Override
public List<Person> getPersonList() {
return mPeople;
}
};
}
|
×îÖÕÎÒÃÇÔÚ¿Í»§¶Ë½ø³Ì£¬bindService´«ÈëÒ»¸öServiceConnection¶ÔÏó£¬ÔÚÓë·þÎñ¶Ë½¨Á¢Á¬½Óʱ£¬Í¨¹ýÎÒÃǶ¨ÒåºÃµÄBinderObjµÄasInterface·½·¨·µ»ØÒ»¸ö´úÀí¶ÔÏó£¬ÔÙµ÷Ó÷½·¨½øÐн»»¥
public class
MainActivity extends AppCompatActivity {
private boolean isConnect = false;
private static final String TAG = "MainActivity";
private PersonManger personManger;
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView (R.layout.activity_main);
start();
findViewById (R.id.textView).setOnClickListener (new
View.OnClickListener() {
@Override
public void onClick(View v) {
if (personManger==null){
Log.e (TAG,"connect error");
return;
}
personManger.addPerson(new Person());
Log.e (TAG,personManger.getPersonList().size()+"");
}
});
} private void start() {
Intent intent = new Intent (this, ServerSevice.class);
bindService (intent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection mServiceConnection
= new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName
name, IBinder service) {
Log.e(TAG,"connect success");
isConnect = true;
personManger = BinderObj.asInterface(service);
List<Person> personList = personManger.getPersonList();
Log.e(TAG,personList.size()+"");
} @Override
public void onServiceDisconnected(ComponentName
name) {
Log.e(TAG,"connect failed");
isConnect = false;
}
};
}
|
ÕâÑùµÄ»°£¬Ò»´ÎÍê³ÉµÄ½ø³Ì¼äµÄ½»»¥¾ÍÍê³ÉÁË~ÊDz»ÊǸоõûÓÐÏëÏóÖÐÄÇôÄÑ£¬×îºó½¨Òé´ó¼ÒÔÚ²»½èÖú AIDL
µÄÇé¿öÏÂÊÖдʵÏÖ Client ºÍ Server ½ø³ÌµÄͨÐÅ£¬¼ÓÉî¶Ô Binder ͨÐŹý³ÌµÄÀí½â¡£
|