AIDL (Android рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рднрд╛рд╖рд╛) рдФрд░ рдЕрдВрддрд░-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрдЪрд╛рд░ (IPC)

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо Android IPC рдореЗрдВ AIDL рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
рдЗрд╕рдореЗрдВ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред

рд▓реЗрдЦ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ


рд╕реЗрд╡рд╛ рдПрдХ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд┐рдирд╛ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдПрдХ рдШрдЯрдХ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рдФрд░ / рдпрд╛ рд▓рдВрдмрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

Android рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░


рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдлрд╛рдпрджреЗ:

рдиреБрдХрд╕рд╛рди:

AIDL

рд╢рд╛рдмреНрджрд┐рдХ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ - рдПрдВрдбреНрд░реЙрдЗрдб рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ред рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕реАрдзреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдУрдПрд╕ рдЖрджрд┐рдо рдореЗрдВ рдЬрд╛рд╡рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЕрдкрдШрдЯрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдЖрдИрдбреАрдПрд▓ рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ рдорд╛рдирдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ:

AIDL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, java рдХреЛрдб рд╕реНрдЯреИрдм рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдГ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛


рд╣рдордиреЗ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд▓рд░реА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдФрд░ рдлреЛрдЯреЛ-рд╢реЗрдпрд░рд┐рдВрдЧ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рддрд╕реНрд╡реАрд░реЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реЗрд╡рд╛ рдХреЗ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╣реИрдВ: рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (рдПрд▓реНрдмрдореЛрдВ, рдлрд╝реЛрдЯреЛ, рджреЛрд╕реНрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА), рдЙрдирдХреЗ рдЕрдкрдбреЗрдЯ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╣рд░ рдЪреАрдЬред рд╕реЗрд╡рд╛ рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕рдордп рддреИрдпрд╛рд░ рд╣реИред
рдиреАрдЪреЗ рдХреЛрдб рдХреЗ рдкреНрд░рдореБрдЦ рдЦрдВрдб рд╣реИрдВ рдФрд░ рдПрдХ рдЖрджрд┐рдо рд╕реЗрд╡рд╛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдЖрдИрдбреАрдПрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЗрд╡рд╛ рдФрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

IDataSourceService.aidl - рд╕реЗрд╡рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕:
packagecom.umobisoft.habr.aidlexample.common; import com.umobisoft.habr.aidlexample.common.IDataSourceServiceListener; interfaceIDataSourceService{ voidloadAlbums(in IDataSourceServiceListener listener); тАж } 


IDataSourceServiceListener.aidl - рд╕реЗрд╡рд╛ рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕:
  package com.umobisoft.habr.aidlexample.common; import com.umobisoft.habr.aidlexample.common.pojo.Album; interface IDataSourceServiceListener{ oneway void albumItemLoaded(in Album a); } 


рдбреЗрдЯрд╛ рджреЛ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рд░реНрд╕рд▓реЗрдмрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ - рдПрд▓реНрдмрдо рдФрд░ рдлреЛрдЯреЛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рдлрд╛рдЗрд▓реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрдм OS рдЖрджрд┐рдо рд╕реЗ рдЬрд╛рд╡рд╛ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирд┐рд░реНрдорд╛рддрд╛ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рд░реНрд╕рд▓реЗрдмрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░рд╛рдЗрдЯ рдЯрд╛рдЗрдк рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
  @Override public void writeToParcel(Parcel out, int flags) { try{ out.writeLong(id); out.writeString(name); out.writeTypedList(photos); }catch (Exception e) { Log.e(TAG, "writeToParcel", e); } } 


рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рднреА рд╣реИ, рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рд╡рд╕реНрддреБ рдХреЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ / рдЕрд╡рд╕реНрдерд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд░рдорд╛рдВрдХрди рдФрд░ рд╡рд┐рдЪрд▓рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  @Override public int describeContents() { // TODO Auto-generated method stub return 0; } 


рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдЙрдиреНрд╣реЗрдВ рдкрд╛рд░реНрд╕рд▓реЗрдмрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рдЕрдпреЛрдЧреНрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдорд╛рдирдХ рдЕрднреНрдпрд╛рд╕ рдХреНрд░рд┐рдПрдЯрд░ рдХреЛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:

  private void readFromParcel(Parcel in) { try{ id = in.readLong(); name = in.readString(); photos.clear(); in.readTypedList(photos, Photo.CREATOR); }catch (Exception e) { Log.e(TAG, "readFromParcel", e); } } 


рдЧрддрд┐рд╡рд┐рдзрд┐ рдСрдирдХреНрд░рд┐рдПрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реЗрд╡рд╛ (рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛) рд╢реБрд░реВ рдХрд░рддреА рд╣реИ

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView)findViewById(R.id.album_text); Intent serviceIntent = newIntent(this, DataSourceService.class); startService(serviceIntent); connectToService(); } 


рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рдПрдХ рд╣реА рдЪрд░рдг рдореЗрдВ, рдпрд╣ рд╕реЗрд╡рд╛ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ:

  private void connectToService() { Intent intent = newIntent(this, DataSourceService.class); this.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); } 


рд╕реЗрд╡рд╛ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдпрд╣ ServiceConnection рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рджреМрд░рд╛рди IDataSourceServiceListener.Stub рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рд╕рдВрджреЗрд╢ рд╢реНрд░реЛрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрд╡рд╛ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  private ServiceConnection serviceConnection = newServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i(TAG, "Service connection established"); serviceApi = IDataSourceService.Stub.asInterface(service); try { mainListener = newIDataSourceServiceListener.Stub() { @Override publicvoidalbumItemLoaded(final Album a) throwsRemoteException { mToastHandler.post(new Thread(){ publicvoid run(){ Toast.makeText(HabrahabrAIDLExampleActivity.this, a.toString(), Toast.LENGTH_LONG).show(); textView.setText(a.toString()); } }); } }; serviceApi.loadAlbums(mainListener); } catch (RemoteException e) { Log.e(TAG, "loadAlbums", e); } } @Override publicvoidonServiceDisconnected(ComponentName name) { Log.i(TAG, "Service connection closed"); serviceApi = null; connectToService(); } }; 


рдЬрдмрдХрд┐ StartedService рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЕрдЧрд░ рдореБрдлреНрдд рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рддрдХ рдШрдЯ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд┐рдирд╛ рд╕реЗрд╡рд╛ рдХреЛ рдорд╛рд░ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, onServiceDisconnected рдкрджреНрдзрддрд┐ рдореЗрдВ, рд╣рдо рдлрд┐рд░ рд╕реЗ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрд░реЛрдд рдХреЛрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдПрдЖрдИрдбреАрдПрд▓ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред рд╕рдВрдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдпрд╣рд╛рдВ рд╣реИ ред
рдПрдВрдбреНрд░реЙрдЗрдб рдорд╛рд░реНрдХреЗрдЯ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрд▓рдмреНрдз рд╣реИред

AndroidDevelopers рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди:
рд╕реЗрд╡рд╛рдПрдБ: developer.android.com/guide/topics/fundamentals/services.html
AIDL: developer.android.com/guide/developing/tools/aidl.html

Source: https://habr.com/ru/post/In139432/


All Articles