package Ġcom . xf hy . all in one . ipc . aid l Ċ Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Binder Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . os . Remote Callback List Ċ import Ġandroid . os . Remote Exception Ċ import Ġcom . xf hy . library . ext . log Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ Ċ /** Ċ Ġ* Ġ@ author Ġ: Ġxf hy Ċ Ġ* ĠCreate Ġtime Ġ: Ġ 2 0 2 0 / 1 2 / 1 5 Ġ 6 : 1 9 ĠAM Ċ Ġ* ĠDescription Ġ: Ġa idl ĠæľįåĬ¡ ç«¯ Service Ċ Ġ*/ Ċ class ĠA idl Remote Service Ġ: ĠService () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" xf hy _ aid l " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Person List Ġ= ĠCopy On Write ArrayList < Person ?> () ĊĠĠĠ Ġprivate Ġval Ġm Listener List Ġ= ĠRemote Callback List < IP erson ChangeListener ?> () ĊĊĠĠĠ Ġprivate Ġval Ġm Binder : ĠB inder Ġ= Ġobject Ġ: ĠIP erson Manager . Stub () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Person List (): ĠMutable List < Person ?> Ġ= Ġm Person List ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Person ( person : ĠPerson ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ" æľįåĬ¡ ç«¯ Ġadd Person () Ġå½ĵåīį çº¿ç¨ĭ Ġ: Ġ${ Thread . currentThread (). name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ" æľįåĬ¡ ç«¯ Ġadd Person () Ġperson Ġ= Ġ$ person ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Person List . add ( person ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Person In ( person : ĠPerson ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ" æľįåĬ¡ ç«¯ Ġadd Person In () Ġperson Ġ= Ġ$ person ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperson ?. name Ġ= Ġ" è¢« add Person In ä¿®æĶ¹ " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Person Out ( person : ĠPerson ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ" æľįåĬ¡ ç«¯ Ġadd Person Out () Ġperson Ġ= Ġ$ person }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperson ?. name Ġ= Ġ" è¢« add Person Out ä¿®æĶ¹ " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Person In out ( person : ĠPerson ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ" æľįåĬ¡ ç«¯ Ġadd Person In out () Ġperson Ġ= Ġ$ person }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperson ?. name Ġ= Ġ" è¢« add Person In out ä¿®æĶ¹ " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Person O new ay ( person : ĠPerson ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Person List . add ( person ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġregister Listener ( listener : ĠIP erson ChangeListener ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener List . register ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġunregister Listener ( listener : ĠIP erson ChangeListener ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener List . unregister ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// æŃ» å¾ªçİ¯ Ġæ¯ı éļĶ 5 ç§Ĵ æ·»åĬł ä¸Ģæ¬¡ person , éĢļçŁ¥ è§Ĥ å¯Ł èĢħ ĊĠĠĠ Ġprivate Ġval Ġservice Worker Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! Thread . currentThread (). is Inter rupted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperson Ġ= ĠPerson (" name ${ Random (). nextInt ( 1 0 0 0 0 )} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Person List . add ( person ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Data Change ( person ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġm Service Listener Thread Ġ= ĠThread ( service Worker ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ?): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcheck Ġ= Ġcheck Calling Or Self Permission (" com . xf hy . all in one . ipc . aid l . ACCESS _ PERSON _ SERVICE ") ĊĠĠĠĠĠĠĠ Ġif Ġ( check Ġ== ĠPackage Manager . PERMISSION _ DEN IED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG ," æ²¡æľī æĿĥéĻĲ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog ( TAG ," æľī æĿĥéĻĲ ") ĊĠĠĠĠĠĠĠ Ġreturn Ġm Binder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ Ġm Person List . add ( Person (" G aren ")) ĊĠĠĠĠĠĠĠ Ġm Person List . add ( Person (" D arius ")) ĊĊĠĠĠĠĠĠĠ Ġm Service Listener Thread . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġm Service Listener Thread . interrupt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Data Change ( person : ĠPerson ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcallback Count Ġ= Ġm Listener List . begin Broadcast () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcallback Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¿ĻéĩĮ try ä¸Ģä¸ĭ éģ¿åħį æľī å¼Ĥå¸¸ æĹ¶ æĹłæ³ķ è°ĥçĶ¨ finish Broadcast () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener List . get Broadcast Item ( i )?. on Person Data Changed ( person ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRemoteException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Listener List . finish Broadcast () ĊĠĠĠ Ġ} Ċ Ċ }