Kharkov

456 views
374 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
456
On SlideShare
0
From Embeds
0
Number of Embeds
155
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Kharkov

  1. 1. Back-end в мобильном Android приложении
  2. 2. Back-end в мобильном Android приложении
  3. 3. Back-end в мобильном Android приложении* Не ищите отличия, картинки одинаковые 
  4. 4. Back-end в мобильном Android приложении
  5. 5. Back-end в мобильном Android приложении
  6. 6. Back-end в мобильном Android приложенииПуть к успеху:
  7. 7. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства
  8. 8. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства2. Не мешать другим приложениям, запущеннымна устройстве
  9. 9. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства2. Не мешать другим приложениям, запущеннымна устройстве3. Сохранять состояние
  10. 10. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства2. Не мешать другим приложениям, запущеннымна устройстве3. Сохранять состояние4. Синхронизировать изменения
  11. 11. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства2. Не мешать другим приложениям, запущеннымна устройстве3. Сохранять состояние4. Синхронизировать изменения
  12. 12. public class BatteryStateReceiver extends BroadcastReceiver{}
  13. 13. public class BatteryStateReceiver extends BroadcastReceiver{private boolean mIsBatteryOk;@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (Intent.ACTION_BATTERY_LOW.equals(action)){mIsBatteryOk = false;} else if (Intent.ACTION_BATTERY_OKAY.equals(action)){mIsBatteryOk = true;}}}
  14. 14. public class BatteryStateReceiver extends BroadcastReceiver{private boolean mIsBatteryOk;@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (Intent.ACTION_BATTERY_LOW.equals(action)){mIsBatteryOk = false;} else if (Intent.ACTION_BATTERY_OKAY.equals(action)){mIsBatteryOk = true;}}}<receiver android:name=".BatteryStateReceiver"><intent-filter><action android:name="android.intent.action.ACTION_BATTERY_LOW"/><action android:name="android.intent.action.ACTION_BATTERY_OKAY"/></intent-filter></receiver>
  15. 15. public class BatteryStateReceiver extends BroadcastReceiver{private float mBatteryLevel;@Overridepublic void onReceive(Context context, Intent intent) {if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);mBatteryLevel = level / (float) scale;}}}
  16. 16. public class BatteryStateReceiver extends BroadcastReceiver{private float mBatteryLevel;@Overridepublic void onReceive(Context context, Intent intent) {if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);mBatteryLevel = level / (float) scale;}}}<receiver android:name=".BatteryStateReceiver"><intent-filter><action android:name="android.intent.action.BATTERY_CHANGED"/></intent-filter></receiver>
  17. 17. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства (Battery Life)2. Не мешать другим приложениям, запущеннымна устройстве3. Сохранять состояние4. Синхронизировать изменения
  18. 18. public class NetworkStateReceiver extends BroadcastReceiver {private int mNetworkType;@Overridepublic void onReceive(Context context, Intent intent) {}}
  19. 19. public class NetworkStateReceiver extends BroadcastReceiver {private int mNetworkType;@Overridepublic void onReceive(Context context, Intent intent) {if(ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())){boolean noNetwork = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);}}
  20. 20. public class NetworkStateReceiver extends BroadcastReceiver {private int mNetworkType;@Overridepublic void onReceive(Context context, Intent intent) {if(ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())){boolean noNetwork = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);if (!noNetwork){ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);NetworkInfo activeNetwork = cm.getActiveNetworkInfo();…}}
  21. 21. public class NetworkStateReceiver extends BroadcastReceiver {private int mNetworkType;@Overridepublic void onReceive(Context context, Intent intent) {…switch (activeNetwork.getType()) {case (ConnectivityManager.TYPE_WIFI):break;case (ConnectivityManager.TYPE_MOBILE):break;}}
  22. 22. public class NetworkStateReceiver extends BroadcastReceiver {private int mNetworkType;@Overridepublic void onReceive(Context context, Intent intent) {…switch (activeNetwork.getType()) {case (ConnectivityManager.TYPE_WIFI):break;case (ConnectivityManager.TYPE_MOBILE):switch (tm.getNetworkType()) {case TelephonyManager.NETWORK_TYPE_LTE:case TelephonyManager.NETWORK_TYPE_HSPAP:case TelephonyManager.NETWORK_TYPE_EDGE:case TelephonyManager.NETWORK_TYPE_GPRS:default: break;}}
  23. 23. <receiver android:name=".NetworkStateReceiver"><intent-filter><action android:name="android.net.conn.CONNECTIVITY_CHANGE"/></intent-filter></receiver>
  24. 24. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства (Battery Life,Network Type)2. Не мешать другим приложениям, запущеннымна устройстве3. Сохранять состояние4. Синхронизировать изменения
  25. 25. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства (Battery Life,Network Type)2. Не мешать другим приложениям, запущеннымна устройстве3. Сохранять состояние4. Синхронизировать изменения
  26. 26. public class MyActivity extends Activity{@Overrideprotected void onCreate(Bundle arg0) {super.onCreate(arg0);…getActivity().bindService(intent, mConnection, Context.BIND_AUTO_CREATE}@Overridepublic void onDestroy() {super.onDestroy();…getActivity().unbindService(mConnection);}}
  27. 27. 1. Запустили приложение
  28. 28. 1. Запустили приложение2. Получили ссылку на сервис
  29. 29. 1. Запустили приложение2. Получили ссылку на сервис3. Свернули приложение и перешли в Google Play
  30. 30. 1. Запустили приложение2. Получили ссылку на сервис3. Свернули приложение и перешли в Google Play4. Android очищает неиспользуемые ресурсы дляприложения в foreground
  31. 31. 1. Запустили приложение2. Получили ссылку на сервис3. Свернули приложение и перешли в Google Play4. Android очищает неиспользуемые ресурсы дляприложения в foregroundVisible lifetime
  32. 32. public abstract class ServiceTask<Params, Progress, Result, S extends Service>extends AsyncTask<Params, Progress, Result>{}
  33. 33. public abstract class ServiceTask<Params, Progress, Result, S extends Service>extends AsyncTask<Params, Progress, Result>{}
  34. 34. public abstract class ServiceTask<Params, Progress, Result, S extends Service>extends AsyncTask<Params, Progress, Result>{private final ServiceDelegate<? extends S> mDelegate;…@Overrideprotected final void onPreExecute(){…mDelegate.doBindService();}}
  35. 35. public abstract class ServiceTask<Params, Progress, Result, S extends Service>extends AsyncTask<Params, Progress, Result>{private final ServiceDelegate<? extends S> mDelegate;…@Overrideprotected final Result doInBackground(Params... params) {S service = mDelegate.getServiceBlocking();Result result = doInBackgroundService(service, params);return result;}protected abstract Result doInBackgroundService(S service, Params...params)}
  36. 36. public abstract class ServiceTask<Params, Progress, Result, S extends Service>extends AsyncTask<Params, Progress, Result>{private final ServiceDelegate<? extends S> mDelegate;…@Overrideprotected final void onPostExecute(Result r){mDelegate.doUnbindService();}}
  37. 37. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства (Battery Life,Network Type)2. Не мешать другим приложениям, запущеннымна устройстве (Services)3. Сохранять состояние4. Синхронизировать изменения
  38. 38. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства (Battery Life,Network Type)2. Не мешать другим приложениям, запущеннымна устройстве (Services, BroadcastReceivers)3. Сохранять состояние4. Синхронизировать изменения
  39. 39. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства (Battery Life,Network Type)2. Не мешать другим приложениям, запущеннымна устройстве (Services, BroadcastReceivers)3. Сохранять состояние4. Синхронизировать изменения
  40. 40. _id remote_id title sender body … … read flag1 04392814 … … … … … false true2 12772834 … … … … … false false3 01486290 … … … … … true false4 03922813 … … … … … false falseMailMessage
  41. 41. _id remote_id title sender body … … read flag dirty status1 04392814 … … … … … false true2 12772834 … … … … … false false3 01486290 … … … … … true false4 03922813 … … … … … false falseMailMessage
  42. 42. _id remote_id title sender body … … read flag dirty status1 04392814 … … … … … false true CLR2 12772834 … … … … … false false3 01486290 … … … … … true false4 03922813 … … … … … false falseMailMessage
  43. 43. _id remote_id title sender body … … read flag dirty status1 04392814 … … … … … false true CLR2 12772834 … … … … … false false UPD3 01486290 … … … … … true false4 03922813 … … … … … false falseMailMessage
  44. 44. _id remote_id title sender body … … read flag dirty status1 04392814 … … … … … false true CLR2 12772834 … … … … … false false UPD3 01486290 … … … … … true false DLT4 03922813 … … … … … false falseMailMessage
  45. 45. _id remote_id title sender body … … read flag dirty status1 04392814 … … … … … false true CLR2 12772834 … … … … … false false UPD3 01486290 … … … … … true false DLT4 -1 … … … … … false false CRTMailMessage
  46. 46. _id remote_id title sender body … … read flag dirty status1 04392814 … … … … … false true CLR2 12772834 … … … … … false false UPD3 01486290 … … … … … true false DLT4 -1 … … … … … false false CRTMailMessage
  47. 47. _id remote_id title sender body … … read flag dirty status1 04392814 … … … … … false true CLR2 12772834 … … … … … false false UPD3 01486290 … … … … … true false DLT4 -1 … … … … … false false CRTMailMessage1. Обновить локально
  48. 48. _id remote_id title sender body … … read flag dirty status1 04392814 … … … … … false true CLR2 12772834 … … … … … false false UPD3 01486290 … … … … … true false DLT4 -1 … … … … … false false CRTMailMessage1. Обновить локально2. Отправить на сервер
  49. 49. _id remote_id title sender body … … read flag dirty status1 04392814 … … … … … false true CLR2 12772834 … … … … … false false UPD3 01486290 … … … … … true false DLT4 -1 … … … … … false false CRTMailMessage1. Обновить локально2. Отправить на сервер3. Очистить dirty
  50. 50. _id remote_id title sender body … … read flag dirty status1 04392814 … … … … … false true CLR2 12772834 … … … … … false false CLR OK3 01486290 … … … … … true false DLT4 -1 … … … … … false false CRTMailMessage1. Обновить локально2. Отправить на сервер3. Очистить dirty
  51. 51. • Всегда стабильное состояние
  52. 52. • Всегда стабильное состояние• Возможность оффлайновой работы
  53. 53. • Всегда стабильное состояние• Возможность оффлайновой работы• Информация о текущем статусе
  54. 54. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства (Battery Life,Network Type)2. Не мешать другим приложениям, запущеннымна устройстве (Services, BroadcastReceivers)3. Сохранять состояние (Статус операций)4. Синхронизировать изменения
  55. 55. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства (Battery Life,Network Type)2. Не мешать другим приложениям, запущеннымна устройстве (Services, BroadcastReceivers)3. Сохранять состояние (Статус операций)4. Синхронизировать изменения
  56. 56. Преимущества синхронизации1. Эффективность2. Экономичность3. Незаметность
  57. 57. Service
  58. 58. Back-end в мобильном Android приложенииПуть к успеху:1. Учитывать состояние устройства (Battery Life,Network Type)2. Не мешать другим приложениям, запущеннымна устройстве (Services, BroadcastReceivers)3. Сохранять состояние (Статус операций)4. Синхронизировать изменения (SyncAdapter)
  59. 59. Кирилл Харьковр а з р а б от ч и к , A n d r o i d п оч т а / П оч т аk . k h a r k o v @ c o r p . m a i l . r u

×