Я хотел бы закончить() приостановленную деятельность, которая находится под прозрачной деятельностью.
У меня есть активность, называемая активностью A. Две операции могут происходить, когда активна активность А,
-
мы можем запустить (прозрачную) активность B
-
мы можем получить асинхронный обратный вызов для завершения действия A.
Эти два действия происходят очень близко друг к другу. Код выглядит следующим образом:
public class ActivityA extends Activity
{
public class DataHandler implements ContentLoader.OnDataListener
{
@Override
public void onData(Cursor data)
{
_binder.bind(data);
}
}
//If this callback is executed while Activity A is paused, it will not go into onStop until it the activity above it is finished
private class LoaderCallbacks extends ContentLoader.LoaderCallbacks
{
public LoaderCallbacks(ContentLoader loader)
{
super(loader);
}
@Override
public void onLoadFinished(
Loader<Cursor> loader,
Cursor cursor)
{
if (cursor == null || cursor.getCount() <= 0)
{
Log.d("Eric", "* ON FINISH *");
finish();
finishagain();
return;
}
super.onLoadFinished(loader, cursor);
}
}
}
Внутри фрагмента списка, отображаемого этой активностью, есть механизм запуска Activity B
public class FragmentA extends ListFragment
{
//Some fragment functions here...
@Override
public void onListItemClick(
ListView list,
View view,
int position,
long id)
{
Intent intent = new Intent();
intent.setAction(Intent.LAUNCH_ACTIVITY_B);
getActivity().sendBroadcast(intent)
}
}
Моя проблема в том, что callback для завершения действия A называется AFTER, запускается активность B, тогда действие A не завершается немедленно. Он остается в состоянии паузы, пока не завершится действие B, а затем оба завершатся. Это состояние гонки, и я подтвердил это, пытаясь закончить снова, в то время как в приостановленном состоянии, используя простой поток ожидания. Все завершающие вызовы выполняются в основном потоке, как и ожидалось.
private void finishagain()
{
Handler handler = new Handler();
int LOCK_HOME_DELAY = 5000;
handler.postDelayed(new Runnable()
{
public void run()
{
if (notfinished){
Log.d("Eric", "*************** FINISH AGAIN ****************");
finish(); //Does nothing while the activity is paused
}
else{
Log.d("Eric", "* Times up do nothing *");
}
}
}, LOCK_HOME_DELAY);
}
Вот мои журналы (некоторые имена пакетов могут быть отредактированы)
10-10 18:23:05.168 74-98/system_process I/ActivityManager: Displayed somepackage/com.eric.activity.A: +894ms
10-10 18:23:07.135 74-98/system_process I/ActivityManager: Displayed somepackage/com.eric.activity.B: +343ms
10-10 18:23:07.102 547-547/somepackage D/Eric: * Times up do nothign *
10-10 18:23:07.231 547-547/somepackage D/Eric: * ON FINISH *
10-10 18:23:08.220 547-547/com.eric.Status D/Eric: * Times up do nothign *
10-10 18:23:08.305 547-547/com.eric.Status D/Eric: * Times up do nothign *
10-10 18:23:12.305 547-547/com.eric.Status D/Eric: *************** FINISH AGAIN ****************
10-10 18:23:12.305 74-668/system_process W/ActivityManager: Finishing task with all activities already finished
10-10 18:23:12.305 74-668/system_process W/ActivityManager: Duplicate finish request for ActivityRecord{3627639c u0 somepackage/com.eric.activity.A t2292 f}
(Обратите внимание на временные метки - я заканчиваю на: 07 секунд, и он не заканчивается. finishAgain() вызывает завершение снова: 12 секунд, и, похоже, он закрывается здесь, но я видел, что он заканчивается позже. обратите внимание на "дублированный запрос на завершение" - мне кажется, что финиш был поставлен в очередь или что-то в этом роде).
Как я могу заставить Activity A закончить, когда он приостановлен под прозрачной Activity B?
Честно говоря, я удивлен, что это проблема; Я думал, что действия на заднем ходу должны быть легко уничтожены, но, возможно, не в состоянии onPause? Я не смог найти документацию по этому поводу, возможно, кто-то знает соответствующий документ/код?
EDIT см. мой ответ