Android 6.0 菜單鍵添加全部清除按鈕


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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM