在開發時,我們偶爾會需要獲取指定的某個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
}
}
}