在开发时,我们偶尔会需要获取指定的某个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);
在onCreateDestroy()方法调用如下
AppManager.getInstance().popActivity(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 (webView!= null) {
String url = webView.getUrl();
if (url != null&&url.contains("https://..../index.html")) {
//那么此时认为此activity就是我们要找的activity
}
}
}