-
Android启动模式之singleinstance的坑
2018-01-16 17:56:35在实际应用中,使用singleinstance启动模式时,会遇到一些奇奇怪怪的问题。Android有四种启动模式,分别是standard,singleTop,singleTask,singleInstance。下面分别简单的介绍下这四种启动模式的作用。 standard...前言
在实际应用中,使用singleinstance启动模式时,会遇到一些奇奇怪怪的问题。Android有四种启动模式,分别是standard,singleTop,singleTask,singleInstance。下面分别简单的介绍下这四种启动模式的作用。
standard
Android 默认的一种启动模式。不需要为activity设置launchMode。这种启动模式简单的来说就是当你startActivity的时候,他就创建一个。
singleTop
这种模式模式从字面意思就能看得出来,就是当前的activity处于栈顶的时候,当你startActivity当前的activity的时候,它不会创建新的activity,而是会复用之前的activity。举个例子,startActivity了一个ActivityA,ActivityA又startActivity了ActivityB,当在ActivityB再次startActivity一个ActivityB的时候,它不会创建一个新的ActivityB,而是复用之前的ActivityB。
这里需要注意的是,只有当前的activity处于栈顶的时候才管用。举个例子:startActivity了一个ActivityA,ActivityA又startActivity了ActivityB,ActivityB又startActivity了ActivityA,那么ActivityA还是会重新创建,而不是复用之前的ActivityA。singleTask
单一任务。意思就是说当前的activity只有一个实例,无论在任何地方startActivity出来这个activity,它都只存在一个实例。并且,它会将在他之上的所有activity都销毁。通常这个activity都是用来作为MainActivity。因为主页只需要存在一个,然后回到主页的时候可以将所有的activity都销毁起到退出应用的作用。举个例子,startActivity了一个ActivityA,ActivityA的启动模式为singleTask,那么在ActivityA里startActivity了一个ActivityB,在ActivityB里startActivity了一个ActivityC。此时在当前的任务栈中的顺序是,ActivityA->ActivityB->ActivityC。然后在ActivityC里重新startActivity了一个ActivityA,此时ActivityA会将存在于它之上的所有activity都销毁。所以此时任务栈中就只剩下ActivityA了。
singleInstance
这个模式才是重点,也是比较容易入坑的一种启动模式。字面上理解为单一实例。它具备所有singleTask的特点,唯一不同的是,它是存在于另一个任务栈中。上面的三种模式都存在于同一个任务栈中,而这种模式则是存在于另一个任务栈中。举个例子,上面的启动模式都存在于地球上,而这种模式存在于火星上。整个Android系统就是个宇宙。下面来详细介绍一下singleInstance的坑。
singleInstance之一坑
此时有三个activity,ActivityA,ActivityB,ActivityC,除了ActivityB的启动模式为singleInstance,其他的启动模式都为默认的。startActivity了一个ActivityA,在ActivityA里startActivity了一个ActivityB,在ActivityB里startActivity了一个ActivityC。此时在当前的任务栈中的顺序是,ActivityA->ActivityB->ActivityC。照理来说在当前ActivityC页面按返回键,finish当前界面后应当回到ActivityB界面。但是事与愿违,奇迹出现了,页面直接回到了ActivityA。这是为什么呢?其实想想就能明白了,上面已经说过,singleInstance模式是存在于另一个任务栈中的。也就是说ActivityA和ActivityC是处于同一个任务栈中的,ActivityB则是存在另个栈中。所以当关闭了ActivityC的时候,它自然就会去找当前任务栈存在的activity。当前的activity都关闭了之后,才会去找另一个任务栈中的activity。也就是说当在ActivityC中finish之后,会回到ActivityA的界面,在ActivityA里finish之后会回到ActivityB界面。如果还想回到ActivityB的页面怎么办呢?我的做法是,在ActivityB定义一个全局变量,public static boolean returnActivityB;界面需要跳转的时候将returnActivityB=true;然后在ActivityA界面onstart方法里判断returnActivityB是否为true,是的话就跳转到ActivityB,同时将returnActivityB=false;这样就能解决跳转的问题了。不过感觉还不是很好,如果有更好的方法,欢迎大家给我留言告诉我一声。
singleInstance之二坑
此时有两个个activity,ActivityA,ActivityB,ActivityA的启动模式为默认的,ActivityB的启动模式为singleInstance。当在ActivityA里startActivity了ActivityB,当前页面为ActivityB。按下home键。应用退到后台。此时再点击图标进入APP,按照天理来说,此时的界面应该是ActivityB,可是奇迹又出现了,当前显示的界面是ActivityA。这是因为当重新启动的时候,系统会先去找主栈(我是这么叫的)里的activity,也就是APP中LAUNCHER的activity所处在的栈。查看是否有存在的activity。没有的话则会重新启动LAUNCHER。要解决这个方法则是和一坑的解决办法一样,在ActivityB定义一个全局变量,public static boolean returnActivityB;在oncreat方法将returnActivityB=true;然后在ActivityA界面onstart方法里判断returnActivityB是否为true,是的话就跳转到ActivityB,同时将returnActivityB=false;这样就能解决跳转的问题了。
基友留言,确实发现了好多问题,所以在此更新2020/5/21
有许多好基友留言,我也确实发现以上的解决方案不是很好,也存在一些问题,所以我又想了另一种解决思路。代码在GitHub上LaunchModeDemo
首先先将每个创建的activity用一个单例类保存下来,接着再用这个单例类保存启动了singleInstance模式的activity。在oncreate()时put,在onDestroy和onBackPressed时remove。为什么要在这两个地方都删除,待会会说明,已经在remove方法里处理了重复删除的问题。
先贴上管理activity的类,也就是添加删除activity的单例类ActivityTaskManagerpackage com.example.launchmodedemo; import android.app.Activity; import java.util.concurrent.CopyOnWriteArrayList; /** Activity栈管理类,当Activity被创建是压栈,销毁时出栈 */ public class ActivityTaskManager { private final CopyOnWriteArrayList<Activity> ACTIVITY_ARRAY = new CopyOnWriteArrayList<>(); private final CopyOnWriteArrayList<Activity> SINGLE_INSTANCE_ACTIVITY_ARRAY = new CopyOnWriteArrayList<>(); private static final Singleton<ActivityTaskManager> SINGLETON = new Singleton<ActivityTaskManager>() { @Override protected ActivityTaskManager create() { return new ActivityTaskManager(); } }; public static ActivityTaskManager getInstance() { return SINGLETON.get(); } public void put(Activity targetActivity) { boolean hasActivity = false; for (Activity activity : ACTIVITY_ARRAY) { if (targetActivity == activity) { hasActivity = true; break; } } if (!hasActivity) { ACTIVITY_ARRAY.add(targetActivity); } } public void remove(Activity targetActivity) { for (Activity activity : ACTIVITY_ARRAY) { if (targetActivity == activity) { ACTIVITY_ARRAY.remove(targetActivity); break; } } } public void putSingleInstanceActivity(Activity targetActivity) { boolean hasActivity = false; for (Activity activity : SINGLE_INSTANCE_ACTIVITY_ARRAY) { if (targetActivity == activity) { hasActivity = true; break; } } if (!hasActivity) { SINGLE_INSTANCE_ACTIVITY_ARRAY.add(targetActivity); } } public void removeSingleInstanceActivity(Activity targetActivity) { SINGLE_INSTANCE_ACTIVITY_ARRAY.remove(targetActivity); } public CopyOnWriteArrayList<Activity> getSingleInstanceActivityArray() { return SINGLE_INSTANCE_ACTIVITY_ARRAY; } public Activity getTopActivity() { if (ACTIVITY_ARRAY.isEmpty()) { return null; } return ACTIVITY_ARRAY.get(0); } public Activity getLastActivity() { if (ACTIVITY_ARRAY.isEmpty()) { return null; } return ACTIVITY_ARRAY.get(ACTIVITY_ARRAY.size() - 1); } }
Singleton
package com.example.launchmodedemo; /** * 单例构建类 */ public abstract class Singleton<T> { private T mInstance; protected abstract T create(); public final T get() { synchronized (this) { if (mInstance == null) { mInstance = create(); } return mInstance; } } }
偷个懒,没什么注释,但是各位那么聪明应该看得懂。
然后贴上我的BaseActivity,基本上都是在这里处理的了
package com.example.launchmodedemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import androidx.appcompat.app.AppCompatActivity; public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityTaskManager.getInstance().put(this); } private static final String TAG = "BaseActivity"; @Override protected void onStart() { super.onStart(); Log.i( TAG, "onStart: " + ActivityTaskManager.getInstance().getLastActivity().getClass().getName()); checkActivityJump(); } @Override public void onBackPressed() { super.onBackPressed(); // 如果不在这里移除当前activity的话,在启动另一个界面的onStart的时候,判断处于栈顶的activity, // 也就是ActivityTaskManager.getInstance().getLastActivity()的时候,就会出现错误。 // 原因是,当一个activity的onPause之后就会启动另一个activity,还没经历过onDestroy, // 而removeActivity();只放在onDestroy中的话就会在启动的activity的onStart // 获取ActivityTaskManager.getInstance().getLastActivity()返回的是错误。 removeActivity(); } private void checkActivityJump() { if (ActivityTaskManager.getInstance().getLastActivity() != null) { Log.i( TAG, "onStart: " + ActivityTaskManager.getInstance().getLastActivity().getClass().getName()); // 如果当前的activity跟添加进去的最后一个activity不是同一个的话,那么这种哦情况就有可能是最后一个activity的启动模式是SingleInstance, // 所以这时候就要遍历添加进去的SingleInstanceActivityArray,看是否有存在,有的话并且跟最后一个添加进去的activity是同一个的话就跳转 // 这里设置了跳转动画,是因为单例模式的跳转动画跟其他的模式不一样,看起来很难受,设置后看起来舒服些,也可以设置别的动画, // 退到后台再进来会一闪,十分明显,添加跳转动画看起来也会舒服些 if (!ActivityTaskManager.getInstance() .getLastActivity() .getClass() .getName() .equals(this.getClass().getName())) { if (ActivityTaskManager.getInstance().getSingleInstanceActivityArray().size() > 0) { for (Activity activity : ActivityTaskManager.getInstance().getSingleInstanceActivityArray()) { if (activity .getClass() .getName() .equals(ActivityTaskManager.getInstance().getLastActivity().getClass().getName())) { ActivityTaskManager.getInstance().removeSingleInstanceActivity(activity); startActivity( new Intent(this, ActivityTaskManager.getInstance().getLastActivity().getClass())); overridePendingTransition(0, 0); break; } } } } } } @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop: " + this.getClass().getName()); } @Override protected void onDestroy() { super.onDestroy(); removeActivity(); } /** 释放资源 */ private void removeActivity() { ActivityTaskManager.getInstance().remove(this); } }
在代码的注释已经解释了我的思路了。我简要说明一下,在onStart中判断,如果当前的activity跟添加进去的最后一个activity不是同一个的话,那么这种哦情况就有可能是最后一个activity的启动模式是SingleInstance,所以这时候就要遍历添加进去的SingleInstanceActivityArray,看是否有存在,有的话并且跟最后一个添加进去的activity是同一个的话就跳转。大家可以看看代码,在注释上写的很清楚的。最后附上代码地址,代码在GitHub上LaunchModeDemo
。总结
Android的启动模式如果利用的好,还是可以解决很多问题的。启动模式还是值得好好的研究一下的。欢迎各位指教出错误,共同学习。如果有不对的地方,请大家指出,一起快乐的改bug。
-
Win10+Ubuntu18.04 亲测UEFI启动模式双硬盘+双系统成功安装经验
2018-06-20 00:24:03本人电脑型号: 戴尔游匣5575 (128固态+1T机械硬盘),Win10UEFI启动模式,64位操作系统 ubuntu18.04下载链接:https://www.ubuntu.com/download/desktop 系统安装过程应注意的事项: 1、安装原理...温馨提示: 本贴适用于 Win10 UEFI 模式启动+双硬盘(固态硬盘+机械硬盘)安装 ubuntu18.04 双系统
本人电脑型号: 戴尔游匣5575 (128固态+1T机械硬盘),Win10UEFI启动模式,64位操作系统
ubuntu18.04下载链接:https://www.ubuntu.com/download/desktop
系统安装过程应注意的事项:
1、安装原理
2、安装环境
3、安装过程
3.1、安装环境配置
3.2、分配硬盘安装空间
3.3、制作启动U盘
3.4、U盘启动安装
3.4.1、基本步骤
3.4.2、盘符选择
3.4.3、分区挂载
4、安装完成
1、安装原理:
不管是单系统还是双系统,是legacy启动还是uefi启动,系统安装原理都是一样的,核心就是:系统部署+系统引导,电脑在启动后只有根据引导文件找到已经部署的系统才能正常启动。那些img、iso等各种类型的镜像文件,是系统的封装形式;进PE安装或者U盘、光盘启动盘安装,是系统的安装方式;用easyBCD、Bootice等工具修复系统引导,是改变系统的启动路径。
2、安装环境:
安装双系统之前首先要了解自己电脑的软硬件环境,不同的软硬件环境搭配会导致不同的安装方法,这一点一定牢记!!网上有很多种安装教程,但是我们直接拿来用却不一定能成功,而且是往往不能成功,原因一般都不是这些教程本身有错误,而是因为其应用的环境与我们安装系统的软硬件环境有差异。
我的环境是:uefi启动模式下的win10 + ubutu18.04,其中win10 安装在 128G固态硬盘上(这也是为啥现在win10 启动时间仅仅10 几秒的原因),Ubuntu18.04LTS 安装在1T 机械硬盘上
3、安装过程:
3.1、环境配置
开机按住 F2 进入 BOIS 设置(不同电脑品牌可能不太一样,有些品牌的电脑开机在右下角有提示,比如戴尔,具体方式自己百度) 用键盘上的方向键 右键 移动光标 到 Boot 选项 ,再用 键盘上的方向键 下键 移动光标至 Secure Boot 将其 Enabled 修改为 Disabled,(Secure Boot 是安全启动项,不关闭的安装到 选择安装类型时 会提提示输入 安全启动项 密码,这个东西打售后技术支持 他们也不会告诉你的,所以为避免不必要的麻烦,一定要记得关闭 安全启动项 ),如图所示:
进入 BOIS 界面:按下图设置:
完成上述修改后,按下 F10,按下图设置:
重启后,按 F2 进入 BIOS ,设置完成后 Boot 的界面如下图:
这说明 Secure Boot 项设置完成,之后 按 ESC 退出 BOIS ,电脑重启
3.2、 分配硬盘安装空间
win10 自带分区功能,鼠标放在 此电脑 上 右键 选择 管理 ,打开界面后选择 磁盘管理 ,接下来在你的 机械硬盘 上 找到一个 容量比较大的磁盘 鼠标选中 容量比较大的磁盘 鼠标右键 压缩磁盘 ,至于压缩磁盘的 大小是自己的磁盘可用量而定 ,我的 压缩磁盘 210GB (刚开始只分配了 150GB ,后来发现不够用, 卸载重新 压缩磁盘 安装的,建议:如果磁盘容量足够大,可以压缩空间大于 200G ),如下图所示:
注意: 压缩的磁盘空间 一定不要分配盘符(即 不要新建卷 ,也即是不需要盘符 D、 E、F这些东西,保持未分配状态)
查看 磁盘1 的分区方式 ,如下图:
压缩后的磁盘空间 210GB 状态 : 未分配(不要新建卷,保持未分配状态)
磁盘空间分配完成
3.3、制作启动U盘
这一步很关键,若电脑是 UEFI 启动模式,而不是 传统的 Legacy 启动,制作的 启动U盘 也要选择 UEFI 启动模式 否则 无法启动
还要注意磁盘的 分区表 是 GPT 还是 MBR ,MBR是旧的分区表形式,GPT 是新的分区表形式,至于二者的具体区别这里不多说,想了解的自行百度,若是 GPT 分区表,制作 U盘 时 就要选择 GPT ,否则 无法启动
制作 启动U盘的工具 推荐这一款 : 下载链接:https://download.csdn.net/download/xrinosvip/10568860 (当然你也可以用其他U盘制作工具,自行百度)
由于我的笔记本 是 UEFI模式启动,机械硬盘是 GPT 分区方案,故在制作 启动U盘 时,选择 用于UEFI计算机的GPT分区方案
至于有些教程说 把 UEFI 模式 在 Boot 中修改为 Legacy 启动模式,对于UEFI 启动模式的 电脑,这是没必要的,这种方法陈旧了,对于新启动模式的电脑 早已不适用,而且就算安装成功,启动win10 和 Ubuntu 时,也要来回修改 Boot 下的 Boot List Option(启动模式),而且这种方法安装的双系统有一个 致命的缺点 就是容易出现 系统崩溃 ,况且 ubuntu18.04 LTS 也是长期支持版,本来就支持 UEFI 启动模式,而且 Legacy 模式 也无法 启动win10 ,具体制作过程如图下图所示:
设置:按照上述图片中的 红色箭头 标注处设置,其余选项默认就可以
3.4、U盘启动安装
3.4.1、基本步骤
插入制作好的U盘,重启电脑,狂点F12(不同主板按键不同)进入Bootloader,找到自己 U盘 ,使用键盘上的方向键选中(有些教程说要设置 U盘启动 ,重启就自动进入安装界面,这一步不是必须的,只要找到自己的 U盘即可),,按下 Enter ,即可进入 ubuntu18.04 的安装界面, 这里可以选择 试用(在试用界面里左边工具栏 有安装图标), 当然也可选择 直接安装,至于选择哪种安装方式都是一样的,具体过程如下图所示:
按F12 进入启动项 ,选择制作的 安装U盘
选中 制作的 U盘 ,按下 Enter ,即可进入安装Ubuntu18.04 界面,会出现 试用不安装 和 直接安装
选择 试用不安装 进入下列界面:
下一步安装:
直接安装 和 试用不安装 进行上面两步操作后,都会进入下面界面:
选择安装语言,按图示操作即可:
下一步,选择键盘布局:
下一步,Updates and others software:
下一步,安装类型,一定要选择 something else:
下一步,分区挂载,这一步很关键:
3.4.2、盘符选择
在原有系统上安装双系统有一个基本原则,那就是无论新系统是否安装成功,都不要破坏原系统环境,否则就是赔了夫人又折兵了。注意Ubuntu盘符的命名特点“sdxy”,其中x指物理磁盘号,y指磁盘的逻辑分区号,如sda1指第一块物理磁盘上的第一块逻辑分区,sdb2指第二块物理磁盘上的第二块逻辑分区。只要找准磁盘分区进行安装,原系统环境就不会被破坏,Ubuntu重装个十次八次的都有恃无恐。
压缩的分区如下图:
下一步
3.4.3、分区挂载
这一步非常重要!非常重要!非常重要!,这一步关系到 Ubuntu系统是否会覆盖掉自带的win10系统 ,也关系到 双系统能否安装成功 ,安装到 Installation type 这一步时,一定要慢慢来,选择 Something else ,然后再点击 Continue ,(此处点击 Contiue 一定要慎重,并不是如某些教程所说的 一顿 Continue 狂点,狂点 Continue 造成的个人损失 本人概不负责),第一次安装一定要慢慢的按照步骤来操作
我的安装方案:
ubuntu18.04只需挂载了 两个分区: 1、 挂载 / 2、 挂载 / home 分别分配空间 90GB 和 110GB
"/" 是根目录,其他的分区会自动挂载到 "/" 根目录,所以 "/" 根目录需要多分配点空间("/"类似于Windows的 c 盘,所以这个目录下装的是系统的东西,如果你安装软件习惯默认安装,没有修改路径的习惯,建议 "/" 多分配点空间,因为默认安装的软件都被安装在 "/usr"目录里面);
"/home" 是用户文件夹(类似于Windows中的 user,当然也可以理解为Windows里面的除 C盘以外的,D,E,F盘,如果安装软件习惯修改安装路径,完全可以将软件安装在"/home"目录下),因此只需挂载这两个分区就够了,下面的挂载分区介绍 仅供参考,具体操作过程如下图所示:
挂载第一个分区, 挂载分区 /,这个 / 是根目录,类似于Windows 里面的 C 盘 :
下一步,在弹出来的界面,分配 挂载分区 / 大小:
第一个挂载分区 / ,完成,点击 OK
下一步,挂载分区 /home :
下一步,设置 挂载分区 /home 大小, /home 类似于Windows里面的 user文件夹或者 D、E、F盘:
挂载分区 /home 完毕,点击 OK, 还不能安装!!!
下一步,选择 将 Boot 安装在 Windows boot Manager 中:
下一步
下一步
下一步
下一步
下一步,进入 安装界面:
挂载分区介绍:
1、挂载“/”,也叫根目录,类似于Windows的 “C”盘,类型为EXT4日志文件系统,选中逻辑分区和空间起始位置, 因为除了home和usr还有很多别的目录,但那些都不是最重要的,“/”就把除了之前你挂载的home和usr外的全部杂项囊括了,大小也不要太小,最好不低于30GB。如果你非要挨个仔细分配空间,那么你需要知道这些各个分区的含义(Linux(ubuntu)分区挂载点介绍) ,对于 ubuntu18.04 不挂载 "/usr"也可以,会自动挂载在 "/"根目下
2、挂载“/home”,类型为EXT4日志文件系统,选中逻辑分区和空间起始位置,这个相当于你的个人文件夹,类似Windows里的User,如果你是个娱乐向的用户,我建议最好能分配稍微大点,因为你的图片、视频、下载内容基本都在这里面,这些东西可不像在Win上面你想移动就能移动的。
总的来说,最好不要低于50GB ,我Ubuntu分区的总大小是150GB ,这里我给了110GB 给home。3、swap交换空间,这个也就是虚拟内存的地方,选择主分区和空间起始位置。如果你给Ubuntu系统分区容量足够的话,最好是能给到你物理内存的2倍大小,像我8GB内存,就可以给个16GB的空间给它,这个看个人使用情况,太小也不好,太大也没用。(其实我只给了8GB,没什么问题),其实也可以不设置,如果内存足够大,没必要设置,就 ubuntu18.04而言,这个swap 完全可以不要
4、boot 一定记住,不要单独/boot划分区;是的不要,不然就完蛋了,结果就是只能进一个系统,因为这里是EFI引导替代boot的grub;也请放心efi分区不会不够用,linux内核不在efi分区而在/boot,在你挂载分区,你会发现也是没有 Boot 的 挂载选项的,新教程这一项不需要了!
在安装和分区界面,看到最下面一个,安装启动器到,换成你的EFI分区,一般有windows boot manager 等标识,就是 /dev/sda1 EFI 这样的(不分配Boot的具体原因参照此贴:http://forum.ubuntu.org.cn/viewtopic.php?p=3200137)
5、挂载“/usr”,类型为EXT4日志文件系统,选中逻辑分区和空间起始位置,这个相当于你的软件安装位置,Linux下一般来说安装第三方软件你是没办法更改安装目录的,系统都会统一地安装到/usr目录下面,因此你就知道了,这个分区必须要大,针对ubuntu18.04也可以不挂在,会在 "/" 根目录下自动挂载一个 "/usr"
(这里特别提醒一下,Ubuntu最新发行版不建议强制获取Root权限,因为我已经玩崩过一次。所以你以后很多文档、图片、包括免安装软件等资源不得不直接放在home分支下面。你作为图形界面用户,只对home分支有完全的读写执行权限,其余分支例如usr你只能在终端使用sudo命令来操作文件,不利于存放一些直接解压使用的免安装软件。因此,建议home分支多分配一点空间……)
不过就算你把所有目录都自定义分配了空间也必须要给“/”挂载点多分配一定的空间 。
4、 安装完成 ,重启电脑,默认 Ubuntu 是第一启动项, 重启电脑不能启动 Ubuntu
重启ubuntu18.04卡在某个界面进不去,解决办法如下:
如果启动后报错:BUG soft Lockup,关于这个错误参照下面链接:https://blog.csdn.net/xrinosvip/article/details/80447139
5、Win10 和Ubuntu 启动引导向管理软件解决办法:https://blog.csdn.net/xrinosvip/article/details/80994450
6、Ubuntu 下使用Linux命令简单总结:https://blog.csdn.net/xrinosvip/article/details/80894728
7、纯英文论文看不懂,翻译软件来帮忙,支持整篇PDF或Word上传,翻译高效准确,首次注册送翻译积分,用于翻译论文:https://www.fanyigou.com/tslg/share/Y19DEA5W.htm
Reference:
解决Windows10与Ubuntu16.04双系统时间不一样问题!(亲测,真正的正确方案)
-
UEFI启动模式和传统的Lagency启动模式
2013-12-04 20:47:07UEFI启动模式和传统的Lagency启动模式完全不同,因此很有必要先了解一下UEFI BIOS和UEFI启动模式 1 必须搞清的几个UEFI问题 (1) UEFI启动模式 与 legacy启动模式 legacy启动模式: 就是这么多年来PC一直在使用的...UEFI启动模式和传统的Lagency启动模式完全不同,因此很有必要先了解一下UEFI BIOS和UEFI启动模式
1 必须搞清的几个UEFI问题
(1) UEFI启动模式 与 legacy启动模式
legacy启动模式: 就是这么多年来PC一直在使用的启动方式(从MBR中加载启动程序),UEFI BIOS作为一种新的BIOS自然也应该兼容这种老的启动方式;UEFI启动模式: UEFI BIOS下新的启动技术。
如果你的PC在UEFI启动模式下预装了Win8,你会发现有两个很小的隐藏分区。一个叫ESP(EFI系统分区),另一个MSR(Microsoft保留分区,通常为128MB)。MSR是windows要求的。ESP对UEFI启动模式很重要,UEFI的引导程序是以后缀名为.efi的文件存放在ESP分区中的,ESP分区采用fat32文件系统。此外,可能还存在一个小分区叫WinRE Tools,这个是win8的恢复分区,体积也很小。所以千万不要手贱把这三个分区删了。但对我们有意义的是ESP分区,windows下想访问ESP分区需用分区工具给它分配盘符并取消隐藏;而ubuntu则直接将这个分区挂载到/boot/efi,直接用文件夹浏览器进去就可以看到各种.efi文件了。
因此第一个关键问题就是确定自己的启动模式,方法是进入BIOS,然后你会发现有一项叫"boot mode",选中"UEFI boot"就是UEFI启动模式,选中"Legacy boot"就是Legacy启动模式。见过吭爹的UEFI BIOS:有着非常华丽的BIOS界面,还能使用鼠标,但却只支持Legacy boot。
(2) UEFI启动模式只支持64位的系统,所以预装的win8是64位的,ubuntu(kylin)也需要64位的。
(3) UEFI BIOS 和 Legacy BIOS
我们都知道可以在传统的bios中调整设备的启动优先级,UEFI BIOS在UEFI启动模式下不但可以调整设备的优先级,还可以调整设备中引导程序的优先级,安装完ubuntu之后,你再进BIOS就会发现多了一个可选择的启动项叫ubuntu。此外,UEFI BIOS也引入了一些新的技术,例如Fast boot和secure boot,当然后面一项完全是用来坑爹的。
(4) UEFI启动模式下如何从u盘或移动硬盘引导
只要u盘或移动硬盘上有一个fat32的分区,分区的根目录下有个文件夹叫EFI,UEFI就会自动去查找相应的启动文件(.efi)
如果你刚制作了ubuntu(kylin)-13.04-64位的启动u盘,可以打开它,你会发现分区的文件系统是fat32,确实有一个EFI文件夹,进去看看就是各种.efi引导文件(这里再次强调64位,32位下你是找不到这个文件夹的)。因此现在想制作可启动的u盘或移动硬盘就简单了,只需要复制粘贴就行了。
部分UEFI BIOS还支持从NTFS分区中查找启动文件。 -
Activity四种启动模式区别与适用场景、两种启动模式设置方式区别
2020-07-23 12:20:30管理方式 Activity的管理方式 =任务栈 任务栈 采用的结构 = “后进先出” 的栈结构 每按一次Back键,就有一个Activity出栈 区别: ...启动模式的设置 ...启动模式有2种设置方式: ... 默认启动模式,每次启动Activi...管理方式
- Activity的管理方式 = 任务栈
- 任务栈 采用的结构 = “后进先出” 的栈结构
- 每按一次Back键,就有一个 Activity出栈
区别:
启动模式的设置
启动模式有2种设置方式:
1.在 AndroidMainifest设置
<activity android:name=".MainActivity"
android:launchMode="singleTop">
有四种模式
standard
默认启动模式,每次启动Activity,无论任务栈中是否已经有这个Activity的实例,系统都会创建一个新的Activity实例。
适用场景:普通页面
singleTop
singleTop模式的Activity已经位于任务栈的栈顶,再去启动它时,不会再创建新的实例,如果不位于栈顶,就会创建新的实例。
适用场景:通知、新闻(APP接收到多条推送消息,点开不同消息,均由同一实例展示。)
singleTask
SingleTask模式的Activity在同一个Task内只有一个实例,如果Activity已经位于栈顶,系统不会创建新的Activity实例,和singleTop模式一样。但Activity已经存在但不位于栈顶时,系统就会把该Activity移到栈顶,并把它上面的activity出栈。
适用场景:主页,无论哪种业务场景下再次回到此页,都不应保留之上Activity。
singleInstance
和singleTask不同,singleTask只是任务栈内单例,系统里是可以有多个singleTask Activity实例的,而singleInstance Activity在整个系统里只有一个实例,启动一singleInstance的Activity时,系统会创建一个新的任务栈,并且这个任务栈只有他一个Activity。
适用场景:系统闹钟页面、来电显示、系统通讯录,不同APP调用此类Activity 时,首次创建实例,之后其他APP只能复用此实例。
2.通过 Intent设置标志位
Intent inten = new Intent (ActivityA.this,ActivityB.class); intent.addFlags(Intent,FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
FLAG_ACTIVITY_SINGLE_TOP
指定启动模式为栈顶复用模式( SingleTop)
FLAG_ACTIVITY_NEW_TASK
指定启动模式为栈内复用模式( SingleTask)
FLAG_ACTIVITY_CLEAR_TOP
所有位于其上层的Activity都要移除, SingleTask模式默认具有此标记效果
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有该标记的Activity不会出现在历史Activity的列表中,即无法通过历史列表回到该Activity上
二者设置的区别
- 优先级不同 Intent设置方式的优先级 > Manifest设置方式,即以前者为准
- 限定范围不同 Manifest设置方式无法设定 FLAG_ACTIVITY_CLEAR_TOP; Intent设置方式 无法设置单例模式( SingleInstance)
-
Android Activity的四种启动模式
2018-12-18 23:06:12相信很多人和我一样,在初学Android甚至初入职场的时候不了解Acticity的启动模式,或者为了面试刷题刷到了,但并不理解启动模式的作用,以及如何正确的使用启动模式而不是所有的都是用默认模式。 二、Activi... -
singleInstance启动模式
2015-08-18 11:36:26Android Activity的启动模式有多种,我们已经学习过“singleTop”,“standard”这两种模式。下面我们将介绍另外两种启动模式“singleTask”和“singleInstance”。 单一任务模式 复制粘贴工程... -
STM32三种启动模式
2017-11-30 17:23:06用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。STM32上电或者复位后,代码区始终从0x00000000开始,三种启动模式其实就是将各自存储空间的地址映射到0x00000000中。(1)从Flash启动,将主... -
UEFI启动模式下安装Ubuntu 16.04教程
2017-03-11 19:36:28这篇博文主要谈一谈如何在UEFI启动模式下正确安装Ubuntu16.04,以形成Windows 10和Ubuntu 16.04的双系统。随着UEFI的普及,现在新出的笔记本电脑几乎都是支持UEFI的,这是一种先进安全的启动模式,而且Ubuntu本身也... -
Activity 启动模式及常见启动Flag总结
2018-11-08 23:33:29Activity 4种启动模式: 1、android:launchMode=”standard” 标准启动模式。这种启动模式也是Activity默认的,一个栈中可以有多个相同的Activity。不会考虑是否栈中是否有相同的Activity。比如设置A为standard模式... -
Activity的四种启动模式
2020-11-21 14:35:09Activity的启动模式一共有四种,分别为standard、singleTop、 singleTask、 singleInstance,可以在AndroidManifest.xml中通过给标签指定 android:launchMode属性来选择启动模式。 一、standard模式 standard模式是... -
Android -- 启动模式(singleTop启动模式)
2015-04-16 12:05:39了解了标准的启动模式,是使用任务栈,先进后出,后进先出的模式进行启动的,下面我们来看另外一个singleTop启动模式。1、我们来看图,这个页面我增加了2个按钮,分表转A页面和B页面,先来看A,我们的taskid=18,... -
Activity的启动模式
2019-04-02 08:33:43Activity的启动模式 Activityde LaunchMode : 首先说一说Activity为什么需要启动模式? 当我们多次创建相同的一个activty时,系统会创建多个实例,一一的添加到任务栈中,当我们返回的时候,由于任务栈... -
【Android】Android启动模式详解
2019-12-17 21:52:20Android启动模式详解 standard 默认模式。在该模式下,Activity可以拥有多个实例,并且这些实例既可以位于同一个task,也可以位于不同的task。每次都会新创建。 singleTop 该模式下,在同一个task中,如果存在该... -
Activity启动模式学习
2016-05-03 22:55:30最近学习了Activity的启动模式,这里记录下,以便以后回顾Activity有四种启动模式,分别为: * standard * singleTop * singleTask * singleInstancestandard默认情况下,系统会以standard模式来启动activity,... -
Linux启动模式修改为命令行模式
2017-06-03 22:52:52Linux启动模式修改为命令行模式 vim /etc/inittab 修改红框内的的数字5改为3保存并重启系统,即5为默认图形界面启动,3为默认多用户命令行界面启动 -
Activity启动模式launchMode
2016-04-28 23:45:15今天要讲得是Activity的四种启动模式launchMode属性,该属性用于配置该Activity的加载模式,该属性支持以下4个属性值。 standard:标准模式,也是默认模式。 singletop:Task栈顶单例模式。 singleTask:Task内... -
CentOS7修改系统启动模式
2019-05-08 12:10:51在CentOS Linux上我们通常都是修改 /etc/inittab 文件,在其中加入 “id::initdefault:” 来设置系统启动模式,但是在 CentOS7 上发现这个文件似乎是没用了,修改后重启机器并不会启动机器到设置的模式。 于是乎,... -
Activity singleInstance启动模式
2016-07-19 21:07:25Android singleInstance启动模式实际开发中使用频率不高,最近解了一个bug,与此相关,bug虽然很轻松的解决了,但由它引发的对Activity的启动模式的思考却有点意思,本篇记录分享下。 -
Activity中AndroidMainfest启动模式
2016-11-19 21:55:58Activity中AndroidMainfest启动模式 Android开发者在AndroidMainifest文件中一共设计了四种启动模式:standard,singleTop,singleTask,singleInstance。想要应用这些启动模式,需要在权限文件中中加入<... -
Activity四种启动模式
2012-08-23 16:42:01Activity启动方式有四种,分别是: standard singleTop singleTask singleInstance ...可以根据实际的需求为...设置Activity的启动模式,只需要在AndroidManifest.xml里对应的标签设置android:launchMode属性, -
Activity 启动模式个人见解
2016-06-16 17:59:21Android 开发中我们打交道最多的就是Activity,Activity 有四种启动模式,每一种启动模式都代表着特定的使用场合了解Activity 的启动模式,可以对我们使用Activity得心应手。Activity Standard启动模式standard是... -
STM32开发 -- 烧写/启动模式
2018-06-05 20:07:25根据我一贯的作风,接下来该讲烧写/启动模式,然后再讲各种烧写方法和过程,最后是启动流程。 这一篇文章,就看一下 烧写/启动模式。 一、启动模式(Boot modes) 阅读:STM32中文参考手册_V10.pdf 查看... -
Android 代码设置启动模式
2018-01-09 21:36:36今天一个朋友问道了这个问题,从A activity启动一个B activity,B启动一个C,C启动一个D,A、B、C、D四个都是默认的启动模式。现象需要D直接回到A activity,但是不能重新创建一个新的Activity。怎么给D的Activity ... -
STM32启动模式详解
2017-11-01 11:25:40一、三种boot启动模式: 一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动 模式。 1、第一种方式(boot0... -
深入理解Activity启动模式
2016-04-14 10:14:33概述 Android官网介绍Activity的启动模式时比较含糊,介绍Application,Activity,Task,Process,Thread等概念以及...官网介绍singleTask启动模式时,说只要启动singleTask启动模式的Activity就会新建Task,但在实 -
Android四大组件---Activity之启动模式及启动模式的应用场景
2016-01-11 20:39:08主界面Activity启动模式设置singleTask,一般界面Activity的启动模式设置为 singleTop。 那么这条“性能优化的规则”到底是为什么这么规定呢?OK,本篇博文将为大家解开这个迷惑。 在介绍Act
-
Vue3 实现 Reactivity
-
转行做IT-第2章 HTML入门及高级应用
-
SQL Server 2016 高可用灾备技术合集
-
【数据分析-随到随学】Spark理论及实战
-
Java Web开发之Java语言基础
-
禁止用户关闭重启注销操作系统 用户是否可以关闭操作系统是通过对WM_QueryEndSession消息的处理来实现的.zip
-
pyechart数据可视化
-
ManTraNet-Demo.ipynb
-
转行做IT-第6章 IDEA、方法
-
Xdebug helper.zip
-
webcrawlingNotes.pdf
-
Centos8.0: 环境搭建,看这里就够了。
-
Tor下载教程
-
数据类型转换、运算符、方法入门
-
资料下载 | 2020年中国FPGA芯片行业研究报告
-
浅谈Masonry的使用技巧
-
Flutter随手记:发布自己的插件
-
WGS坐标转国测GCJ奥维的VB源码
-
httpclient支持jar打包
-
2017年福建高职单招计算机类技能试卷