Как приостановить и возобновить тему в Android
Когда я получу UserRecoverableAuthIOException
в AbstractThreadedSyncAdapter
Я создаю уведомление, как показано ниже.
Вот как я создаю сервис:
@Override public IBinder onBind (Intent arg0) {// TODO Автоматически сгенерированный метод stub Log.i("Сервис", "Поток запущен"); вернуть this.getSyncAdapter().getSyncAdapterBinder(); }
private GoogleTasksSyncAdapter getSyncAdapter() {
if (syncAdapter == null)
{
Log.i("Service", "syncAdapter started");
syncAdapter = new MySyncAdapter(this);
}
return syncAdapter;
}
Как только поток запущен, я поднимаю уведомление. Но как только пользователь нажимает на уведомление, он может видеть действие авторизации. После авторизации, как возобновить с последнего пункта. Т.е. как получать уведомления после закрытия активности в Syncadapter.
3 ответа
Поток SyncAdapter запущен, и вы хотите получать уведомление о завершении SyncAdapter, верно?
Таким образом, вы можете связать поток SyncAdapter с BroadCast.
В вашем классе SyncAdapter:
Intent i = new Intent(SYNC_FINISHED);
context.sendBroadcast(i);
Log.i(TAG, "Network synchronization complete");
В упражнении или фрагменте:
private BroadcastReceiver syncFinishedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Sync finished!!");
// Here you can send your notification or another thing that you want
}
};
@Override
public void onStart() {
super.onStart();
getActivity().registerReceiver(syncFinishedReceiver, new IntentFilter(SyncAdapter.SYNC_TASK_FINISHED));
}
@Override
public void onStop() {
super.onStop();
getActivity().unregisterReceiver(syncFinishedReceiver);
}
ПРИМЕЧАНИЕ. Константу SYNC_FINISHED вы можете предварительно определить в своем SyncAdapter.
Я надеюсь, что помог тебе.
Привет!
В вашем SyncAdapter вы делаете что-то вроде:
@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
Log.i(TAG, "Beginning network synchronization");
if(extras.getBoolean(RUN_METHOD_1) || extras.getBoolean(RUN_ALL)) {
method1();
}
if(extras.getBoolean(RUN_METHOD_2) || extras.getBoolean(RUN_ALL)) {
method2();
}
}
public void method1(){
try{
// do something
} catch (Exception e) {
e.printStackTrace();
// here you can send your notification when exception occours.
}
}
public void method2(){
try{
// do something
} catch (Exception e) {
e.printStackTrace();
// here you can send your notification when exception occours.
}
}
в вашем коде "авторизации" вы делаете что-то вроде:
Bundle b = new Bundle();
b.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
b.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
b.putBoolean(SyncAdapter.RUN_METHOD_1, true);
ContentResolver.requestSync(account, CONTENT_AUTHORITY, b);
так что вы можете запустить там, где остановилась синхронизация.
Привет!!!
Вот решение,
нам нужно использовать syncResult.stats.numAuthExceptions
чтобы сказать об исключении, он автоматически выдает сообщение. syncResult.delayUntil будет ждать и перезапустить синхронизацию по истечении времени