рдХрд╛рд░реНрдп рдЕрдиреБрд╕реВрдЪрдХ рд╡рд┐рдХрд╛рд╕



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

рд╣рдореЗрдВ рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рдЪрд╛рд╣рд┐рдП?

рдЖрдЗрдП рддреБрд░рдВрдд рдпрд╣ рддрдп рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд┐рд╖рдп Android рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИ:

  1. рдРрд╕реЗ рдХрдИ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рдмрд╛рд╣рд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ;
  2. рдкреНрд░рдгрд╛рд▓реА рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╢реБрднрд╛рд░рдВрдн рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреА рд╣реИ;
  3. рдпрд╣ рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдХрд░рдг рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВред

рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдХрд╛рд▓рдХреНрд░рдо


Android 0

рдЕрд▓рд╛рд░реНрдордореИрди, рд╣реИрдВрдбрд▓рд░, рд╕реЗрд╡рд╛


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



2018 рдХреЗ рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЖрдкрджрд╛ рдХреЗ рдкреИрдорд╛рдиреЗ рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд┐рд╕реА рдиреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХреА рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХрд┐рддрдирд╛ рдХрд╛рдо рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдиреЗ рд╡рд╣реА рдХрд┐рдпрд╛ рдЬреЛ рд╡реЗ рдЪрд╛рд╣рддреЗ рдереЗ рдФрд░ рдЬрдм рд╡реЗ рдЪрд╛рд╣рддреЗ рдереЗред

рдкреЗрд╢реЗрд╡рд░реЛрдВ :
рд╣рд░ рдЬрдЧрд╣ рдЙрдкрд▓рдмреНрдз;
рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реБрд▓рднред

рд╡рд┐рдкрдХреНрд╖ :
рд╕рд┐рд╕реНрдЯрдо рд╣рд░ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ;
рд╕реНрдерд┐рддрд┐ рд╕реЗ рдХреЛрдИ рдкреНрд░рдХреНрд╖реЗрдкрдг рдирд╣реАрдВ;
рдПрдкреАрдЖрдИ рдиреНрдпреВрдирддрдо рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

Android 5. рд▓реЙрд▓реАрдкреЙрдк

JobScheduler


5 (!) рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж, 2015 рдХреЗ рдХрд░реАрдм, Google рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдХреНрд╖рдорддрд╛ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдЙрдирдХреЗ рдлреЛрди рдХреЗрд╡рд▓ рдПрдХ рдореЗрдЬ рдкрд░ рдпрд╛ рдЙрдирдХреА рдЬреЗрдм рдореЗрдВ рдЭреВрда рдмреЛрд▓рдХрд░ рдХрдо рдЪрд▓ рд░рд╣реЗ рдереЗред

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

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

public class JobSchedulerService extends JobService { @Override public boolean onStartJob(JobParameters params) { doWork(params); return false; } @Override public boolean onStopJob(JobParameters params) { return false; } } 

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

 JobInfo task = new JobInfo.Builder(JOB_ID, serviceName) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) .setRequiresDeviceIdle(true) .setRequiresCharging(true) .build(); JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE); scheduler.schedule(task); 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреБрдЫ рднреА рдирд╣реАрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рддрдВрддреНрд░ рдХреЗрд╡рд▓ рдПрдкреАрдЖрдИ 21 рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб 5.0 рдХреА рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рдордп рд╕рднреА рдкреБрд░рд╛рдиреЗ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдмрдВрдж рдХрд░рдирд╛ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ (3 рд╕рд╛рд▓ рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЕрднреА рднреА рдЪрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ)ред

рдкреЗрд╢реЗрд╡рд░реЛрдВ :
рдПрдкреАрдЖрдИ рд╕рд░рд▓ рд╣реИ;
рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЗ рд▓рд┐рдП рд╢рд░реНрддреЗрдВред

рд╡рд┐рдкрдХреНрд╖ :
рдЙрдкрд▓рдмреНрдз рдПрдкреАрдЖрдИ 21 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдкреАрдЖрдИ 23 рдХреЗ рд╕рд╛рде;
рдЧрд▓рддреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

Android 5. рд▓реЙрд▓реАрдкреЙрдк

Gcm рдиреЗрдЯрд╡рд░реНрдХ рдореИрдиреЗрдЬрд░


JobScheduler - GCM рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рднреА рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдкреАрдЖрдИ 9 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ред рд╕рдЪ рд╣реИ, рдЗрд╕рдХреЗ рдмрджрд▓реЗ рдореЗрдВ Google Play рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдЬреЙрдмрд╕рдХреНрдпреВрд▓рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рди рдХреЗрд╡рд▓ рдПрдВрдбреНрд░реЙрдЗрдб рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рд╣реБрдИ, рдмрд▓реНрдХрд┐ рдЬреАрдкреАрдПрд╕ рд╕реНрддрд░ рдкрд░ рднреАред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдврд╛рдВрдЪреЗ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЛ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рдЕрдкрдиреЗ рднрд╡рд┐рд╖реНрдп рдХреЛ рдЬреАрдкреАрдПрд╕ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЙрд╕рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдзрдиреНрдпрд╡рд╛рджред

рд╕рдм рдХреБрдЫ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИред рд╕рдорд╛рди рд╕реЗрд╡рд╛:

 public class GcmNetworkManagerService extends GcmTaskService { @Override public int onRunTask(TaskParams taskParams) { doWork(taskParams); return 0; } } 

рдПрдХ рд╣реА рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ:

 OneoffTask task = new OneoffTask.Builder() .setService(GcmNetworkManagerService.class) .setTag(TAG) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) .setRequiresCharging(true) .build(); GcmNetworkManager mGcmNetworkManager = GcmNetworkManager.getInstance(this); mGcmNetworkManager.schedule(task); 

рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдпрд╣ рд╕рдорд╛рдирддрд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдФрдЬрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рд░рд▓ рдкреНрд░рд╡рд╛рд╕рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╕реЗ рддрдп рдХреА рдЧрдИ рдереАред

рдкреЗрд╢реЗрд╡рд░реЛрдВ :
JobScheduler рдХреЗ рд╕рдорд╛рди рдПрдкреАрдЖрдИ;
рдЙрдкрд▓рдмреНрдз рдПрдкреАрдЖрдИ 9 рдХреЗ рд╕рд╛рде рд╢реБрд░реВред

рд╡рд┐рдкрдХреНрд╖ :
рдЖрдкрдХреЗ рдкрд╛рд╕ Google Play Services рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдЧрд▓рддреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

Android 5. рд▓реЙрд▓реАрдкреЙрдк

WakefulBroadcastReceiver


рдЖрдЧреЗ, рдореИрдВ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рддрдВрддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рд▓рд┐рдЦреВрдВрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЙрдмрд╕реНрдХреНрд░рд╛рдЗрдбрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реАрдзреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрд╣ WakeLock рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░рд┐рдд WakefulBroadcastReceiver рд╣реИред

WakeLock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕рд╕реНрдкреЗрдВрдб рдореЗрдВ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд╕рдХреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦреЗрдВред рдпрджрд┐ рд╣рдо рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
WakeLock рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдк рдЗрд╕рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: CPU, рд╕реНрдХреНрд░реАрди рдпрд╛ рдХреАрдмреЛрд░реНрдб рдХреЛ рдкрдХрдбрд╝реЗрдВред

 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE) PowerManager.WakeLock wl = pm.newWakeLock(PARTIAL_WAKE_LOCK, "name") wl.acquire(timeout); 

рдЗрд╕ рддрдВрддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, WakefulBroadcastReceiver рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡реЗрдХреЙрдХ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВред

 public class SimpleWakefulReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent service = new Intent(context, SimpleWakefulService.class); startWakefulService(context, service); } } 

рд╕реЗрд╡рд╛ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдЗрд╕реА рддрд░рд╣ рдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред

4 рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЗрд╕ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрд╕реАрд╡рд░ рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╡рд░реНрдгрди developer.android.com рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

  • JobScheduler;
  • SyncAdapter;
  • DownloadManager;
  • рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП FLAG_KEEP_SCREEN_ONред

Android 6. рдорд╛рд░реНрд╢рдореИрд▓реЛ

DozeMode: рдЪрд▓рддреЗ-рдЪрд▓рддреЗ рд╕реЛ рдЬрд╛рдУ


рддрдм Google рдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреБрдХреВрд▓рди рд╢реБрд░реВ рдХрд┐рдПред рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрдиреБрдХреВрд▓рди рд╣реИ рд╡рд╣ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдорд╛ рд╣реИред

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

рдЬрдм DozeMode рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрд╡реЗрджрди рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ:

  • рд╕рд┐рд╕реНрдЯрдо рд╕рднреА WakeLock рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ;
  • рдЕрд▓рд╛рд░реНрдо рдореИрдирдЬрд░ рдореЗрдВ рджреЗрд░реА рд╣реЛ рд░рд╣реА рд╣реИ;
  • рдЬреЙрдмрд╕реНрдХреНрд░реВрдбрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ;
  • рд╕рд┐рдВрдХ рдПрдбреЗрдкреНрдЯрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ;
  • рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдкрд╣реБрдВрдЪ рд╕реАрдорд┐рдд рд╣реИред

рдЖрдк рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╢реНрд╡реЗрддрд╕реВрдЪреА рдореЗрдВ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ DozeMode рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рди рдЖрдП, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд╕реИрдорд╕рдВрдЧ рдиреЗ рдЗрд╕ рд╕реВрдЪреА рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ред

Android 6. рдорд╛рд░реНрд╢рдореИрд▓реЛ

AppStandby: рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ


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

  • рдЕрдЧреНрд░рднреВрдорд┐ рдореЗрдВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ;
  • рдПрдХ рд╕рдХреНрд░рд┐рдп рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдирд╣реАрдВ рд╣реИ;
  • рдЕрдкрд╡рд░реНрдЬрди рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред

Android 7. рдиреВрдЧрд╛рдЯ

рдкреГрд╖реНрдарднреВрдорд┐ рдЕрдиреБрдХреВрд▓рдиред рджреБрд░реНрдмрд▓


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

  • CONNECTIVITY_ACTION;
  • ACTION_NEW_PICTURE;
  • ACTION_NEW_VIDEOред

Android 7. рдиреВрдЧрд╛рдЯ

FirebaseJobDispatcher


рдЙрд╕реА рд╕рдордп, рдЯрд╛рд╕реНрдХ рд▓реЙрдиреНрдЪ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдлрд╛рдпрд░рдмреЗрд╕реЗрдЬрд╝рдмреЙрд╕реНрдкрд╛рдЗрдЪрд░ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкреВрд░рд╛ GCM NetworkManager рдерд╛, рдЬрд┐рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд╛ рддрдВрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдереЛрдбрд╝рд╛ рдФрд░ рд▓рдЪреАрд▓рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред

рдиреЗрддреНрд░рд╣реАрди, рд╕рдм рдХреБрдЫ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рджрд┐рдЦрддрд╛ рдерд╛ред рд╕рдорд╛рди рд╕реЗрд╡рд╛:

 public class JobSchedulerService extends JobService { @Override public boolean onStartJob(JobParameters params) { doWork(params); return false; } @Override public boolean onStopJob(JobParameters params) { return false; } } 

рдЙрдирдХреЗ рдмреАрдЪ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдЙрдирдХреЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдереАред рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░ рд╡рд╣ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ рд░рдгрдиреАрддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдерд╛ред

рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд▓реЙрдиреНрдЪ рд╕рдордп рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред

 FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context)); Job task = dispatcher.newJobBuilder() .setService(FirebaseJobDispatcherService.class) .setTag(TAG) .setConstraints(Constraint.ON_UNMETERED_NETWORK, Constraint.DEVICE_IDLE) .build(); dispatcher.mustSchedule(task); 

рдкреЗрд╢реЗрд╡рд░реЛрдВ :
JobScheduler рдХреЗ рд╕рдорд╛рди рдПрдкреАрдЖрдИ;
рдЙрдкрд▓рдмреНрдз рдПрдкреАрдЖрдИ 9 рдХреЗ рд╕рд╛рде рд╢реБрд░реВред

рд╡рд┐рдкрдХреНрд╖ :
рдЖрдкрдХреЗ рдкрд╛рд╕ Google Play Services рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдЧрд▓рддреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдЬреАрдкреАрдПрд╕ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЙрддреНрд╕рд╛рд╣рдЬрдирдХ рдерд╛ред рд╣рдордиреЗ рднреА рдЦреЛрдЬ рдХреА, рд▓реЗрдХрд┐рди рдЕрдВрддрддрдГ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╛рдпрд╛:





Google рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреЗ рдХрд╛рд░реНрдп рдХрдИ рд╡рд░реНрд╖реЛрдВ рддрдХ рдЦреБрд▓реЗ рд░рд╣рддреЗ рд╣реИрдВред

Android 7. рдиреВрдЧрд╛рдЯ

Android рдиреМрдХрд░реА рдПрд╡рд░рдиреЛрдЯ рджреНрд╡рд╛рд░рд╛


рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рдореБрджрд╛рдп рдЗрд╕реЗ рдмрд░реНрджрд╛рд╢реНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, рдФрд░ рдПрд╡рд░рдиреЛрдЯ рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрд╡-рдирд┐рд░реНрдорд┐рдд рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрд╡рд░рдиреЛрдЯ рд╕реЗ рд╕рдорд╛рдзрд╛рди рдерд╛ рдЬреЛ рдЦреБрдж рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдФрд░ "рд▓реЛрдЧреЛрдВ рдореЗрдВ рдорд┐рд▓рд╛"ред

рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдкрдиреЗ рдкреВрд░реНрд╡рд╡рд░реНрддрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдерд╛ред
рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕рдВрд╕реНрдерд╛ рдкреНрд░рдХрдЯ рд╣реБрдИ рд╣реИред рдЬреЛрдмрд╕реЗрдХреНрдпреВрд▓рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдП рдЧрдП рдереЗред

 class SendLogsJobCreator : JobCreator { override fun create(tag: String): Job? { when (tag) { SendLogsJob.TAG -> return SendLogsJob() } return null } } 

рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рд╣реИ, рдЬреЛ рд╕реНрд╡рдпрдВ рдХрд╛рд░реНрдп рд╣реИред JobScheduler рдореЗрдВ, рдпрд╣ рд╕рдм onStartJob рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕реНрд╡рд┐рдЪ рдореЗрдВ рдбрдВрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

 class SendLogsJob : Job() { override fun onRunJob(params: Params): Result { return doWork(params) } } 

рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрд╡рд░рдиреЛрдЯ рдиреЗ рднреА рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЬреЛрдбрд╝рд╛, рдЬреИрд╕реЗ рдХрд┐ рджреИрдирд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛, рдЕрджреНрд╡рд┐рддреАрдп рдХрд╛рд░реНрдп, рдФрд░ рдЦрд┐рдбрд╝рдХреА рдХреЗ рднреАрддрд░ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ред

 new JobRequest.Builder(JOB_ID) .setRequiresDeviceIdle(true) .setRequiresCharging(true) .setRequiredNetworkType(JobRequest.NetworkType.UNMETERED) .build() .scheduleAsync(); 

рдкреЗрд╢реЗрд╡рд░реЛрдВ :
рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрдкреАрдЖрдИ;
рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рд╕рдорд░реНрдерд┐рдд;
Google Play Services рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╡рд┐рдкрдХреНрд╖ :
рддреГрддреАрдп-рдкрдХреНрд╖ рд╕рдорд╛рдзрд╛рдиред

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

Android 8. рдУрд░рд┐рдпреЛ

рдкреГрд╖реНрдарднреВрдорд┐ рдирд┐рд╖реНрдкрд╛рджрди рд╕реАрдорд╛рдПрдБ


рдЖрдЗрдП рдЕрдкрдиреА рд╕реАрдорд╛рдУрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рдирдП рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдирдП рдЕрдиреБрдХреВрд▓рди рдЖрдП рд╣реИрдВред Google рдХреЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдкрд╛рдИред рдЗрд╕ рдмрд╛рд░ рдкреВрд░реА рдЪреАрдЬрд╝ рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдкреНрд░рд╕рд╛рд░рдгреЛрдВ рдореЗрдВ рдмрджрд▓ рдЧрдИ (рд╣рд╛рдБ, рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реИ)ред

  • startService рдпрджрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧ
  • рдкреНрд░рдХрдЯ рдореЗрдВ рдирд┐рд╣рд┐рдд рдкреНрд░рд╕рд╛рд░рдг

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗ рд╕реЗрд╡рд╛рдПрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред "рдХрд╛рдиреВрди рдХреЗ рдврд╛рдВрдЪреЗ" рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдЧреНрд░рднреВрдорд┐ рд╕реЗрд╡рд╛рдПрдВ рд╣реА рд░рд╣реАрдВред рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЕрдм рдкрджрд╛рд╡рдирдд рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рджреВрд╕рд░реА рд╕реАрдорд╛ рдПрдХ рд╣реА рдкреНрд░рд╕рд╛рд░рдг рд╣реИред рдЗрд╕ рдмрд╛рд░ рдкреНрд░рдХрдЯ рдореЗрдВ рд╕рднреА рдирд┐рд╣рд┐рдд рдкреНрд░рд╕рд╛рд░рдгреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реЛ рдЧрдпрд╛ред рдЗрдореНрдкреНрд▓рд╛рдВрдЯреЗрдб рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ рдПрдХ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ рд╣реИ, рдЬреЛ рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд░рд┐рдпрд╛ ACTION_PACKAGE_REPLACED рд╣реИ, рдФрд░ ACTION_MY_PACKAGE_REPLACED рд╣реИред рддреЛ, рдкрд╣рд▓рд╛ рд╡рд╛рд▓рд╛ рдирд┐рд╣рд┐рдд рд╣реИред

рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдкреНрд░рд╕рд╛рд░рдг рдХреЛ рдЕрднреА рднреА Context.registerBroadcast рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Android 9. рдкрд╛рдИ

WorkManager


рдЗрд╕ рдкрд░ рдЕрдиреБрдХреВрд▓рди рдЕрднреА рддрдХ рд░реБрдХ рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдКрд░реНрдЬрд╛ рдХреА рдЦрдкрдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдкрдХрд░рдгреЛрдВ рдиреЗ рдЬрд▓реНрджреА рдФрд░ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛; рд╢рд╛рдпрдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рд╢рд┐рдХрд╛рдпрдд рдХреА рд╣реИред
рдПрдВрдбреНрд░реЙрдЗрдб 9 рдореЗрдВ, рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд▓реЙрдиреНрдЪрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ред рд╕рднреА рджрдмрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ, Google I / O рдкрд░ WorkManager рдХреЗ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

Google рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдЕрдкрдиреА рджреГрд╖реНрдЯрд┐ рдХреЛ рдЖрдХрд╛рд░ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд▓рд╛рдЗрд╡рдбреИрдЯ, рд╡реНрдпреВрдореЙрдбрд▓ рдФрд░ рд░реВрдо рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдШрдЯрдХ рдереЗред WorkManager рдЙрдирдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪрд┐рдд рдкреВрд░рдХ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдХрдореИрди рдХреЛ рдЕрдВрджрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рдХреЛрдИ рддрдХрдиреАрдХреА рд╕рдлрд▓рддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдПрдХ рдЖрд╡рд░рдг рд╣реИ: рдЬреЙрдмрд╕реЗрдХреНрдпреВрд▓рд░, рдлрд╛рдпрд░рдмреЗрд╕рдЬреЛрдмрдбрд┐рд╕рдкреИрдЪрд░ рдФрд░ рдЕрд▓рд╛рд░реНрдордореИрдиред

createBestAvailableBackgroundScheduler
 static Scheduler createBestAvailableBackgroundScheduler(Context, WorkManager) { if (Build.VERSION.SDK_INT >= MIN_JOB_SCHEDULER_API_LEVEL) { return new SystemJobScheduler(context, workManager); } try { return tryCreateFirebaseJobScheduler(context); } catch (Exception e) { return new SystemAlarmScheduler(context); } } 


рдЪрдпрди рдХреЛрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ JobScheduler API 21 рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ API 23 рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдЕрд╕реНрдерд┐рд░ рдирд╣реАрдВ рдереЗред

рдпрджрд┐ рд╕рдВрд╕реНрдХрд░рдг 23 рд╕реЗ рдХрдо рд╣реИ, рддреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рдлрд╛рдпрд░рдмреЗрд╕рдмреЗрд╕рдмрд╛рдЗрд╕реНрдкреИрдЪрд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдЕрд▓рд╛рд░реНрдо рдореИрдирдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд░реИрдкрд░ рдХрд╛рдлреА рд▓рдЪреАрд▓рд╛ рдирд┐рдХрд▓рд╛ред рдЗрд╕ рдмрд╛рд░, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рд╕рдм рдХреБрдЫ рддреЛрдбрд╝ рджрд┐рдпрд╛, рдФрд░ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рд░реВрдк рд╕реЗ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИ:

  • рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ - рдХрд╛рд░реНрдп рддрд░реНрдХ;
  • WorkRequest - рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ рдХрд╛ рддрд░реНрдХ;
  • WorkRequest.Builder - рдкреИрд░рд╛рдореАрдЯрд░;
  • рдмрд╛рдзрд╛рдПрдВ - рд╕реНрдерд┐рддрд┐рдпрд╛рдВ;
  • рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрдХ - рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ;
  • рд╡рд░реНрдХрд╕реНрдЯреИрдЯрд╕ - рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ред




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

рдпрджрд┐ рд╣рдо рд╣рдорд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрд▓реНрдлрд╛ рдЪрд░рдг рдореЗрдВ, рд╡рд░реНрдХрдореИрдирд░ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВред рдПрд╡рд░рдиреЛрдЯ рдореЗрдВ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреАрдбрд╝реЗ рд╣реИрдВ рдЬреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдПрдХреАрдХреГрдд рд╡рд░реНрдХрдореИрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рд╡реЗ рд╕реНрд╡рдпрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ Google рдХрд╛ рдирд┐рд░реНрдгрдп рдПрд╡рд░рдиреЛрдЯ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдирдХрд╛рд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╣рдорд╛рд░реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

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



рдЖрдЗрдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ: рдкреБрдирд░реНрдкреНрд░рдХрд╛рд╢рд┐рдд рдпрд╛ рдкрд╕рдВрдж рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ред

рдЕрдм рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рджреВрд░ рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рд╕рдордп рд╡рд╣ рдЖрд╡реЗрджрди рдХреЗ рдЕрдВрджрд░ рдЦрд░реАрджрд╛рд░реА рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рд╡рд┐рдЬреНрдЮрд╛рдкрди рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреБрд░рдВрдд рдЕрдкрдиреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрддрд╛ рд╣реИред рдлрд┐рд░ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИ, рдпрджрд┐ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рдЕрдкрдиреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдЧреЗ, рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

JobRunner рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд╣реИрдВред рдЙрдирдХреЗ рддрд░реАрдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

JobRunner.java
 fun likePost(content: IFunnyContent) { val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build() val input = Data.Builder() .putString(LikeContentJob.ID, content.id) .build() val request = OneTimeWorkRequest.Builder(LikeContentJob::class.java) .setInputData(input) .setConstraints(constraints) .build() WorkManager.getInstance().enqueue(request) } 


рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрдХ рдХреЗ рднреАрддрд░ рдХрд╛рд░реНрдп рд╕реНрд╡рдпрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рд╣рдо рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдЖрдИрдбреА рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрд╕рдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдкрд░ рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реНрдХ рд╣реИрдВ:

 abstract class BaseJob : Worker() { final override fun doWork(): Result { val workerInjector = WorkerInjectorProvider.injector() workerInjector.inject(this) return performJob(inputData) } abstract fun performJob(params: Data): Result } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдЬреНрдЮрд╛рди рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд╛ рджреВрд░ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ WorkerInjector рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рддрд░реНрдХ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред

WorkerInjectorImpl.java
 @Singleton public class WorkerInjectorImpl implements WorkerInjector { @Inject public WorkerInjectorImpl() {} @Ovierride public void inject(Worker job) { if (worker instanceof AppCrashedEventSendJob) { Injector.getAppComponent().inject((AppCrashedEventSendJob) job); } else if (worker instanceof CheckNativeCrashesJob) { Injector.getAppComponent().inject((CheckNativeCrashesJob) job); } } } 


рдпрд╣ рдХреЗрд╡рд▓ рдбреИрдЧрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ: рд╣рдо рдЗрдВрдЬреЗрдХреНрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╡рд╛рддрд╛рд╡рд░рдг рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

 fun void testRegisterPushProvider() { WorkManagerTestInitHelper.initializeTestWorkManager(context) val testDriver = WorkManagerTestInitHelper.getTestDriver() WorkerInjectorProvider.setInjector(TestInjector()) // mock dependencies val id = jobRunner.runPushRegisterJob() testDriver.setAllConstraintsMet(id) Assert.assertTrue(тАж) } 

 class LikePostInteractor @Inject constructor( val iFunnyContentDao: IFunnyContentDao, val jobRunner: JobRunner) : Interactor { fun execute() { iFunnyContentDao.like(getContent().id) jobRunner.likePost(getContent()) } } 

рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рд╡рд╣ рдЗрдХрд╛рдИ рд╣реИ рдЬрд┐рд╕реЗ ViewController рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреИрд╕реЗ рдпрд╣) рдХреЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреАрдВрдЪрддреА рд╣реИред рд╣рдо рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ "рдЕрдкрд▓реЛрдб" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд╕рдмрдорд┐рдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдХрд╛рд░реНрдп рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬреИрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 class IFunnyContentViewModel(val iFunnyContentDao: IFunnyContentDao) : ViewModel() { val likeState = MediatorLiveData<Boolean>() var iFunnyContentId = MutableLiveData<String>() private var iFunnyContentState: LiveData<IFunnyContent> = attachLiveDataToContentId(); init { likeState.addSource(iFunnyContentState) { likeState.postValue(it!!.hasLike) } } } 

рд╣рдо Google рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: ViewModel рдФрд░ LiveDataред рдпрд╣ рд╣рдорд╛рд░рд╛ ViewModel рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо DAO рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдкрдбреЗрдЯ рдХреЛ рдЬреИрд╕реЗ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

IFunnyContentViewController.java
 class IFunnyContentViewController @Inject constructor( private val likePostInteractor: LikePostInteractor, val viewModel: IFunnyContentViewModel) : ViewController { override fun attach(view: View) { viewModel.likeState.observe(lifecycleOwner, { updateLikeView(it!!) }) } fun onLikePost() { likePostInteractor.setContent(getContent()) likePostInteractor.execute() } } 


ViewController, рдПрдХ рддрд░рдл, рджреВрд╕рд░реА рдУрд░ рдХреА рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ, рджреВрд╕рд░реА рдУрд░ рдЙрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИред

рдФрд░ рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХреЛрдб рд╣реИред рдпрд╣ рдЕрдкрдиреЗ рдбреАрдПрдУ рдХреЗ рд╕рдорд╛рди рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рджреГрд╢реНрдп рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ; рдпрджрд┐ рдЖрдк рдХрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рдкреНрд░рднрд╛рд╡реА рджрд┐рдЦрддрд╛ рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдирд╛


рдЬреЙрдмрд╕реЗрдХреНрдпреВрд▓рд░, GCM рдиреЗрдЯрд╡рд░реНрдХ рдореИрдиреЗрдЬрд░, FirebaseJobDispatcher:

  • рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ
  • рдЕрдм рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рди рдкрдврд╝реЗрдВ
  • рд░рд┐рдкреЛрд░реНрдЯ рди рджреЗрдЦреЗрдВ
  • рдпрд╣ рдордд рд╕реЛрдЪреЛ рдХрд┐ рдХрд┐рд╕реЗ рдЪреБрдирдирд╛ рд╣реИред

рдПрд╡рд░рдиреЛрдЯ рджреНрд╡рд╛рд░рд╛ Android рдиреМрдХрд░реА:

  • рдЕрдВрджрд░ рд╡реЗ WorkManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ;
  • рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреАрдбрд╝реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмреАрдЪ рдзреБрдВрдзрд▓реЗ рд╣реИрдВред

WorkManager:

  • рдПрдкреАрдЖрдИ рд╕реНрддрд░ 9+;
  • Google Play рд╕реЗрд╡рд╛рдУрдВ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░;
  • рдЬрдВрдЬреАрд░ / InputMergers;
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг;
  • Google рд╕реЗ рд╕рдорд░реНрдерди (рдореИрдВ рдпрд╣ рдорд╛рдирдирд╛ тАЛтАЛрдЪрд╛рд╣рддрд╛ рд╣реВрдВ)ред

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


All Articles