рдирдорд╕реНрддреЗ!
рдЖрдЬ рдореИрдВрдиреЗ рдЖрдкрдХреЛ Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЧрддрд┐рд╡рд┐рдзрд┐-рд╕реЗрд╡рд╛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ред рд╡рд┐рд╖рдп рдЗрд╕ рддрдереНрдп рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ рдХрд┐ рдЕрдХреНрд╕рд░ рдЖрдк рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ, рдХрд╣рддреЗ рд╣реИрдВ, AsyncTask рдореЗрдВ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рд╕рд░реНрд╡рд░ рдХреА рдпрд╛рддреНрд░рд╛ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕реА рд╕рдордп, рдЕрдХреНрд╕рд░ рдПрдХ рд╕рд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдпрд╣ рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдХрд╣реАрдВ рдирд╣реАрдВред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЙрдирдХреЗ рдмреАрдЪ рджреЛ-рддрд░рдлрд╝рд╛ рдмрд╛рддрдЪреАрдд рдХреА рд╕рд╣реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдореИрдВ рдПрдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдЖрдпрд╛ рдЬреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдореБрджреНрджреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рд╣рд╡рд╛рдИ рджреГрд╢реНрдп
рдЖрдЗрдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЪрд┐рддреНрд░ рдХреЛ рджреЗрдЦреЗрдВред

рдмрд╛рдж рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рджреЛ рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ - рдкреНрд░рдмрдВрдзрд┐рдд рдФрд░ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ред рдпреЗ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд╢рд░реНрддреЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдкреНрд░рдмрдВрдзрд┐рдд - рдпреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП Android рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (ContentProvider + ContentObserver system) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕реВрдЪрдирд╛рдПрдВ рд╣реИрдВред UI рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЪреАрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдЕрдзрд┐рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рдИрд╡реЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рдореЗрдВ рдХреБрдЫ рдСрдкрд░реЗрд╢рди рдХрд░рдирд╛ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓реЗрдЦрди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рдиреЗ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред
рддреЛ, рдпрд╣ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЪрд╛рд░ рдореБрдЦреНрдп рдШрдЯрдХреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрд░реНрде рд╣реИ:
- рдПрдХ рдорд╛рдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рдирдЪрд┐рддреНрд░рдг рднреВрдорд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЧрддрд┐рд╡рд┐рдзрд┐
- рд╕реЗрд╡рд╛ - рдПрдХ рд╕реЗрд╡рд╛ рдЬреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдзрд╛рдЧреЗ рдореЗрдВ рднрд╛рд░реА рдХрд╛рдо рдХрд░рддреА рд╣реИ
- ServiceHelper - рд╣рдорд╛рд░рд╛ рдШрдЯрдХ рдЬреЛ рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдФрд░ рд╕реЗрд╡рд╛ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦреЗрдЧрд╛ рдФрд░ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛
- ContentProvider рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдШрдЯрдХ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ UI рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рдмрдВрдзрд┐рдд рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рд╕реЗрд╡рд╛
рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХрдорд╛рдВрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЗрд░рд╛рджреЗ рдПрдХреНрд╕реНрдЯреНрд░рд╛ рдореЗрдВ рд╡рд╣рди рдХрд░рддреА рд╣реИ:
- рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдХреНрд░рд┐рдпрд╛
- рдЖрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рддрд░реНрдХ
- ResultReceiver
рд╕реЗрд╡рд╛ рдкрд╛рд░рд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рджреЗрдЦрддреА рд╣реИ, рдЙрд╕реЗ рдЙрд╕ рдХрдорд╛рдВрдб рдкрд░ рдореИрдк рдХрд░рддреА рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдХрдорд╛рдВрдб рдХреЗ рддрд░реНрдХреЛрдВ рдФрд░ ResultReceiver рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
рд╕реЗрд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдк:
protected void onHandleIntent(Intent intent) { String action = intent.getAction(); if (!TextUtils.isEmpty(action)) { final ResultReceiver receiver = intent.getParcelableExtra(EXTRA_STATUS_RECEIVER); if (AwesomeHandler.ACTION_AWESOME_ACTION.equals(action)) { new AwesomeHandler().execute(intent, getApplicationContext(), receiver); }
рдпрд╣рд╛рдВ, рдмрдбрд╝реЗ рдореЗрдВ рдЕрдЧрд░ рдмреНрд▓реЙрдХ, рд╡рд╛рдВрдЫрд┐рдд рдХрдорд╛рдВрдб рдмрд╕ рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИред рдмреЗрд╢рдХ, рдпрд╣рд╛рдВ рдЖрдк рдбреНрд░рд╛рдЗрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрдлреНрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдореИрдк рдПрдХреНрд╢рди-рд╣реИрдВрдбрд▓рд░ рдкрдХрдбрд╝реЛ, рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛рдУ, рдЖрдИрдУрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЖрджрд┐, рд▓реЗрдХрд┐рди рдпрд╣ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред
рд╣реИрдВрдбрд▓рд░
рд╣реИрдВрдбрд▓рд░ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдкрдиреЗ рднреАрддрд░ рд╕рдорд╛рд╣рд┐рдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВред рдореЗрд░реЗ рд▓рд┐рдП, рд╡реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рджрд┐рдЦрддрд╛ рд╣реИ:
public abstract class BaseIntentHandler { public static final int SUCCESS_RESPONSE = 0; public static final int FAILURE_RESPONSE = 1; public final void execute(Intent intent, Context context, ResultReceiver callback) { this.callback = callback; doExecute(intent, context, callback); } public abstract void doExecute(Intent intent, Context context, ResultReceiver callback); private ResultReceiver callback; private int result; public int getResult() { return result; } protected void sendUpdate(int resultCode, Bundle data) { result = resultCode; if (callback != null) { callback.send(resultCode, data); } } }
рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдкрд░, рдореИрдВрдиреЗ HTTP рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореВрд▓ рдЖрджреЗрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣, рдлрд┐рд░ рд╕реЗ, рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдЖрдзрд╛рд░ рдХрдорд╛рдВрдб рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ doExecute рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ SendUpdate рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдХреЛрдб (рд╕рдлрд▓рддрд╛ / рддреНрд░реБрдЯрд┐) рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдкрд╛рд╕ рдХрд░реЗрдВред
ServiceHelper
ServiceHelper UI рдФрд░ рд╕реЗрд╡рд╛ рдХреЗ рдмреАрдЪ рдХреА рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкрд░рдд рд╣реИ, UI рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХреЙрд▓ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреИрдХреЗрдЬрд┐рдВрдЧ рдЗрдВрдЯреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рд╕реЗрд╡рд╛ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╕рдордиреНрд╡рдп рднреА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЙрди рдХрдорд╛рдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВред
рддреЛ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
- UI рдХреЙрд▓ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐, рд╕рд╣рд╛рдпрдХ рд░рд┐рдЯрд░реНрди рдЕрдиреБрд░реЛрдз рдЖрдИрдбреА
- рд╣реЗрд▓реНрдкрд░ рдХреЛ рдЕрдиреБрд░реЛрдз рдЖрдИрдбреА рдпрд╛рдж рд╣реИ
- рдПрдХ рдЗрд░рд╛рджрд╛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ ResultReceiver рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реЗрд╡рд╛ рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИ
- рдЬрдм рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд░ рд▓реЗрддреА рд╣реИ, рддреЛ рд╕рднреА рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ UI рдШрдЯрдХ onReceiveResult рдореЗрдВ рдЕрдзрд┐рд╕реВрдЪрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ
рдЖрдЗрдП рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:
public class ServiceHelper { private ArrayList<ServiceCallbackListener> currentListeners = new ArrayList<ServiceCallbackListener>(); private AtomicInteger idCounter = new AtomicInteger(); private SparseArray<Intent> pendingActivities = new SparseArray<Intent>(); private Application application; ServiceHelper(Application app) { this.application = app; } public void addListener(ServiceCallbackListener currentListener) { currentListeners.add(currentListener); } public void removeListener(ServiceCallbackListener currentListener) { currentListeners.remove(currentListener); }
рд╕рд╣рд╛рдпрдХ рд╕реЗрд╡рд╛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд░рдЦрддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рд╣реИ рдХрд┐ рдЯреАрдореЛрдВ рдХреЗ рдХрд╛рдо рдкрд░ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬреА рдЬрд╛рдПрдВрдЧреАред
private Intent createIntent(final Context context, String actionLogin, final int requestId) { Intent i = new Intent(context, WorkerService.class); i.setAction(actionLogin); i.putExtra(WorkerService.EXTRA_STATUS_RECEIVER, new ResultReceiver(new Handler()) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { Intent originalIntent = pendingActivities.get(requestId); if (isPending(requestId)) { pendingActivities.remove(requestId); for (ServiceCallbackListener currentListener : currentListeners) { if (currentListener != null) { currentListener.onServiceCallback(requestId, originalIntent, resultCode, resultData); } } } } }); return i; }
рдпрд╣ рд╣рдорд╛рд░рд╛ рдЗрд░рд╛рджрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд╕реЗрд╡рд╛ рдореЗрдВ рднреЗрдЬ рджреЗрдВрдЧреЗред
рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдЬрдЧрд╣ рд▓рдВрдмрд┐рдд рд╣реИ - рдпрд╣ рд╕реЗрд╡рд╛ рдкрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИред рдЪреВрдВрдХрд┐ рдЬрдм рд╣рдо ServiceHelper рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдЖрдИрдбреА рдорд┐рд▓рддреА рд╣реИ, рд╣рдо рд╣рдореЗрд╢рд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХред
public boolean isPending(int requestId) { return pendingActivities.get(requestId) != null; } private int createId() { return idCounter.getAndIncrement(); } private int runRequest(final int requestId, Intent i) { pendingActivities.append(requestId, i); application.startService(i); return requestId; }
рдЕрдм рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдкрд░ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░реЗрдЧрд╛:
public int doAwesomeAction(long personId) { final int requestId = createId(); Intent i = createIntent(application, AwesomeHandler.ACTION_AWESOME_ACTION, requestId); i.putExtra(AwesomeHandler.EXTRA_PERSON_ID, personId); return runRequest(requestId, i); }
рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрддрдиреА рд╣реА рд╣реЛрдВрдЧреА рдЬрд┐рддрдиреА рдЖрдкрдХреА рд╕реЗрд╡рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИрдВред
рдЧрддрд┐рд╡рд┐рдзрд┐
рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ:
public interface ServiceCallbackListener { void onServiceCallback(int requestId, Intent requestIntent, int resultCode, Bundle data); }
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА рд╕рд╛рд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдлрд┐рд░, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП onServiceCallback рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдорд╛рдирдХ рдХреЙрд▓рдмреИрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдЖрдкрдХреЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рдореЗрдВ рд╕реБрд╢реЛрднрд┐рдд рд╣реИред
public abstract class AwesomeBaseActivity extends FragmentActivity implements ServiceCallbackListener { private ServiceHelper serviceHelper; protected AwesomeApplication getApp() { return (AwesomeApplication ) getApplication(); } protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); serviceHelper = getApp().getServiceHelper(); } protected void onResume() { super.onResume(); serviceHelper.addListener(this); } protected void onPause() { super.onPause(); serviceHelper.removeListener(this); } public ServiceHelper getServiceHelper() { return serviceHelper; } public void onServiceCallback(int requestId, Intent requestIntent, int resultCode, Bundle resultData) { } }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░реНрд╕ рдФрд░ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░реНрд╕ рд╕рд░реНрд╡рд┐рд╕рд╣реЗрд▓реНрдкрд░ рд╕реЗ рдЙрд╕рдХреЗ рдСрдирд╕реНрдХреНрдпреВрдо / рдСрдирдкреЙрдЬ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреИрд╕реЗ рдХрд░рддреА рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рд╕реНрдХреНрд░реАрди рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВ, рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЖрддрд╛ рд╣реИ onServiceCallback:
- requestId - рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
- requestIntent - рдореВрд▓ рдЖрд╢рдп рдЬреЛ рд╣рдордиреЗ рднреЗрдЬрд╛ рд╣реИ
- рдкрд░рд┐рдгрд╛рдо рдХреЛрдб - рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо рдХреЛрдб
- рдкрд░рд┐рдгрд╛рдордбреЗрдЯрд╛ - рдбреЗрдЯрд╛
рдЕрдм, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд╣рдо рд╣рдореЗрд╢рд╛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЗ рдвреЗрд░ рдХреЗ рдмрд┐рдирд╛ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рд╕реЗ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ, рд╣рдо рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрд░реЛрдз рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдорд╣рд╛рди рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИред
class AwesomeActivity extends AwesomeBaseActivity { private int superRequestId; ... private void myMethod() { superRequestId = getServiceHelper().doAwesomeAction(); } public void onServiceCallback(int requestId, Intent requestIntent, int resultCode, Bundle resultData) { if (AwesomeHandler.ACTION_AWESOME_ACTION.equals(requestIntent.getAction()) {
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреБрд░реЛрдз рдЖрдИрдбреА рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдПрдХ рд▓рдВрдмрд┐рдд рдЪреЗрдХ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреБрдХреНрд░рдо рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢реБрд░реВ рдХреА, рд╕реНрдкрд┐рдирд░ рдиреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛
- 2 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдмрдВрдж рдХрд░ рджрд┐рдпрд╛
- рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд╣рд▓реЗ рд╣реА рдкреВрд░реА рд╣реЛ рдЪреБрдХреА рд╣реИ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛ рдЧрдпрд╛
- рдпрд╣рд╛рдБ рд╣рдо onResume рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЯреНрд╡рд┐рд╕реНрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ
рдпрд╛рдиреА рдЕрдЧрд░ рд╣рдореЗрдВ рдЬрд░реВрд░рдд рд╣реИ рддреЛ рдмрд╕ getServiceHelper () .Pending (рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ) рдХреЙрд▓ рдХрд░реЗрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рд╢рд╛рдпрдж рдпрд╣реА рд╕рдм рд╣реИред
рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВ рдЗрд╕ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХрддрд╛ рдпрд╛ рдЗрд╕рдХреА рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХрд╛ рдвреЛрдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐, рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдЖрджрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рддрдХ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рд╕рднреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ 100% рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдХреБрдЫ рдЧрд╛рдпрдм рд╣реИ, рддреЛ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рд╕реЗ:
- рдкреНрд░рдЧрддрд┐ рдХреЛрдб рдХреЛ рд╕рдлрд▓рддрд╛ рдФрд░ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬреЛрдбрд╝ рджреЗрдВ, рддреЛ рд╕реЗрд╡рд╛ рд╕реЗ рдХрд╛рд░реНрдп рдХреА рдкреНрд░рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, ProgressBar рдХрд╣рддреЗ рд╣реИрдВ
- рдХрд╛рд░реНрдп рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЬрдХрдбрд╝рдирд╛
- рдФрд░ рдПрдоред рдкреАред
рдПрдХ рдЕрдиреНрдп рд╡рд┐рд╡рд░рдг, рдореЗрд░рд╛ ServiceHelper рдХреЛрдб рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ UI рдереНрд░реЗрдб рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ
рдЖрдкрдХреЛ ServiceHelper рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред
UPD : рдореИрдВрдиреЗ GitHub рдкрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдЪрд┐рддреНрд░рдг рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛:
https://github.com/TheHiddenDuck/android-service-archUPD 2 : рдереНрд░реЗрдб рдкреВрд▓ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ