如何在Activity中獲取調用者

在Activity中獲取調用者身份,有兩個作用:一個是用於安全驗證,另一個是:記錄調用日誌,便於在後續分析日誌,發現非法調用。

Android中有如下API 可以實現獲取調用者:

  1. Binder.getCallingUid() 和 Binder.getCallingPid(),然後根據uid,pid查找到包名

  2. Activity的getCallingPackage() 和 getCallingActivity()

  3. Activity的getReferrer() 【注意:Android 5.1(Api level 22)中才引入的】,直接用過this.getReferrer()獲得。

  4. 反射的方式獲取Activity的mReferrerreflectGetReferrer()【注:自定義函數,目的是獲取到android.app.Activity類的mReferrer的值,也需要Api level 22(含)之後才能使用】

上述API安全結論:
方法1:需要基於Binder機制,不能在調用者startActivity()的時候獲取到調用者的包名,只能用於Activity用到的Binder同步調用的地方。

方法2: 在特定情況下可以使用getCallingPackage() 和 getCallingActivity(),即如果Activity是通過startActivityForResult啓動的,則可以使用。

方法3: Activity的getReferrer()是不可靠的,因爲調用者可以自己設置referrer的值。

調用者通過Intent.EXTRA_REFERRER修改referrer的值,intent.putExtra(Intent.EXTRA_REFERRER, Uri.parse("android-app://com.test.app")); 然後再調用startActivity(intent).

方法4:是對方法3的改進,消除getReferrer()可能返回的不可靠的值,直接獲取可靠的mReferrer值(目前來看是可靠的)。

 

參考文章:

http://blog.csdn.net/u013553529/article/details/53856800

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章