Panimula sa AIDL

Introduction Aidl



Ano ang AIDL

Ang AIDL ay ang pagpapaikli ng Android Interface Definition Language, na para sa android Maging proseso Ang panlabas na kahulugan ng interface na ibinigay ng access sa serbisyo.

Kailan gagamitin ang AIDL

Nagbibigay ang opisyal na dokumentasyon ng Android ng mga sitwasyon sa paggamit.



Using AIDL is necessary only if you allow clients from different applications to access your service for IPC and want to handle multithreading in your service. If you do not need to perform concurrent IPC across different applications, you should create your interface by implementing a Binder or, if you want to perform IPC, but do not need to handle multithreading, implement your interface using a Messenger. Regardless, be sure that you understand Bound Services before implementing an AIDL.

Ginagamit lamang ito kapag nais ng 'panlabas na proseso na i-access ang iyong Serbisyo' at 'Ang Iyong Serbisyo ay may mga tampok na multi-threaded'.
Ang serbisyo sa isang solong proseso, ang Binder ay sapat upang matugunan ang mga kinakailangan, sinusuportahan nito ang multi-threading. Para sa cross-process na solong thread, maaari mong gamitin ang Mensahe.



Paano gamitin ang AIDL

(1) Lumikha ng direktoryo ng AIDL



imahe

(2) Lumikha ng isang file na AIDL na pinangalanang IPerso

imahe



AS awtomatikong bumubuo ng code tulad ng sumusunod

package com.breakloop.aidlservice // Declare any non-default types here with import statements interface IPerso { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) }

Bagaman ang AIDL ay halos kapareho sa istraktura ng Interface ng JAVA, hindi ito gumagamit ng syntax ng JAVA.
Ang code na nabuo ng AS ay walang praktikal na paggamit. Sinasabi lamang nito sa coder kung anong mga pangunahing uri ang sinusuportahan ng AIDL.

(3) Magdisenyo ng dalawang pamamaraan

package com.breakloop.aidlservice interface IPerso { int getAge() String getName() }

Magbayad ng espesyal na pansin sa pangangailangan na Muling Buuin ang Proyekto pagkatapos isulat ang AIDL file, kung hindi man ang IPerso.Stub klase ay hindi mahahanap kapag ipinapatupad ang interface ng IPerso.

(4) Ipatupad ang interface ng IPerso

Tukuyin ang isang klase ng Perso, na minana mula sa IPerso.Stub.

public class Perso extends IPerso.Stub { @Override public int getAge() throws RemoteException { return 1 } @Override public String getName() throws RemoteException { return 'breakloop' } }

(5) Bumalik sa halimbawa ng interface ng IPerso

Lumikha ng isang pasadyang Serbisyo at ibalik ang halimbawa ng Perso sa onBind.

public class PersoInfo extends Service { private Perso mPerso public PersoInfo() { mPerso=new Perso() } @Override public IBinder onBind(Intent intent) { return mPerso } }

(6) Ang Remote na App ay gumagamit ng AIDL
Lumikha ng isang direktoryo ng AIDL sa Remote App at kopyahin ang IPerso.AIDL file sa direktoryong ito.

imahe

imahe

Napakahalaga upang matiyak ang pagkakapare-pareho ng mga AIDL file. Maraming mga problema ang sanhi ng hindi pagkakapare-pareho sa AIDL.

(7) Remote App upang makakuha ng halimbawa ng interface

public class MainActivity extends AppCompatActivity { private ServiceConnection mServiceConnection private IPerso mPerso @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mServiceConnection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { mPerso=IPerso.Stub.asInterface(iBinder) try { int age =mPerso.getAge() String name=mPerso.getName() String content='Name = '+name+'Age = '+age Toast.makeText(MainActivity.this, content, Toast.LENGTH_SHORT).show() Log.i(getClass().getName(), 'onServiceConnected: '+content) } catch (RemoteException e) { e.printStackTrace() } } @Override public void onServiceDisconnected(ComponentName componentName) { } } Intent intent=new Intent('android.intent.action.PERSO') intent.setPackage('com.breakloop.aidlservice') bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE) } }

Binigyang diin na ang mPerso = IPerso.Stub.asInterface (iBinder) ay nagko-convert ng Binder sa klase ng entidad ng IPerso.

Sa puntong ito, kumpleto ang tawag sa AIDL. Ngunit hindi ito natapos! Narito ang tanong: paano kung ginamit ang isang pasadyang klase?

Gumamit ng mga pasadyang klase sa AIDL

(1) Lumikha ng isang pasadyang klase ng BankCard

public class BankCard{ public String mCardID public int mAmount public BankCard(){ } }

(2) Napagtanto ng BankCard ang serialization

public class BankCard implements Parcelable{ public String mCardID public int mAmount public BankCard(){ } @Override public int describeContents() { return 0 } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public BankCard createFromParcel(Parcel in) { return new BankCard(in) } public BankCard[] newArray(int size) { return new BankCard[size] } } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeInt(mAmount) parcel.writeString(mCardID) } private BankCard(Parcel in) { mAmount = in.readInt() mCardID=in.readString() } }

(3) Lumikha ng BankCard AIDL
Mayroong dalawang puntos na dapat tandaan dito
(A) Ang pangalan ng file ng AIDL ay pare-pareho sa pasadyang pangalan ng klase! ! !
(B) Kailangan lamang isama ng AIDL ang dalawang linya ng impormasyon, Package at naka-serialize na pangalan ng klase. Dapat na maliit ang 'parcelable'! ! !
Ang nilalaman ng AIDL file ay ang mga sumusunod

package com.breakloop.aidlservice parcelable BankCard

I-recompile o i-synchronize ang proyekto! Hayaan ang proyekto na magkaroon ng kamalayan ng pagkakaroon ng BankCard! !

(4) Sanggunian ang klase ng BankCard sa IPerso.AIDL at magdagdag ng isang interface upang makuha ang klase ng BankCard

package com.breakloop.aidlservice import com.breakloop.aidlservice.BankCard interface IPerso { int getAge() String getName() BankCard getCard() }

(5) Kopyahin ang klase ng BankCard at BankCard.AIDL sa Remote App
Dapat pansinin na ang pangalan ng package ay dapat na pare-pareho.

imahe

I-recompile o i-synchronize ang proyekto! ! ! ! ! Hayaan ang proyekto na i-update ang interface! ! !

(6) Nakakuha ang Remote App ng halimbawa ng interface

@Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { mPerso=IPerso.Stub.asInterface(iBinder) try { int age =mPerso.getAge() String name=mPerso.getName() BankCard card=mPerso.getCard() String content='Name = '+name+'Age = '+age+' CardNum = '+card.mCardID+' Amount = '+card.mAmount Toast.makeText(MainActivity.this, content, Toast.LENGTH_SHORT).show() Log.i(getClass().getName(), 'onServiceConnected: '+content) } catch (RemoteException e) { e.printStackTrace() } }

Sa ngayon, ang pasadyang klase ay matagumpay na natawag.

Ngunit ang mga pasadyang klase ay karaniwang ginagamit nang mas kaunti. Habang nagbibigay ng IADL, ang paglabas ng mga pasadyang klase ay gagawing mas kumplikado ang paglabas at tataas ang posibilidad ng mga pagkakamali. Kung ikukumpara sa output SDK, walang kalamangan.