首页 > 社交 > 科普中国

关于Android

常驻编辑 科普中国 2022-09-25 漏洞   生命周期   函数   组件   布局   加载   界面   参数   代码   方法
8fJ拜客生活常识网

// extra域包含PreferenceActivity要动态加载的Fragment
PreferenceActivity.EXTRA_SHOW_FRAGMENT (':android:show_fragment') 

// extra域包含传给该Fragment的参数
PreferenceActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS (':android:show_fragment_arguments')

:Android Framework提供了android.preference.PreferenceActivity这个类来对preference进行展示,我们可以继承这个类来展示preference并进行扩展。基类中会接收Intent数据,并进行一定检查,如上两个类就是8fJ拜客生活常识网

Fragment与Activity的关系8fJ拜客生活常识网

  • 一个activity提供一个单一的屏幕和一些功能,一个activity可以包含多个Fragment
  • Fragment可以在不同的activities中重用

Android框架支持在Activity中以Fragment的形式展示界面,而PreferenceActivity是一个支持Fragment的基类activity,它会根据传人的参数EXTRA_SHOW_FRAGMENT, (‘:android:show_fragment’)动态创建fragment而现实相应的界面, 问题就出在PreferenceActivity没有检查传入的参数, 盲目的根据传入的参数构建对象8fJ拜客生活常识网

利用Fragment实现注入攻击。从3.X后,Android工程师重构PreferenceActivity的实现,采用Fragment实现界面的加载。通过阅读源码可以发现,PreferenceActivity的onCreate里,需要读取Intent的多个extra内容,常量都定义在PreferenceActivity里(那堆EXTRA_XXXX就是了),其中有两个常量分别是EXTRA_SHOW_FRAGMENT=":android:show_fragment"和EXTRA_SHOW_FRAGMENT_ARGUMENTS=":android:show_fragment_args",这两个参数可以决定当前的PreferenceActivity首次显示的Fragment。过程比较简单,就是先拿到fragment_class和fragment_args,然后通过反射生成一个Fragment实例,并动态加载。参数传递关键点:参数传递8fJ拜客生活常识网

  • 第一个extra域包含PreferenceActivity要动态加载的Fragment,Fragment也可以通过Fragment.getActivity这个函数来获取传进来的参数。PreferenceActivity会调用Fragment.instantiate来动态加载Fragment.这个函数通过反射来加载Fragment,并把它变成Fragment对象
  • 第二个extra域包含传给该Fragment的参数,其中最关键的逻辑代码如下:
mSinglePane = hidingHeaders || !onIsMultiPane();
String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
Bundle initialArguments = getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
int initialTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_TITLE, 0);
int initialShortTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_SHORT_TITLE, 0);

先获取initalFragment和initialArguments两个参数,之后在switchToHeaderInner里完成实例化:8fJ拜客生活常识网

private void switchToHeaderInner(String fragmentName, Bundle args, int direction) {
	getFragmentManager().popBackStack(BACK_STACK_PREFS, FragmentManager.POP_BACK_STACK_INCLUSIVE);
	Fragment f = Fragment.instantiate(this, fragmentName, args);
	FragmentTransaction transaction = getFragmentManager().beginTransaction();
	transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
	transaction.replace(com.android.internal.R.id.prefs, f);
	transaction.commitAllowingStateLoss();
}

到此为止,我们可以通过设置Intent的extral,实现动态修改PreferenceActivity的初次显示的Fragment8fJ拜客生活常识网

多啰嗦一下,其实Fragment也可以通过Fragment.getActivity这个函数来获取传进来的参数。PreferenceActivity会调用Fragment.instantiate来动态加载Fragment.这个函数通过反射来加载Fragment,并把它变成Fragment对象,如下图:8fJ拜客生活常识网

https://www.androidos.net.cn/android/4.3_r1/xref/frameworks/base/core/java/android/app/Fragment.java

相关阅读:

  • 不锈钢水槽漏洞怎么补
  • 用卢布买天然气存“漏洞”?企业竟可“绕开”制裁购买俄
  • 经过两个交易日之后,金州勇士目前的阵容名单如何?有什么
  • 对于疫情在极短时间内复现的新情况,要快上加快,堵上漏洞
  • 满是漏洞!电商平台;帮;未成年无限制游戏代充
  • 事以密成!高手表面人畜无害,实则鹰视狼顾
  • 直面问题
  • 什么是CSRF
  • 常见安全漏洞修复方法
  • 储户近200万巨款存入交通银行不翼而飞 人脸识别漏洞成
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。