Upload
kuchinskaya
View
280
Download
0
Embed Size (px)
Citation preview
Back-end в мобильном Android приложении
Back-end в мобильном Android приложении
Back-end в мобильном Android приложении
* Не ищите отличия, картинки одинаковые
Back-end в мобильном Android приложении
Back-end в мобильном Android приложении
Back-end в мобильном Android приложении Путь к успеху:
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства 2. Не мешать другим приложениям, запущенным
на устройстве
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства 2. Не мешать другим приложениям, запущенным
на устройстве 3. Сохранять состояние
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства 2. Не мешать другим приложениям, запущенным
на устройстве 3. Сохранять состояние 4. Синхронизировать изменения
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства 2. Не мешать другим приложениям, запущенным
на устройстве 3. Сохранять состояние 4. Синхронизировать изменения
public class BatteryStateReceiver extends BroadcastReceiver{ }
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; }
} }
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>
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;
} }
}
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>
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life) 2. Не мешать другим приложениям, запущенным
на устройстве 3. Сохранять состояние 4. Синхронизировать изменения
public class NetworkStateReceiver extends BroadcastReceiver { private int mNetworkType; @Override
public void onReceive(Context context, Intent intent) { }
}
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);
} }
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();
…
} }
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;
} }
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; }
}
<receiver android:name=".NetworkStateReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver>
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,
Network Type) 2. Не мешать другим приложениям, запущенным
на устройстве 3. Сохранять состояние 4. Синхронизировать изменения
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,
Network Type) 2. Не мешать другим приложениям, запущенным
на устройстве 3. Сохранять состояние 4. Синхронизировать изменения
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); }
}
1. Запустили приложение
1. Запустили приложение 2. Получили ссылку на сервис
1. Запустили приложение 2. Получили ссылку на сервис 3. Свернули приложение и перешли в Google Play
1. Запустили приложение 2. Получили ссылку на сервис 3. Свернули приложение и перешли в Google Play 4. Android очищает неиспользуемые ресурсы для
приложения в foreground
1. Запустили приложение 2. Получили ссылку на сервис 3. Свернули приложение и перешли в Google Play 4. Android очищает неиспользуемые ресурсы для
приложения в foreground
Visible lifetime
public abstract class ServiceTask<Params, Progress, Result, S extends Service> extends AsyncTask<Params, Progress, Result>{
}
public abstract class ServiceTask<Params, Progress, Result, S extends Service> extends AsyncTask<Params, Progress, Result>{
}
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();
} }
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) }
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(); }
}
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,
Network Type) 2. Не мешать другим приложениям, запущенным
на устройстве (Services) 3. Сохранять состояние 4. Синхронизировать изменения
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,
Network Type) 2. Не мешать другим приложениям, запущенным
на устройстве (Services, BroadcastReceivers) 3. Сохранять состояние 4. Синхронизировать изменения
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,
Network Type) 2. Не мешать другим приложениям, запущенным
на устройстве (Services, BroadcastReceivers) 3. Сохранять состояние 4. Синхронизировать изменения
_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
_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
_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
_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
_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
_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
_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
_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. Обновить локально
_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. Отправить на сервер
_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
_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
• Всегда стабильное состояние
• Всегда стабильное состояние • Возможность оффлайновой работы
• Всегда стабильное состояние • Возможность оффлайновой работы • Информация о текущем статусе
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,
Network Type) 2. Не мешать другим приложениям, запущенным
на устройстве (Services, BroadcastReceivers) 3. Сохранять состояние (Статус операций) 4. Синхронизировать изменения
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,
Network Type) 2. Не мешать другим приложениям, запущенным
на устройстве (Services, BroadcastReceivers) 3. Сохранять состояние (Статус операций) 4. Синхронизировать изменения
Преимущества синхронизации 1. Эффективность 2. Экономичность 3. Незаметность
Service
Back-end в мобильном Android приложении Путь к успеху: 1. Учитывать состояние устройства (Battery Life,
Network Type) 2. Не мешать другим приложениям, запущенным
на устройстве (Services, BroadcastReceivers) 3. Сохранять состояние (Статус операций) 4. Синхронизировать изменения (SyncAdapter)
Кирилл Харьков
р а з р а б о т ч и к , 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