61

Kharkov

Embed Size (px)

Citation preview

Page 1: Kharkov
Page 2: Kharkov

Back-end в мобильном Android приложении

Page 3: Kharkov

Back-end в мобильном Android приложении

Page 4: Kharkov

Back-end в мобильном Android приложении

* Не ищите отличия, картинки одинаковые

Page 5: Kharkov

Back-end в мобильном Android приложении

Page 6: Kharkov

Back-end в мобильном Android приложении

Page 7: Kharkov

Back-end в мобильном Android приложении Путь к успеху:

Page 8: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства

Page 9: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства 2. Не мешать другим приложениям, запущенным

на устройстве

Page 10: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства 2. Не мешать другим приложениям, запущенным

на устройстве 3. Сохранять состояние

Page 11: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства 2. Не мешать другим приложениям, запущенным

на устройстве 3. Сохранять состояние 4. Синхронизировать изменения

Page 12: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства 2. Не мешать другим приложениям, запущенным

на устройстве 3. Сохранять состояние 4. Синхронизировать изменения

Page 13: Kharkov

public class BatteryStateReceiver extends BroadcastReceiver{ }

Page 14: Kharkov

public class BatteryStateReceiver extends BroadcastReceiver{ private boolean mIsBatteryOk; @Override public 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; }

} }

Page 15: Kharkov

public class BatteryStateReceiver extends BroadcastReceiver{ private boolean mIsBatteryOk; @Override public 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>

Page 16: Kharkov

public class BatteryStateReceiver extends BroadcastReceiver{ private float mBatteryLevel;

@Override public 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;

} }

}

Page 17: Kharkov

public class BatteryStateReceiver extends BroadcastReceiver{ private float mBatteryLevel;

@Override public 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>

Page 18: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life) 2. Не мешать другим приложениям, запущенным

на устройстве 3. Сохранять состояние 4. Синхронизировать изменения

Page 19: Kharkov

public class NetworkStateReceiver extends BroadcastReceiver { private int mNetworkType; @Override

public void onReceive(Context context, Intent intent) { }

}

Page 20: Kharkov

public class NetworkStateReceiver extends BroadcastReceiver { private int mNetworkType; @Override

public void onReceive(Context context, Intent intent) { if(ConnectivityManager.CONNECTIVITY_ACTION .equals(intent.getAction())){ boolean noNetwork = intent.getBooleanExtra( ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);

} }

Page 21: Kharkov

public class NetworkStateReceiver extends BroadcastReceiver { private int mNetworkType; @Override

public 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();

} }

Page 22: Kharkov

public class NetworkStateReceiver extends BroadcastReceiver { private int mNetworkType; @Override

public void onReceive(Context context, Intent intent) { …

switch (activeNetwork.getType()) { case (ConnectivityManager.TYPE_WIFI): break; case (ConnectivityManager.TYPE_MOBILE): break;

} }

Page 23: Kharkov

public class NetworkStateReceiver extends BroadcastReceiver { private int mNetworkType; @Override

public 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; }

}

Page 24: Kharkov

<receiver android:name=".NetworkStateReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver>

Page 25: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,

Network Type) 2. Не мешать другим приложениям, запущенным

на устройстве 3. Сохранять состояние 4. Синхронизировать изменения

Page 26: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,

Network Type) 2. Не мешать другим приложениям, запущенным

на устройстве 3. Сохранять состояние 4. Синхронизировать изменения

Page 27: Kharkov

public class MyActivity extends Activity{

@Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); … getActivity().bindService(intent, mConnection, Context.BIND_AUTO_CREATE }

@Override public void onDestroy() { super.onDestroy(); … getActivity().unbindService(mConnection); }

}

Page 28: Kharkov
Page 29: Kharkov

1. Запустили приложение

Page 30: Kharkov

1. Запустили приложение 2. Получили ссылку на сервис

Page 31: Kharkov

1. Запустили приложение 2. Получили ссылку на сервис 3. Свернули приложение и перешли в Google Play

Page 32: Kharkov

1. Запустили приложение 2. Получили ссылку на сервис 3. Свернули приложение и перешли в Google Play 4. Android очищает неиспользуемые ресурсы для

приложения в foreground

Page 33: Kharkov

1. Запустили приложение 2. Получили ссылку на сервис 3. Свернули приложение и перешли в Google Play 4. Android очищает неиспользуемые ресурсы для

приложения в foreground

Visible lifetime

Page 34: Kharkov

public abstract class ServiceTask<Params, Progress, Result, S extends Service> extends AsyncTask<Params, Progress, Result>{

}

Page 35: Kharkov

public abstract class ServiceTask<Params, Progress, Result, S extends Service> extends AsyncTask<Params, Progress, Result>{

}

Page 36: Kharkov

public abstract class ServiceTask<Params, Progress, Result, S extends Service> extends AsyncTask<Params, Progress, Result>{ private final ServiceDelegate<? extends S> mDelegate; …

@Override protected final void onPreExecute(){ … mDelegate.doBindService();

} }

Page 37: Kharkov

public abstract class ServiceTask<Params, Progress, Result, S extends Service> extends AsyncTask<Params, Progress, Result>{ private final ServiceDelegate<? extends S> mDelegate; …

@Override protected final Result doInBackground(Params... params) {

S service = mDelegate.getServiceBlocking(); Result result = doInBackgroundService(service, params); return result;

}

protected abstract Result doInBackgroundService(S service, Params...params) }

Page 38: Kharkov

public abstract class ServiceTask<Params, Progress, Result, S extends Service> extends AsyncTask<Params, Progress, Result>{ private final ServiceDelegate<? extends S> mDelegate; …

@Override protected final void onPostExecute(Result r){ mDelegate.doUnbindService(); }

}

Page 39: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,

Network Type) 2. Не мешать другим приложениям, запущенным

на устройстве (Services) 3. Сохранять состояние 4. Синхронизировать изменения

Page 40: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,

Network Type) 2. Не мешать другим приложениям, запущенным

на устройстве (Services, BroadcastReceivers) 3. Сохранять состояние 4. Синхронизировать изменения

Page 41: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,

Network Type) 2. Не мешать другим приложениям, запущенным

на устройстве (Services, BroadcastReceivers) 3. Сохранять состояние 4. Синхронизировать изменения

Page 42: Kharkov

_id remote_id title sender body … … read flag

1 04392814 … … … … … false true

2 12772834 … … … … … false false

3 01486290 … … … … … true false

4 03922813 … … … … … false false

MailMessage

Page 43: Kharkov

_id remote_id title sender body … … read flag dirty status

1 04392814 … … … … … false true

2 12772834 … … … … … false false

3 01486290 … … … … … true false

4 03922813 … … … … … false false

MailMessage

Page 44: Kharkov

_id remote_id title sender body … … read flag dirty status

1 04392814 … … … … … false true CLR

2 12772834 … … … … … false false

3 01486290 … … … … … true false

4 03922813 … … … … … false false

MailMessage

Page 45: Kharkov

_id remote_id title sender body … … read flag dirty status

1 04392814 … … … … … false true CLR

2 12772834 … … … … … false false UPD

3 01486290 … … … … … true false

4 03922813 … … … … … false false

MailMessage

Page 46: Kharkov

_id remote_id title sender body … … read flag dirty status

1 04392814 … … … … … false true CLR

2 12772834 … … … … … false false UPD

3 01486290 … … … … … true false DLT

4 03922813 … … … … … false false

MailMessage

Page 47: Kharkov

_id remote_id title sender body … … read flag dirty status

1 04392814 … … … … … false true CLR

2 12772834 … … … … … false false UPD

3 01486290 … … … … … true false DLT

4 -1 … … … … … false false CRT

MailMessage

Page 48: Kharkov

_id remote_id title sender body … … read flag dirty status

1 04392814 … … … … … false true CLR

2 12772834 … … … … … false false UPD

3 01486290 … … … … … true false DLT

4 -1 … … … … … false false CRT

MailMessage

Page 49: Kharkov

_id remote_id title sender body … … read flag dirty status

1 04392814 … … … … … false true CLR

2 12772834 … … … … … false false UPD

3 01486290 … … … … … true false DLT

4 -1 … … … … … false false CRT

MailMessage

1. Обновить локально

Page 50: Kharkov

_id remote_id title sender body … … read flag dirty status

1 04392814 … … … … … false true CLR

2 12772834 … … … … … false false UPD

3 01486290 … … … … … true false DLT

4 -1 … … … … … false false CRT

MailMessage

1. Обновить локально 2. Отправить на сервер

Page 51: Kharkov

_id remote_id title sender body … … read flag dirty status

1 04392814 … … … … … false true CLR

2 12772834 … … … … … false false UPD

3 01486290 … … … … … true false DLT

4 -1 … … … … … false false CRT

MailMessage

1. Обновить локально 2. Отправить на сервер 3. Очистить dirty

Page 52: Kharkov

_id remote_id title sender body … … read flag dirty status

1 04392814 … … … … … false true CLR

2 12772834 … … … … … false false CLR OK

3 01486290 … … … … … true false DLT

4 -1 … … … … … false false CRT

MailMessage

1. Обновить локально 2. Отправить на сервер 3. Очистить dirty

Page 53: Kharkov

• Всегда стабильное состояние

Page 54: Kharkov

• Всегда стабильное состояние • Возможность оффлайновой работы

Page 55: Kharkov

• Всегда стабильное состояние • Возможность оффлайновой работы • Информация о текущем статусе

Page 56: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,

Network Type) 2. Не мешать другим приложениям, запущенным

на устройстве (Services, BroadcastReceivers) 3. Сохранять состояние (Статус операций) 4. Синхронизировать изменения

Page 57: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,

Network Type) 2. Не мешать другим приложениям, запущенным

на устройстве (Services, BroadcastReceivers) 3. Сохранять состояние (Статус операций) 4. Синхронизировать изменения

Page 58: Kharkov

Преимущества синхронизации 1. Эффективность 2. Экономичность 3. Незаметность

Page 59: Kharkov

Service

Page 60: Kharkov

Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,

Network Type) 2. Не мешать другим приложениям, запущенным

на устройстве (Services, BroadcastReceivers) 3. Сохранять состояние (Статус операций) 4. Синхронизировать изменения (SyncAdapter)

Page 61: Kharkov

Кирилл Харьков

р а з р а б о т ч и к , 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