
рдмрдЪрдкрди рд╕реЗ, рдореБрдЭреЗ рдирд┐рд░реНрджреЗрд╢ рдкрдврд╝рдирд╛ рдкрд╕рдВрдж рд╣реИред рдореИрдВ рдмрдбрд╝рд╛ рд╣реЛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рдпрд╕реНрдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рддрд┐ рд▓рд╛рдкрд░рд╡рд╛рд╣ рдХреИрд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ: рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рдпрд╛ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдХрдИ рдФрд░ рднреА рд╣реИрдВ! рдЖрдк рдореЗрдВ рд╕реЗ рдХрд┐рддрдиреЗ рд▓реЛрдЧ рдорд╛рдЗрдХреНрд░реЛрд╡реЗрд╡ рдореЗрдВ рддрд╛рдкрдорд╛рди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ? рдФрд░ рд╡рд╣ рд▓рдЧрднрдЧ рд╕рднреА рдореЗрдВ рд╣реИред
рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВ рдореБрдЦреНрдп рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднрд╛рдЧрд╛: рджреЗрдЦреЗрдВ, рдЧрддрд┐рд╡рд┐рдзрд┐, рдЯреБрдХрдбрд╝рд╛, рдЖрд╡реЗрджрди, рдФрд░ рдореИрдВ
Application.registerActivityLifecycleCallbacks () рд╡рд┐рдзрд┐ рдФрд░
рдПрдХреНрдЯрд┐рд╡рд┐рдЯреАрд▓рд┐рдлрд╝ рд╕рд╛рдЗрдХрд┐рд▓рдХреЙрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдмрд╣реБрдд рд░реБрдЪрд┐ рд░рдЦрддрд╛ рдерд╛ред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдЧрддрд┐рд╡рд┐рдзрд┐ рдЬреАрд╡рди рдЪрдХреНрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рдирд╣реАрдВ рдерд╛ред рдлрд┐рд░ рдореИрдВрдиреЗ рдЦреБрдж рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдЕрдм рд╣рдо рдпреИрдВрдбреЗрдХреНрд╕ рдкрд░ рд╣реИрдВред рдХрд┐рд╕реА рднреА рдмрд╛рд╣рд░реА рдЬрдЧрд╣ рд╕реЗ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд▓рд╛рдЗрдлрд╝рд╕рд╛рдЗрдХрд▓ рдХреЙрд▓рдмреИрдХ рдХреНрдпрд╛ рд╣реИрдВ?
рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рджреЗрдЦреЗрдВ, рдЬрдм рдпрд╣ рдПрдкреАрдЖрдИ 14 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
public interface ActivityLifecycleCallbacks { void onActivityCreated(Activity activity, Bundle savedInstanceState); void onActivityStarted(Activity activity); void onActivityResumed(Activity activity); void onActivityPaused(Activity activity); void onActivityStopped(Activity activity); void onActivitySaveInstanceState(Activity activity, Bundle outState); void onActivityDestroyed(Activity activity); }
рдПрдкреАрдЖрдИ 29 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдЗрд╕рдореЗрдВ рдХрдИ рдирдП рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред public interface ActivityLifecycleCallbacks { default void onActivityPreCreated( @NonNull Activity activity, @Nullable Bundle savedInstanceState) { } void onActivityCreated( @NonNull Activity activity, @Nullable Bundle savedInstanceState); default void onActivityPostCreated( @NonNull Activity activity, @Nullable Bundle savedInstanceState) { } default void onActivityPreStarted(@NonNull Activity activity) { } void onActivityStarted(@NonNull Activity activity); default void onActivityPostStarted(@NonNull Activity activity) { } default void onActivityPreResumed(@NonNull Activity activity) { } void onActivityResumed(@NonNull Activity activity); default void onActivityPostResumed(@NonNull Activity activity) { } default void onActivityPrePaused(@NonNull Activity activity) { } void onActivityPaused(@NonNull Activity activity); default void onActivityPostPaused(@NonNull Activity activity) { } default void onActivityPreStopped(@NonNull Activity activity) { } void onActivityStopped(@NonNull Activity activity); default void onActivityPostStopped(@NonNull Activity activity) { } default void onActivityPreSaveInstanceState( @NonNull Activity activity, @NonNull Bundle outState) { } void onActivitySaveInstanceState( @NonNull Activity activity, @NonNull Bundle outState); default void onActivityPostSaveInstanceState( @NonNull Activity activity, @NonNull Bundle outState) { } default void onActivityPreDestroyed(@NonNull Activity activity) { } void onActivityDestroyed(@NonNull Activity activity); default void onActivityPostDestroyed(@NonNull Activity activity) { } }
рд╢рд╛рдпрдж рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЗрддрдирд╛ рдХрдо рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдВрдбреНрд░реЙрдЗрдб 4.0 рдЖрдИрд╕реАрдПрд╕ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд╡реНрдпрд░реНрде рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рдмрд╛рд╣рд░ рд╕рднреА рдЧрддрд┐рд╡рд┐рдзрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдФрд░ рдмрд╛рдж рдореЗрдВ, рдФрд░ рдкрд╣рд▓реЗ рддрд░реАрдХреЛрдВ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдЧрддрд┐рд╡рд┐рдзрд┐ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреА рдПрдХ рд╕рдорд╛рди рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдЙрд╕ рд╕рдордп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрд╡реЗрджрди рдореЗрдВ рдХрд┐рд╕реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдзрд┐ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдЖрд╡реЗрджрди MainActivity рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ ActivLifecycleCallback.onActivityCreated (MainActivity, null) рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдорд┐рд▓реЗрдЧреАред
рдорд╣рд╛рди, рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдпрд╣рд╛рдВ рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИ: рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕реНрд╡рдпрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреА рд╣реИ рдХрд┐ рд╡реЗ рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВред рдпрд╣рд╛рдБ Activity.onCreate () рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:
mFragments.restoreAllState(p, mLastNonConfigurationInstances != null ? mLastNonConfigurationInstances.fragments : null); } mFragments.dispatchCreate(); getApplication().dispatchActivityCreated(this, savedInstanceState); if (mVoiceInteractor != null) {
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреИрд╕реЗ рд╣рдордиреЗ рдЦреБрдж рдмреЗрд╕рдЖрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреА рд╣реИред рдХреЗрд╡рд▓ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд┐рдпрд╛, рдФрд░ рд╕рднреА рдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд┐рдпрд╛ред рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ!
рдПрдкреАрдЖрдИ 29 рдореЗрдВ, рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдкреВрд░реНрд╡ рдФрд░ рдмрд╛рдж рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдХреЙрд▓ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рд╢рд╛рдпрдж рдЕрдм рдЧрддрд┐рд╡рд┐рдзрд┐ рдкреНрд░рдмрдВрдзрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрд░реЛрдд рдореЗрдВ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред
рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд▓рд╛рдЗрдлрд╝ рд╕рд╛рдЗрдХрд▓ рдХреЙрд▓рдмреИрдХ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ?
рд╕рднреА рдХреЙрд▓рдмреИрдХ рдХреА рддрд░рд╣, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо Application.onCreate () рдореЗрдВ рд╕рднреА ActivityLifecycleCallbacks рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕рднреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рддреА рд╣реИред
class MyApplication : Application() { override fun onCreate() { super.onCreate() registerActivityLifecycleCallbacks(MyCallbacks()) } }
рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░: рдПрдкреАрдЖрдИ 29 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЗ рднреАрддрд░ рд╕реЗ рднреА рдЧрддрд┐рд╡рд┐рдзрд┐рд▓рд┐рдлрд╝реЗрдХрд▓рдмреИрдХ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ
рд╕реНрдерд╛рдиреАрдп рдХреЙрд▓рдмреИрдХ рд╣реЛрдЧрд╛ рдЬреЛ рдХреЗрд╡рд▓ рдЗрд╕ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╡рд╣ рд╕рдм рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЦреЛрдЬ рдмреЙрдХреНрд╕ рдореЗрдВ ActivLifecycleCallbacks рдирд╛рдо рджрд░реНрдЬ рдХрд░рдХреЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЧрддрд┐рд╡рд┐рдзрд┐ рдЬреАрд╡рдирдЪрдХреНрд░ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ? рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдХрдИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдВ (рд▓рдЧрднрдЧ 400) рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдм рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
рддреБрдо рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реЛ? рдЖрд╡реЗрджрди рдореЗрдВ рд╕рднреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд╡рд┐рд╖рдп рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдХреГрдкрдпрд╛: setTheme () рд╡рд┐рдзрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдХреЙрд▓рдмреИрдХ:
class ThemeCallback( @StyleRes val myTheme: Int ) : ActivityLifecycleCallbacks { override fun onActivityCreated( activity: Activity, savedInstanceState: Bundle? ) { activity.setTheme(myTheme) } }
рдЗрд╕ рдЯреНрд░рд┐рдХ рдХреЛ рдХреЗрд╡рд▓ рдШрд░ рдкрд░ рд╣реА рджреЛрд╣рд░рд╛рдПрдВрдЬреБрдбрд╝реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдХреБрдЫ рдЧрддрд┐рд╡рд┐рдзрд┐рдпрд╛рдБ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдереАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдкреИрдХреЗрдЬ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрдХреЗрдд рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╖рдп рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдХреЗрдЬ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ (рдХреЛрдЯрд▓рд┐рдиреЛрд╡рд╕реНрдХреА =) рдореЗрдВ:
class ThemeCallback( @StyleRes val myTheme: Int ) : ActivityLifecycleCallbacks { override fun onActivityCreated( activity: Activity, savedInstanceState: Bundle? ) { val myPackage = "my.cool.application" activity .takeIf { it.javaClass.name.startsWith(myPackage) } ?.setTheme(myTheme) } }
рдХреНрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ? рдЖрдк AndroidManifest рдореЗрдВ Application рдпрд╛ Application рдореЗрдВ ThemeCallback рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдирд╛ рднреВрд▓ рдЧрдП рд╣реЛрдВрдЧреЗред
рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЖрдк рдЖрд╡реЗрджрди рдореЗрдВ рдХрд┐рд╕реА рднреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдкрд░ рд╕рдВрд╡рд╛рдж рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред
class DialogCallback( val dialogFragment: DialogFragment ) : Application.ActivityLifecycleCallbacks { override fun onActivityCreated( activity: Activity, savedInstanceState: Bundle? ) { if (savedInstanceState == null) { val tag = dialogFragment.javaClass.name (activity as? AppCompatActivity) ?.supportFragmentManager ?.also { fragmentManager -> if (fragmentManager.findFragmentByTag(tag) == null) { dialogFragment.show(fragmentManager, tag) } } } } }
рдЗрд╕ рдЯреНрд░рд┐рдХ рдХреЛ рдХреЗрд╡рд▓ рдШрд░ рдкрд░ рд╣реА рджреЛрд╣рд░рд╛рдПрдВрдмреЗрд╢рдХ, рдЖрдкрдХреЛ рд╣рд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд╕рдВрд╡рд╛рдж рдирд╣реАрдВ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╕реЗ рдкреНрдпрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдХреНрд░реАрди рдкрд░ рдРрд╕рд╛ рдХреБрдЫ рджрд┐рдЦрд╛рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рд╣реИ: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╕рдм рдХреБрдЫ рдпрд╣рд╛рдВ рд╕рд░рд▓ рд╣реИ: рдЧрддрд┐рд╡рд┐рдзрд┐.startActivity () - рдФрд░ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ Activity.startActivityForResult () рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдкрдбрд╝реЗ? рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдиреБрд╕реНрдЦрд╛ рд╣реИ:
class StartingActivityCallback : Application.ActivityLifecycleCallbacks { override fun onActivityCreated( activity: Activity, savedInstanceState: Bundle? ) { if (savedInstanceState == null) { (activity as? AppCompatActivity) ?.supportFragmentManager ?.also { fragmentManager -> val startingFragment = findOrCreateFragment(fragmentManager) startingFragment.listener = { resultCode, data ->
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╣рдореЗрдВ рд╕реМрдВрдк рджреЗрддрд╛ рд╣реИред рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ: рдпрд╣рд╛рдБ рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ AppCompatActivity рд╣реИ, рдЬреЛ рдЕрдирдВрдд рд▓реВрдк рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИред рдЕрдиреНрдп рд╢рд░реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕ рдХреНрд╖рдг рддрдХ, рд╣рдордиреЗ рдХреЗрд╡рд▓ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реИрдВред рдХреИрд╕реЗ рдЕрдкрдиреЗ рдЦреБрдж рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ? рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдо рдПрдХ рд╕реНрдХреНрд░реАрди рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕реА рд╕рдордп, рд╣рдорд╛рд░реА рд╕реНрдХреНрд░реАрди рдХреЗ рдЕрдкрдиреЗ рдирд╛рдо рд╣реИрдВред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ? рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдПрдХ рд╕реНрдХреНрд░реАрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдБ рдЬреЛ рд╕реНрдХреНрд░реАрди рдХрд╛ рдирд╛рдо рджреЗ рд╕рдХреЗ:
interface Screen { val screenName: String }
рдЕрдм рд╣рдо рдЗрд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
class NamedActivity : Activity(), Screen { override val screenName: String = "First screen" }
рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЧрддрд┐рд╡рд┐рдзрд┐рд▓рд┐рдлрд╝рд╕рд╛рдЗрдХрд▓ рдХреЙрд▓рдмреИрдХ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:
class AnalyticsActivityCallback( val sendAnalytics: (String) -> Unit ) : Application.ActivityLifecycleCallbacks { override fun onActivityCreated( activity: Activity, savedInstanceState: Bundle? ) { if (savedInstanceState == null) { (activity as? Screen)?.screenName?.let(sendAnalytics) } } }
рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ? рд╣рдо рд╕рд┐рд░реНрдл рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рднреЗрдЬреЗрдВред
рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░рд╛рдПрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ? рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдврд╝рд╛рдПрдБ:
interface ScreenWithParameters : Screen { val parameters: Map<String, String> }
рд╣рдо рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
class NamedActivity : Activity(), ScreenWithParameters { override val screenName: String = "First screen" override val parameters: Map<String, String> = mapOf("key" to "value") }
рд╣рдо рдЬрд╣рд╛рдЬ:
class AnalyticsActivityCallback( val sendAnalytics: (String, Map<String, String>?) -> Unit ) : Application.ActivityLifecycleCallbacks { override fun onActivityCreated( activity: Activity, savedInstanceState: Bundle? ) { if (savedInstanceState == null) { (activity as? Screen)?.screenName?.let { name -> sendAnalytics( name, (activity as? ScreenWithParameters)?.parameters ) } } } }
рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рд╕рдм рд╕рд┐рд░реНрдл рдЖрдкрдХреЛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╖рдп рдкрд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛: рджреЗрд╢реА рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рдиред рд╣рд╛рдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреИрдЧрд░, рдХреЛрдЗрди, рдЧрд╛рдЗрд╕, рдХреЛрдбрд┐рди рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рд▓реЗрдХрд┐рди рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░, рд╡реЗ рдмреЗрдорд╛рдиреА рд╣реИрдВред рдмреЗрдирд╛рдо: рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ ... рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдПрдХ?
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЙрдкрдХрд░рдг рд╣реИрдВ:
class CoolToolImpl { val extraInfo = "i am dependency" }
рд╡рдпрд╕реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рддрд░рд╣ рдЗрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдмрдВрдж рдХрд░реЗрдВ:
interface CoolTool { val extraInfo: String } class CoolToolImpl : CoolTool { override val extraInfo = "i am dependency" }
рдФрд░ рдЕрдм рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд▓рд╛рдЗрдлрд╝ рд╕рд╛рдЗрдХрд▓ рдХреЙрд▓рдмреИрдХ рд╕реЗ рдереЛрдбрд╝рд╛ рд╕реНрдЯреНрд░реАрдЯ рдореИрдЬрд┐рдХ: рд╣рдо рдЗрд╕ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдВрдЧреЗ, рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд▓рд╛рдЗрдлрд╝рд╕рд╛рдЗрдХрд▓ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЗрд╕реЗ рдвреВрдВрдвреЗрдВрдЧреЗ рдФрд░ рдХреВрд▓рдЯреВрд▓рдордкреНрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред
interface RequireCoolTool { var coolTool: CoolTool } class CoolToolActivity : Activity(), RequireCoolTool { override lateinit var coolTool: CoolTool } class InjectingLifecycleCallbacks : ActivityLifecycleCallbacks { override fun onActivityCreated( activity: Activity, savedInstanceState: Bundle? ) { (activity as? RequireCoolTool)?.coolTool = CoolToolImpl() } }
рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ InjectingLifecycleCallbacks рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВ, рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛:
@RunWith(AndroidJUnit4::class) class DIActivityTest { @Test fun `should access extraInfo when created`() {
рд▓реЗрдХрд┐рди рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрд┐рд╕реА рд╕реЗ рдХрд┐рд╕реА рднреА рдбреАрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рджреВрд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдЬрд╣рд╛рдВ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдФрд░ рддрд╛рд▓рдореЗрд▓ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ Dagger2 рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдЧрддрд┐рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ AndroidInjection.inject (рдЗрд╕) рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдлреЗрдВрдХрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░реЗрдВ:
- рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдо рдЖрд╡реЗрджрди рдореЗрдВ DispatchingAndroidInjector рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ;
- рдкреНрд░рддреНрдпреЗрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП DispatchingAndroidInjector.maybeInject () рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд▓рд╛рдЗрдлрд╝ рд╕рд╛рдЗрдХрд▓ рдХреЙрд▓рдмреИрдХ рдмрдирд╛рдПрдБ;
- ApplicationLifecycleCallbacks рдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред
class MyApplication : Application() { @Inject lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any> override fun onCreate() { super.onCreate() DaggerYourApplicationComponent.create().inject(this); registerActivityLifecycleCallbacks( InjectingLifecycleCallbacks( dispatchingAndroidInjector ) ) } } class InjectingLifecycleCallbacks( val dispatchingAndroidInjector: DispatchingAndroidInjector<Any> ) : ActivityLifecycleCallbacks { override fun onActivityCreated( activity: Activity, savedInstanceState: Bundle? ) { dispatchingAndroidInjector.maybeInject(activity) } }
рдФрд░ рдЙрд╕реА рдкреНрд░рднрд╛рд╡ рдХреЛ рдЕрдиреНрдп DI рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдирд╛
рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд▓рд╛рдЗрдлрд╝ рд╕рд╛рдЗрдХрд▓ рдХреЙрд▓рдмреИрдХ рдПрдХ рдЕрдВрдбрд░рд░реЗрдЯреЗрдб, рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЯреВрд▓ рд╣реИред
рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЖрдкрдХреА рдорджрдж рдХрд░рдиреЗ рджреЗрдВ рдЬреИрд╕реЗ рдХрд┐ Yandex.Money рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред