如何跨App启动Activity?有哪些注意事项
面试官视角
- 是否了解如何启动外部应用的Activity(初级)
- 是否了解如何防止自己的Activity被外部非正当的启动(中级)
- 是否对拒绝服务漏洞有所了解
- 如何在开发时规避服务漏洞
题目剖析
- 跨App 、 注意事项(即使没问也要引出)
共享uid的App
AppA(ActivityA) -> AppB (ActivityB)
在 mainfest中注册android:sharedUserId=”xxx.xxx”(AppA和AppB要一样)
startActivity(Intent().setComponent(ComponentName(“A的包名+类名”,”B的包名+类名”)))
#使用exported
Mainfest中将Activity的export设置为true
startActivity(Intent().setComponent(ComponentName(“A的包名+类名”,”B的包名+类名”)))
同上
使用intentFilter
在Mainfest中定义一个Action
<activity …….>
startActivity(Intent(“类全路径”))
为允许外部启动的Activity加权限
AppB 在Mainfest中声明权限
在AppA中需要也声明AppB的这个权限
AppB必须必AppA先安装才可以访问
拒绝服务漏洞
AppA -> AppB的时候传递(bundle)
AppA将序列化的类A通过Bundle传递给AppB
AppB将Bundle序列化,但是B中没有A这个类,这时会抛类找不到异常 这就是拒绝服务漏洞我们可以在Intent.getExtra的时候try{}catch{}
所以最好不要将Activity暴漏出来(exported设置为true就会暴露),如果要暴露最好加上权限
本节回顾
- 跨App启动Activity首先要明确App之间的关系
- 外部可启动exported或有intentFilter的Activity
- 可外部启动的Activity需要拒绝服务漏洞
- 尽量不暴露Activity,为暴露的Activity加权限控制
- Intent的Extras读取时要捕获异常