使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)