【发布时间】:2017-02-19 06:16:15
【问题描述】:
我想完成()一个在透明活动下的暂停活动。
我有一个活动,称为活动 A。活动 A 处于活动状态时会发生两件事;
我们可以启动(透明的)Activity 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);
}
}
}
在这个活动显示的列表片段内部有一个启动活动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)
}
}
我的问题是在活动 B 启动后调用完成活动 A 的回调时,活动 A 不会立即完成。它一直处于暂停状态,直到 Activity 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 下方暂停时完成?
说实话,我很惊讶这是一个问题;我认为 backstack 上的活动应该很容易被杀死,但可能不是那些处于 onPause 状态的活动?我一直无法找到这方面的文档,也许有人知道相关的文档/代码?
编辑看我的回答
【问题讨论】:
-
不确定你的整个项目是什么,但你能补充一些关于你为什么要这样做的见解吗?也许您可以在 ActivityB 中覆盖
onBackPressed(),并且永远不允许应用返回到 Activity A,除非您强行杀死它?听起来很老套,只是一个想法。 -
@McAdam331 动机是简单的设计决策;只是想让用户看到 Activity A 下面的 Activity。具体来说,Activity A 是一个“警告消息”活动——当启动活动 B 时,警告将过期,用户应该看到它下面的活动。 Activity B 大部分是透明的并显示动作的状态(例如“加载模块 1 of 10”)
-
您是否考虑过使用 DialogFragment 来获得这种体验?
-
DialogFragment 将是正常的方式,但此对话框是异步启动和控制的,并且是跨进程的。对话片段仍然与特定活动相关联 - 我们需要随时在任何内容上启动此对话。
-
听起来不错。我真的不知道您在这里的活动问题,所以我只是想了解 UX 的目的。让我知道你发现了什么。 :)