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();
}
}
}