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