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