问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何保证Activity实例个数唯一(Activity启动模式)

发布网友 发布时间:2022-04-25 20:48

我来回答

1个回答

热心网友 时间:2022-06-17 06:55

public class ActA extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); /** * standard 模式: * <p> * 当使用当前代码块启动Activity时,每次都是新创建了一个Activity实例. * 因为是使用默认启动模式(标准模式),我们可以通过下面TextView文本中 hash code 来识别是否为新Activity * 此时点击back可以依次看到先前启动的Activity实例,类似栈退出操作,而启动过程类似压栈操作 * * singleTop 模式: * <p> * 运行的时候会发现,按多少遍按钮,都是相同的ActiA实例,因为该实例在栈顶,因此不会创建新的实例.如果回退,将退出应用 * singleTop模式,可用来解决栈顶多个重复相同的Activity的问题.如果是A Activity跳转到B Activity,再跳转到 * A Activity,行为就和standard一样了,会在B Activity跳转到A Activity的时候创建A * Activity的新实例,因为当时的 栈顶不是A Activity实例 * * singleTask 模式: * <p> * 当intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例 * .如果有直接将 intent发送给它. * * singleInstance模式: * <p> * 首先要说一下Task的概念.如果是Swing或者Windows程序,可能有多个窗口可以切换,但是你无法在自己程序中复用人家的窗口. * 注意是直接复用人家的二进制代码,不是你拿到人家api后的源代码级调用.Android可以做到,让别人的程序直接复用你的 * Activity(类似桌面程序的窗口).Android为提供这种机制,就引入了Task的概念. * <p> * Task可以认为是一个栈,可放入多个Activity.比如启动一个应用,那么Android就创建了一个Task, * 然后启动这个应用的入口Activity * ,就是intent-filter中配置为main和launch的那个(见一个APK文件部署产生多个应用安装 * 的效果)这个Activity是根 * (Root)Activity,可能会在它的界面调用其他Activity,这些Activity如果按照上面那三个模式 * ,也会在这个栈(Task)中,只是实例化的策略不同而已. 验证的办法是调用和打印Activity的taskId: * <p> * TextView textView2 = new TextView(this); * textView2.setText("task id: "+this.getTaskId()); * 会发现,无论切换Activity,taskId是相同的 * * 当然也可以在这个单一的Task栈中,放入别人的Activity,比如google地图,这样用户看过地图按回退键的时候, * 会退栈回到调用地图的Activity.对用户来说,并不觉得在操作多个应用.这就是Task的作用. * * 但是,有这样的需求,多个Task共享一个Activity(singleTask是在一个task*享一个Activity) * 现成的例子是google地图.比如我有一个应用是导游方面的,其中调用的google地图Activity.那么现在我比如按home键, * 然后到应用列表中打开google地图,你会发现显示的就是刚才的地图,实际上是同一个Activity. * * 如果使用上面三种模式,是无法实现这个需求的.google地图应用中有多个上下文Activity,比如路线查询等的, * 导游应用也有一些上下文Activity.在各自应用中回退要回退到各自的上下文Activity中 * * singleInstance模式解决了这个问题(绕了这么半天才说到正题),让这个模式下的Activity单独在一个task栈中. * 这个栈只有一个Activity.导游应用和google地图应用发送的intent都由这个Activity接收和展示. * * 这里又有两个问题: * <p> * 如果是这种情况,多个task栈也可以看作一个应用.比如导游应用启动地图Activity, * 实际上是在导游应用task栈之上singleInstance模式创建的 * (如果还没有的话,如果有就是直接显示它)一个新栈,当这个栈里面的唯一Activity * ,地图Activity回退的时候,只是把这个栈移开了, * 这样就看到导游应用刚才的Activity了;多个应用(Task)共享一个Activity要求这些应用都没有退出 * ,比如刚才强调要用home键从导游应用切换到地图应用.因为,如果退出导游应用 * .而这时地图应用也并未运行的话,那个单独的地图Activity(task)也会退出了 * * 如果还是拿刚才的ActA和ActB的示例,可以把ActB的模式改为singleInstance,ActA为standard,进行一下测试 */ textView.setText("Activity id:" + this + "task Id:" + this.getTaskId()); Button button = new Button(this); button.setText("go ActB"); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(ActA.this, ActB.class); startActivity(intent); } }); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(textView); layout.addView(button); this.setContentView(layout); } } ActB.java文件:
public class ActB extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText("Activity id:" + this + "task Id:" + this.getTaskId()); Button button = new Button(this); button.setText("go actA"); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(ActB.this, ActA.class); startActivity(intent); } }); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(textView); layout.addView(button); this.setContentView(layout); } protected void onDestory(){ super.onDestroy(); System.out.println("____B ondestory_____"); } } AndroidMenifest.xml文件(配置启动模式):
<?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
三七粉贵吗多少钱一斤 三七粉多少钱一斤 万达有什么app 如何避免好学生成为心态受害者? 为什么好学生心态会害了自己呢? 好学生心态受害者是怎样一种存在? 好学生心态有什么影响? 好学生心态受害者是指什么意思? “好学生心态受害者”是指哪些人? 好学生心态受害者是指谁呢? 好学生心态受害者是指什么人? 如何在另外一个类里面获得某个activity的实例 android 如何获取手机当前的Activity实例 请教高人,能说下activity四种启动模式的应用场景吗 activity的启动模式有哪些 Activity具体是怎么创建的?又是怎么显示出来的 如何获取当前正在运行的Activity实例 Activity的启动模式有哪几种,分别用于什么 有LOL“第一美男”称号的欧城,现如今为何看着像50岁抠脚大汉? 网恋这回事,你怎么看? 女生发调皮]中有坏笑咋回复 八岁的甜馨遭网暴,长见识教育被扭曲,国民女儿到底得罪了谁? 女孩在微信说“亲”又发三个大笑表情符什么意思? 英雄联盟里总说的弟弟救我是什么梗? “邓超这两个表情我能笑十年”上了热搜,《创4》现场到底发生了什么? 产出儿什么意思 经常看见易烊千玺粉丝说产出儿 女生说先打钱后发个吃瓜表情什么意思? 吴倩这么漂亮怎么就红不了? 杨幂跟谁聊得这么嗨镜头前还抠脚?你觉得哪一个明星的睡姿吃相最放飞呢? 我是个男的,我今天和我女同桌聊天,她发了个抠鼻的表情,我说她是抠鼻大汉,她说我也是抠脚大汉,我我真 一个白色小人的表情猥琐夸张 抠脚 头发飞起来 用文字简述怎样实现开机启动应用程序中的某个activity Activity四种启动模式有哪些? android fragment和activity的区别 service怎么得到绑定的activity实例 安卓怎么在自定义控件中获取所在activity的实例 android的activity之间可以传递对象或者集合吗请写写例子 安卓开发,请给个由一个按钮触发另一个activity的简单例子让我学习学习! 如何获取当前运行的屏幕的activity的实例对象 android activity单实例化什么意思? 怎么保存activity实例,不用刷新 如何获取activity的实例对象。要获得实例对象。不是Activity名称。 流月小限是在流年小限位上起正月是逆轮还是顺轮? 八字如何断大运流年流月与命局作用关系的原则和分析技巧 流年流月流日什么意思 紫微斗数怎么定流月,流日的命宫? 请教,紫微命盘怎么看? 请高手解读一下 紫薇命盘。 谁能帮我解释一下这个紫薇命盘? 七杀庙天空养10 22 34 46 58 70 82贯索将军44 - 53 天煞事业流月大限小限丙辰 是什么意思 请问一下我的命盘怎么解啊?哪位高手帮我解一下