android6.0的系统没有附带全部清除按钮,不过其大致实现已经添加。

主要模块有:

此模块有开启几个app 就创建几个TaskView

\LINUX\android\frameworks\base\packages\SystemUI\src\com\android\systemui\recents\views\TaskView.java

任务栈,与TaskView关系为1 TaskStackView 对应 N TaskView 

\LINUX\android\frameworks\base\packages\SystemUI\src\com\android\systemui\recents\views\TaskStackView.java

最近任务自定义视图,与TaskStackView关系为N TaskStackView 对应 1 RecentsView 

\LINUX\android\frameworks\base\packages\SystemUI\src\com\android\systemui\recents\views\RecentsView.java

最近任务页面

\LINUX\android\frameworks\base\packages\SystemUI\src\com\android\systemui\recents\RecentsActivity.java

 

主要实现:
从TaskView分析,发现其关闭方法在一个包访问权限方法内
方法名为void dismissTask()

另外TaskStackView中有一个获取TaskView数组的方法
List<TaskView> getTaskViews()

那么结合RecentsView类中也有一个获取TaskStackView数组的方法
List<TaskStackView> getTaskStackViews()

那么我们就可以直接从RecentsView类获取到TaskView对象做逐一关闭(此处关闭需要关闭可视范围类的近期任务,用于动画效果处理,然后再扫描任务列表做全部关闭)

具体流程就是这样。


下面代码实现:

布局:

Index: /LINUX/android/frameworks/base/packages/SystemUI/res/layout/recents.xml
<Button  
        android:id="@+id/clean_all_recent_apps"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp"
        android:padding="15dp"
        android:layout_gravity="right"
        android:background="#00000000"
        android:text="@string/clear_all_notifications_text"
        android:textColor="#ffffff"
        android:textSize="15dp" />

 

代码:

Index: /LINUX/android/frameworks/base/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java

添加方法:

public void dismissAllTasksAnimated() {
    int childCount = getChildCount();
    for (int i = 0; i < childCount; i++) {
        View child = getChildAt(i);
        if (child != mSearchBar) {
            TaskStackView stackView = (TaskStackView) child;
            stackView.dismissAllTasks();
        }
    }
}
\LINUX\android\frameworks\base\packages\SystemUI\src\com\android\systemui\recents\views\TaskStackView.java

添加方法:

public void dismissAllTasks() {
    post(new Runnable() {
        @Override
        public void run() {
            ArrayList<Task> tasks = new ArrayList<Task>();
            tasks.addAll(mStack.getTasks());

            // Remove visible TaskViews
            int childCount = getChildCount();
            for (int i = 0; i < childCount; i++) {
                TaskView tv = (TaskView) getChildAt(i);
                tasks.remove(tv.getTask());
                tv.dismissTask();
            }

            int size = tasks.size();
            // Remove any other Tasks
            for (int i = 0; i < size; i++) {
                Task t = tasks.get(i);
                if (mStack.getTasks().contains(t)) {
                    mStack.removeTask(t);
                }
            }
        }
    });
}

之后再绑定点击事件

Index: /LINUX/android/frameworks/base/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java

添加全局变量:

private View mClearRecent;

在public void onCreate(Bundle savedInstanceState)方法的setContentView(R.layout.recents);行后面加

//The Clean All Button
        mClearRecent = findViewById(R.id.clean_all_recent_apps);
        if(mClearRecent != null){
            mClearRecent.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mRecentsView.dismissAllTask();
                }
            });
        }

  

在void updateRecentsTasks()方法中对于mEmptyView操作的地方修改为(mEmptyViewStub隐藏mClearRecent就显示)

// Update the top level view's visibilities
        if (mConfig.launchedWithNoRecentTasks) {
            if (mEmptyView == null) {
                mEmptyView = mEmptyViewStub.inflate();
            }
            mEmptyView.setVisibility(View.VISIBLE);
            mClearRecent.setVisibility(View.GONE);
            if (Constants.DebugFlags.App.EnableSearchBar) {
                mRecentsView.setSearchBarVisibility(View.GONE);
            }
        } else {
            if (mEmptyView != null) {
                mEmptyView.setVisibility(View.GONE);
                mClearRecent.setVisibility(View.VISIBLE);
            }
            if (Constants.DebugFlags.App.EnableSearchBar) {
                if (mRecentsView.hasValidSearchBar()) {
                    mRecentsView.setSearchBarVisibility(View.VISIBLE);
                    mClearRecent.setVisibility(View.GONE);
                } else {
                    refreshSearchWidgetView();
                }
            }
        }

  

 posted on 2017-02-07 17:20  extfff  阅读(2305)  评论(0编辑  收藏  举报