Android獲取指定的activity以及其中的數據

在開發時,我們偶爾會需要獲取指定的某個activity中的某個數據。比如,我有一個activity裏面是一個webview,這個activity頁面是複用的,裏面的webview換個URL就是一個新頁面了,而現在我讓你找到其中的某一個特定URL的頁面,你怎麼辦?
此時我們可以使用本文的方法,來處理這個問題。首先明確一點,每次打開一個新的webview頁面,那麼這個頁面就會在activity的任務棧中創建一個實例。鑑於此,問題就變得簡單了。我們其實是可以獲取到現有任務棧中所有的activity的。使用方法如下:
public class ActivityStackManager {

    private static Stack<Activity> activityStack;
    private static ActivityStackManager instance;

    private ActivityStackManager() {
    }

    public static ActivityStackManager getInstance() {
        if (instance == null) {
            instance = new ActivityStackManager();
        }
        return instance;
    }

    public void popActivity() {
        Activity activity = activityStack.lastElement();
        if (activity != null) {
            activity.finish();
            activity = null;
        }
    }

    public void popActivity(Activity activity) {
        if (activity != null) {
            activity.finish();
            activityStack.remove(activity);
            activity = null;
        }
    }

    public Activity currentActivity() {
        Activity activity = activityStack.lastElement();
        return activity;
    }

    public void pushActivity(Activity activity) {
        if (activityStack == null) {
            activityStack = new Stack<Activity>();
        }
        activityStack.add(activity);
    }

    public void popAllActivityExceptOne(Class cls) {
        while (true) {
            Activity activity = currentActivity();
            if (activity == null) {
                break;
            }
            if (activity.getClass().equals(cls)) {
                break;
            }
            popActivity(activity);
        }
    }

	/**
     * 獲取指定的Activity
     */
    public static AppCompatActivity getActivity(Class<?> cls) {
        if (activityStack != null)
            for (AppCompatActivity activity : activityStack) {
                if (activity.getClass().equals(cls)) {
                    return activity;
                }
            }
        return null;
    }

    public void onDestory() {
        if (activityStack != null)
            while (!activityStack.empty()) {
                instance.popActivity();
            }
        activityStack = null;
        instance = null;
    }
}

這個方法我們一般是在activity的基類中使用,在onCreate()方法調用如下

AppManager.getInstance().pushActivity(this);

這時你的所有繼承此基類的activity在創建時都會被加入到你的這個棧中,方便你對其進行管理。
現在我們就回到上面的問題中去,這時你的任務棧中存放了n個activity,你如何去獲取到你想要的呢?有個方法,我們可以遍歷這個任務棧,判斷activity的名稱,比如上述代碼中的 getActivity()方法,傳入指定方法的方法名即可。但是針對於上面webview複用的activity它的名稱是相同的,那麼此時我們肯定不能單純的只去判斷相關的類名了。既然是個webview,那麼不同的URL就是不同的頁面,相同的頁面URL一定相同。OK,此時我們可以獲取當前的activity的webview的URL數據,再去判斷是否是我們需要的即可。
方法如下:
  Stack<AppCompatActivity> activityList = AppManager.getInstance().getAllActivityStacks();
            for (AppCompatActivity appCompatActivity : activityList) {
                WebView webView = ((BaseActivity) appCompatActivity).findViewById(R.id.x5_webview);
                if (x5WebView != null) {
                    String url = webView.getUrl();
                    if (url != null&&url.contains("https://..../index.html")) {
						//那麼此時認爲此activity就是我們要找的activity
                    }
                }
            }
OK,至此。我們的需要的功能基本就實現了。你可以據此舉一反三,比如獲取某個頁面的中的textView的值(activity.findviewbyid(…))等等,更多的使用場景大家可以一起在開發中去探索。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章