1.Activity
启动模式
-
四种启动模式
Activity的启动模式有四种:standard、singleTop、singleTask和singleInstance。
singleTop:栈顶复用模式。如果要启动的Activity已经处于栈的顶部,那么此时系统不会创建新的实例,而是直接打开此页面,同时它的onNewIntent()方法会被执行onCreate(),onStart()方法不会被调用。
singleTask:栈内复用模式。如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,因为singleTask本身自带clearTop这种功能。并且会回调该实例的onNewIntent()方法。
-
使用场景
- standard:正常的去打开一个新的页面
- singleTop:消息推送界面。如果当前停留在消息详情界面A,突然来推送消息了,点击推送消息,又创建了一个详情界面A,按返回键back,还是停留在这个详情界面A,造成视觉差异
- singleTask:PP的首页,因为一般为一个APP的第一个页面,且长时间保留在栈中。
- singleInstance:
(1)一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。
(2)不同程序共享activity实例。
(3)电话拨号盘页面,通过自己的应用或者其他应用打开拨打电话页面 ,只要系统的栈中存在该实例,那么就会直接调用。
在使用APP过程中,不可避免页面之间的跳转,那么就会涉及到启动模式。其实在对界面进行跳转时,Android系统既能在同一个任务中对Activity进行调度,也能以Task(任务栈)为单位进行整体调度。在启动模式为standard或singleTop时,一般是在同一个任务中对Activity进行调度,而在启动模式为singleTask或singleInstance是,一般会对Task进行整体调度。
-
配置方式
Manifest中配置
<activity
android:name=".XxxActivity"
android:launchMode="standard">
</activity>
singleTask不设置taskAffinity属性,也就是默在同一个任务栈中.
设置taskAffinity属性,singleTask所在的Activity与启动它的Activity处于不同的任务栈中。
<activity
android:name=".SingleTaskActivity"
android:launchMode="singleTask">
</activity>
android:launchMode="singleTop"
android:launchMode="singleInstance"
对于标准模式,android:launchMode=”standard”可以不写,因为默认就是standard模式。
- 移动编码规范
1.预防组件最小化组件暴露
针对不需要进行跨应用调用的组件,应在配置文件(AndroidManifest.xml)中显示配置android:exported="false"属性。
组件配置android:exported="false"属性,表明它为私有组件,只可在同一个应用程序组件间或带有相同用户ID的应用程序间才能启动或绑定该服务。在非必要情况下,如果该属性设置为“true”,则该组件可以被任意应用执行启动操作,造成组件恶意调用等风险。
2.公开的组件安全
因特殊需要而公开的Activity、Service、Broadcast Receiver、Content Provider组件建议添加自定义permission权限进行访问控制。
1)AndroidManifest.xml中的定义/注册权限的写法为:
<permission
android:name="com.ijiami.permission.testPermission"
android:label="@string/app_name"
android:protectionLevel="normal" />
2)AndroidManifest.xml中Activity组件使用已注册的自定义权限写法为:
<activity
android:name="com.example.bkdemo2.LoginActivity"
android:exported="true"
android:label="@string/app_name"
android:permission="com.ijiami.permission.testPermission" >
</activity>
3)外部应用需要使用自定义权限的写法(AndroidManifest.xml配置)为:
<uses-permission android:name="com.ijiami.permission.testPermission" />
3.显示调用intent
- 参考文档
网友评论