Android 获取app启动来源(是被谁启动的、被哪个第三方app启动?)

1、需求:需要知道当前app或者当前app的指定页面是被谁启动的,被哪个第三方app启动的,来判断是否允许对方启动,如果不被允许的第三方,则不启动app或者不启动app的指定页面。

2、直接上代码。

第一种方式:

// 结果:  android-app://com.google.a
getReferrer();

第二种方式:

/**
     * 通过反射获取referrer.
     * @return  : com.google.a
     */
    private String reflectGetReferrer() {
        try {
            Field referrerField =
                    Activity.class.getDeclaredField("mReferrer");
            referrerField.setAccessible(true);
            return (String) referrerField.get(this);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return "";
    }

调用方式:

public class OpenActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.open_activity);
        // TextView test = findViewById(R.id.test_open);
        // test.setText("第二页面");

        // getReferrer(): android-app://com.google.a
        String packageName1= getReferrer().toString();
        Log.e("SecondActivity", "getReferrer(): " + packageName1);
        // reflectGetReferrer(): com.google.a
        String packageName2 = reflectGetReferrer();
        Log.e("SecondActivity", "reflectGetReferrer(): " + reflectGetReferrer());
        Toast.makeText(getApplicationContext(),"getReferrer(): " + getReferrer()
                + " ,reflectGetReferrer(): " + reflectGetReferrer(), Toast.LENGTH_LONG).show();
        if (!packageName1.endsWith("com.google.a")
                && !"com.google.a".equalsIgnoreCase(packageName2)) {
            // com.google.a  白名单包名,非这个包名则关闭页面。
            finish();
        }
    }

    /**
     * 通过反射获取referrer.
     * @return  : com.google.a
     */
    private String reflectGetReferrer() {
        try {
            Field referrerField =
                    Activity.class.getDeclaredField("mReferrer");
            referrerField.setAccessible(true);
            return (String) referrerField.get(this);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return "";
    }
}