Andorid基础知识安全

如何在Activity中获取调用者 -- getReferrer

2019-12-30  本文已影响0人  萨达哈鲁酱

如何在Activity中获取调用者 -- getReferrer()

前言

为什么要在Activity中获取调用者?
主要是安全定制两个方面的需求吧。


在Activity中获取调用者的方法

注:先列出所有可能的方法,后面会给出哪些方法可行。

这里先给出结论:


关于mReferrer的细节

Activity的getReferrer()

需要注意的是,此方法是在Android 5.1 (Api level 22)中引入的,Android 5.1之前是不能使用的。

Intent.java

public static final String EXTRA_REFERRER
            = "android.intent.extra.REFERRER";
    public static final String EXTRA_REFERRER_NAME
            = "android.intent.extra.REFERRER_NAME";

Activity.java

public Uri getReferrer() {
        Intent intent = getIntent();
        // 优先从Intent的Intent.EXTRA_REFERRER数据获取Uri,作为referrer
        Uri referrer = intent.getParcelableExtra(Intent.EXTRA_REFERRER);
        if (referrer != null) {
            return referrer;
        }
        // 如果之前没有获取到,则从intent的Intent.EXTRA_REFERRER_NAME数据获取,并转换成Uri
        String referrerName = intent.getStringExtra(Intent.EXTRA_REFERRER_NAME);
        if (referrerName != null) {
            return Uri.parse(referrerName);
        }
        // 如果上面都没有获取到,则将mReferrer转换成android-app://的形式
        if (mReferrer != null) {
            return new Uri.Builder().scheme("android-app").authority(mReferrer).build();
        }
        return null;// 都没获取到的话,返回null
    }

反射的方式获取Activity的mReferrer

需要注意的是,此方法是基于getReferrer()(mReferrer)的,所以也必须在Android 5.1 (Api level 22)及 5.1 之后才能用。

自定义方法:

private String reflectGetReferrer() {
        try {
            Class activityClass = Class.forName("android.app.Activity");

            Field refererField = activityClass.getDeclaredField("mReferrer");
            refererField.setAccessible(true);
            String referrer = (String) refererField.get(MainActivity.this);
            return referrer;
        } catch (ClassNotFoundException | IllegalAccessException | NoSuchFieldException e) {
            e.printStackTrace();
            return "No referrer";
        }
    }

总结

上一篇 下一篇

猜你喜欢

热点阅读