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