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 "";
}
}