Android之用SingleTask和TaskAffinity解决手机截取的项目启动页面问题
2016-05-14 16:11
351 查看
今天做的远程截屏功能,服务端发一个命令下来,然后客户端截屏,截屏的代码已经写好,因为是跨进程通信的,我最后采取的办法是启动activity来实现的,但是问题来了,如果用户没有登录的情况下,可以截屏到任何页面,但是登录了之后,不在本应用里面切换的话,会回到应用的页面,截屏的页面是当前的应用页面,显然不符合需求,问了下旁边的大神,他说用SingleTask和TaskAffinity来解决这个问题,完美解决。
1. Standard模式(默认)
我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。
2. SingleTop模式
这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。
3. SingleTask模式
如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。
4. SingleInstance模式
当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。
1、如果存在,那么检查是否实例化,如果已经实例化,那么销毁在该Activity以上的Activity并调用onNewIntent。如果没有实例化,那么该Activity实例化并入栈。
2、如果不存在,那么就重新创建Task,并入栈。
二. 1、当一个应用程序加载一个singleInstance模式的Activity时,如果该Activity没有被实例化,那么就重新创建一个Task,并入栈,如果已经被实例化,那么就调用该Activity的onNewIntent;
2、singleInstance的Activity所在的Task不允许存在其他Activity,任何从该Activity加载的其它Actiivty(假设为Activity2)都会被放入其它的Task中,如果存在与Activity2相同affinity的Task,则在该Task内创建Activity2。如果不存在,则重新生成新的Task并入栈。
最后还要一定记得与加上 android:excludeFromRecents="true"
Android:excludeFromRecents控制在不在recent列表中显示。
true时不显示;false显示,默认。
运行如下activity后,不会显示在recent列表中。
<activity
android:name="com.example.com.test.wgh.MainActivity"
android:label="@string/app_name"
android:excludeFromRecents="true">
首先我们回顾下activity启动模式:
当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置。1. Standard模式(默认)
我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。
2. SingleTop模式
这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。
3. SingleTask模式
如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。
4. SingleInstance模式
当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。
对SingleTask和TaskAffinity的理解
一 . SingleTask这个LaunchMode建议和TaskAffinity一起使用,这样才能发挥这种加载模式的特殊逻辑效果。当一个应用程序加载一个singleTask模式的Activity时,首先该Activity会检查是否存在与它的taskAffinity相同的Task。1、如果存在,那么检查是否实例化,如果已经实例化,那么销毁在该Activity以上的Activity并调用onNewIntent。如果没有实例化,那么该Activity实例化并入栈。
2、如果不存在,那么就重新创建Task,并入栈。
二. 1、当一个应用程序加载一个singleInstance模式的Activity时,如果该Activity没有被实例化,那么就重新创建一个Task,并入栈,如果已经被实例化,那么就调用该Activity的onNewIntent;
2、singleInstance的Activity所在的Task不允许存在其他Activity,任何从该Activity加载的其它Actiivty(假设为Activity2)都会被放入其它的Task中,如果存在与Activity2相同affinity的Task,则在该Task内创建Activity2。如果不存在,则重新生成新的Task并入栈。
最后还要一定记得与加上 android:excludeFromRecents="true"
Android:excludeFromRecents控制在不在recent列表中显示。
true时不显示;false显示,默认。
运行如下activity后,不会显示在recent列表中。
<activity
android:name="com.example.com.test.wgh.MainActivity"
android:label="@string/app_name"
android:excludeFromRecents="true">
相关文章推荐
- 大量 Material Design 学习资源
- android中关于位移动画TranslateAnimation开始和结束时闪动问题的记录
- android-----带你一步一步优化ListView(一)
- Android中的Rect类——奇葩的思维
- android:width与android:layout_width的区别
- 第一章:Android概论解析
- Android Studio安装
- Android AutoLayout自适应的适配方式
- Android数据存储方式
- AndroidStudio设置SVN版本控制工具
- 收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation
- Android 自定义SnakeBar
- 【转】Google推荐的命名规则——Android图片资源
- Android 一键生成Parcelable
- Ubuntu 12.10编译Android 4.0.3的常见错误
- Android 自定义checkbox样式
- 安卓绘制圆形图片
- android中加载本地图片到内存
- Android笔记hm002
- Android ListView 小技巧