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(…))等等,更多的使用场景大家可以一起在开发中去探索。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章