使用 FLAG_ACTIVITY_CLEAR_TOP 启动活动
Posted
技术标签:
【中文标题】使用 FLAG_ACTIVITY_CLEAR_TOP 启动活动【英文标题】:Launching Activity With FLAG_ACTIVITY_CLEAR_TOP 【发布时间】:2016-09-29 14:38:06 【问题描述】:当使用 AsyncTask 执行一些重要后台工作的活动使用标志 FLAG_ACTIVITY_CLEAR_TOP 启动活动时。后台任务会发生什么?
【问题讨论】:
【参考方案1】:后台任务将继续处理。
来自文档:
如果设置了,并且正在启动的 Activity 已经在当前任务中运行,那么不会启动该 Activity 的新实例,而是关闭它之上的所有其他 Activity,并且此 Intent 将被传递到(现在在顶部)作为新 Intent 的旧活动。
AsyncTask 是如何工作的? 让我们看看 AsyncTask 源码:
/**
* Creates a new asynchronous task. This constructor must be invoked on the UI thread.
*/
public AsyncTask()
mWorker = new WorkerRunnable<Params, Result>()
public Result call() throws Exception
mTaskInvoked.set(true);
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
//noinspection unchecked
Result result = doInBackground(mParams);
Binder.flushPendingCommands();
return postResult(result);
;
mFuture = new FutureTask<Result>(mWorker)
@Override
protected void done()
try
postResultIfNotInvoked(get());
catch (InterruptedException e)
android.util.Log.w(LOG_TAG, e);
catch (ExecutionException e)
throw new RuntimeException("An error occurred while executing doInBackground()",
e.getCause());
catch (CancellationException e)
postResultIfNotInvoked(null);
;
我们只需要记住两件事。
WorkerRunnable 实际上是 Callable 结果结果 = doInBackground(mParams); // 在后台线程中处理所以这就是你的答案。 doInBackground
将被处理,但 onPostExecute
可能会产生 NPE,因为父活动已被破坏。
【讨论】:
以上是关于使用 FLAG_ACTIVITY_CLEAR_TOP 启动活动的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)