рдЬреАрд╕реАрдПрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕ рд▓рд┐рдП рд╣реИ?
рдпрд╣ рд╕рд╣реА рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ рд▓рд┐рдЦрд╛ред рдЗрд╕ рд╣рдлреНрддреЗ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
, Google рдХреА рдУрд░ рд╕реЗ рдкреБрд╢ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рдПрдХ рдирдИ рд╕реЗрд╡рд╛, Habr's
GCM рдкрд░ рдПрдХ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдпрджрд┐ рдЖрдк рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП Google рдХреНрд▓рд╛рдЙрдб рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдореЗрд░рд╛ рд▓реЗрдЦ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред GCM рдХреЗ рд╕рд╛рде)ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд▓реЗрдЦрдХ рдЬреАрд╕реАрдПрдо рдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХрд░рдирд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреБрдЫ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЬрдЧрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдерд╛, рдпрд╛ рдЬрд┐рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛ред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рдЕрд╕рдВрднрд╡ рдХрд╛рдо рд╕реЗ рдбрд░ рд▓рдЧрддрд╛ рд╣реИред
рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрдорддрд┐рдпрд╛рдВ
<uses-permission android:name="android.permission.INTERNET" />
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╣рдореЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛ GCM рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
GCM рдХреЛ Google рдЦрд╛рддреЗ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
<uses-permission android:name="android.permission.WAKE_LOCK"/>
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдВрддрд┐рдо рд╡рд┐рд╖рдп рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд┐рд╡рд╛рдж рдерд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рднрд╛рдЧреА рдиреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдкреНрд░рд▓реЗрдЦрди рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреБрдк рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЖрдк PowerManager.WakeLock
рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдорд╛рдирдХ GCM рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рд╣реЛрдЧреАред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХрд╛рдо рдХрд╛ рддрдВрддреНрд░ рдпрд╣ рд╣реИ: рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдкреНрд░рд╕рд╛рд░рдг рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИред рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдЗрд░рд╛рджреЗ рдХреЛ рд╡рд░реНрдЧ рдирд╛рдо ( setClassName()
) рдореЗрдВ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдХреЗ рдирд╛рдо рдкрд░ GCMBaseIntentService
, рдлрд┐рд░ WakeLock
рдХреЛ PowerManager.PARTIAL_WAKE_LOCK
рдлреНрд▓реИрдЧ рдХреЗ рд╕рд╛рде GCMBaseIntentService
(рд╕реАрдкреАрдпреВ рдХреЛ рд╕реЛрддреЗ рд╣реБрдП, рдиреАрдВрдж рдЖрджрд┐ рди рдЖрдиреЗ рджреЗрдВ) рдХреЛ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдПрдВред onHandleIntent
рд╕реЗрд╡рд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░, WakeLock
рдореБрдХреНрддред
рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рдЕрдиреБрдорддрд┐ рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛, рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдпрд╣ рдЕрдкрд╡рд╛рдж рдорд┐рд▓рд╛:
java.lang.SecurityException: Neither user 10110 nor current process has android.permission.WAKE_LOCK.
<permission android:name="{ }.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="{ }.permission.C2D_MESSAGE" />
рд╣рдо рдЕрдкрдиреА рдЕрдиреБрдорддрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд╡рдпрдВ рдЗрд╕рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рднреА рд╣рдорд╛рд░реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рди рдХрд░ рд╕рдХреЗред
рдиреЛрдЯ: рдпрджрд┐ рдЖрдк 16
рдпрд╛ рдЕрдзрд┐рдХ (рдЬреЗрд▓реА рдмреАрди рдФрд░ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ) рдХреЗ рд▓рд┐рдП minSdkVersion
рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдЕрдиреБрдорддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (2 рд╕рд╛рд▓ рдмрд╛рдж, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреАрд╕реАрдПрдо рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдФрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ред
рдХреНрдпрд╛ рдкрдВрдЬреАрдХрд░рдг рдХреЛрдб (registationId) рдмрджрд▓ рд░рд╣рд╛ рд╣реИ?
рдирдореВрдирд╛ рдЖрд╡реЗрджрди рд╕реЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
final String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("")) {
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рд╢рд░реНрддреЗрдВ рдирд╣реАрдВ рд╣реИрдВред рддреЛ, рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ? рдпрджрд┐ рдЖрдк рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ:
http://developer.android.com/intl/en/guide/google/gcm/adv.html#reg-state , рддреЛ рдЖрдк рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрднреА рднреА рдХреНрдпрд╛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рджреЛ рдорд╛рдорд▓реЗ рд╣реИрдВ:
- рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрджреНрдпрддрди
- рдПрдХ рдмреИрдХрдЕрдк рдмрдирд╛рдирд╛ рдФрд░ рдЙрд╕рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрд╛ред рд╢рд╛рдпрдж рдХреЛрдИ рдХрд╛рдо рдЖрдПрдЧрд╛:
import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.preference.PreferenceManager; public final class ApplicationVersionHelper { public static final String APP_VERSION_PREFS = "application_version"; public static boolean isApplicationVersionCodeEqualsSavedApplicationVersionCode(Context context) { return getApplicationVersionCode(context) == getApplicationVersionCodeFromPreferences(context); } public static int getApplicationVersionCode(Context context) { PackageManager pm = context.getPackageManager(); PackageInfo packageInfo; int applicationVersion = 1; try { packageInfo = pm.getPackageInfo(context.getPackageName(), 0); applicationVersion = packageInfo.versionCode; } catch (NameNotFoundException ignored) { } return applicationVersion; } public static int getApplicationVersionCodeFromPreferences(Context context) { return context.getSharedPreferences(APP_VERSION_PREFS, Context.MODE_PRIVATE).getInt("application_version_code", 0); } public static void putCurrentPackageVersionInPreferences(Context context) { context.getSharedPreferences(APP_VERSION_PREFS, Context.MODE_PRIVATE).edit().putInt("application_version_code", getApplicationVersionCode(context)).commit(); } }
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕
PreferenceManager.getDefaultSharedPreferences
рдирд╣реАрдВ рд╣реИ
PreferenceManager.getDefaultSharedPreferences
рдорд╛рдзреНрдпрдо рд╕реЗ, рд▓реЗрдХрд┐рди рдирд╛рдорд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИрдВред рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдмрд╛рдж рдореЗрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред
рдЕрдм рд╣рдореЗрдВ GCM рдФрд░ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдореЗрдВ рд╕рдлрд▓ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж
putCurrentPackageVersionInPreferences
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдкрдВрдЬреАрдХрд░рдг рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ:
final String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("") || !isApplicationVersionCodeEqualsSavedApplicationVersionCode(this)) {
рдПрдХ рдмреИрдХрдЕрдк рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП (рд╣рд░ рдХреЛрдИ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдкрдврд╝реЗрдВ -
http://developer.android.com/intl/en/guide/topics/data/backup.html ) рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред : рдмрд╕ рдмреИрдХ рдЕрдк рд▓реЗрдиреЗ рдкрд░ рд╕реНрдерд┐рд░
ApplicationVersionHelper.APP_VERSION_PREFS
рд╕реЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рди рд╕рд╣реЗрдЬреЗрдВред рддреЛ рдирд╛рдорд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛рдо рдореЗрдВ рдЖрдИ :) рдлрд┐рд░
isApplicationVersionCodeEqualsSavedApplicationVersionCode
рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд
false
рд╕рдордп
false
рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА рдФрд░ рд╣рдо рдПрдХ рдкрдВрдЬреАрдХрд░рдг рдЕрдиреБрд░реЛрдз рднреЗрдЬ рджреЗрдВрдЧреЗред
GCMIntentService рдореЗрдВ рд╣реИрдВрдбрд▓рд░
GCMIntentService
(
GCMBaseIntentService
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╡рд░реНрдЧ)
рд╣рдореЗрдВ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЙрди рдкрд░:
protected void onRegistered(Context context, String registrationId)
рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ GCM рдореЗрдВ рд╕рдлрд▓ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣рд╛рдБ рд╕реЗ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдореЗрдВ registrationId
рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ protected void onUnregistered(Context context, String registrationId)
рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ GCM рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рднреА registrationId
рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдореЗрдВ registrationId
рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдХрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ) protected void onMessage(Context context, Intent intent)
GCM рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдпрджрд┐ рдХреЛрдИ рдкреЗрд▓реЛрдб рд╣реИ, рддреЛ рдбреЗрдЯрд╛ intent
protected void onDeletedMessages(Context context, int total)
рд╣рдЯрд╛рдП рдЧрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ GCM рд╕реЗ рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ - http://developer.android.com/intl/en/guide/google/gcm/adv.html#payload public void onError(Context context, String errorId)
рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ errorId
рддреНрд░реБрдЯрд┐ рдХреЛрдб рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп protected boolean onRecoverableError(Context context, String errorId)
рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐, рддреНрд░реБрдЯрд┐ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдореЗрдВред рдЕрдЧрд░ рд╣рдо true
рд▓реМрдЯрддреЗ true
, рддреЛ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ false
, рддреЛ рдкреНрд░рдпрд╛рд╕ рдмрдВрдж рдХрд░ рджреЗрдВред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ super.onRecoverableError(context, errorId);
рд╣рдо рдЕрдкрдиреЗ рд▓рд┐рдП рд╕рдлрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ!
рдпрджрд┐ рдпрд╣ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдкрдВрдЬреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦреЗрдВ, рдФрд░ рдЕрдкрдиреА рдореБрдЦреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ onDestroy рд╡рд┐рдзрд┐ рдореЗрдВ GCMRegistrar.onDestroy рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛:
@Override protected void onDestroy() { if (registerTask != null) { registerTask.cancel(true); } try { CMRegistrar.onDestroy(this); } catch(Exception ignored) { } super.onDestroy(); }
registerTask
рдпрд╣рд╛рдБ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЬреЙрдм (
AsyncTask
) рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ GCM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
http://developer.android.com/intl/en/guide/google/gcm/index.html (рдФрд░ 5 рдЕрдВрдХ рд╣реИрдВ) рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдФрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рд╢реНрди рд╣реИрдВ (WAKE_LI рдЕрдиреБрдорддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ) рддреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдбрд░реЛ рдорддред