ZKX's LAB

activity 新的任务栈

2020-07-16知识11

请教关于结束activity任务栈的问题 1、MainActivity启动时创建一个静态的集合2、每次开启一个activity就向集合插入activity的引用3、清除的时候,只需遍历这个集合,将你不需要的activity finish掉就行了。package net.oschina.app;import java.util.Stack;import android.app.Activity;import android.app.ActivityManager;import android.content.Context;应用程序Activity管理类:用于Activity管理和应用程序退出author liux(http://my.oschina.net/liux)[url=home.php?mod=space&uid=85817]@version[/url]1.0created 2012-3-21public class AppManager {private static StackactivityStack;private static AppManager instance;private AppManager(){}单一实例public static AppManager getAppManager(){if(instance=null){instance=new AppManager();}return instance;}添加Activity到堆栈public void addActivity(Activity activity){if(activityStack=null){activityStack=new Stack();}activityStack.add(activity);}获取当前Activity(堆栈中最后一个压入的)public Activity currentActivity(){Activity activity=activityStack.lastElement();return 如何将standard模式启动的,同一个activity类生成的activity显示在栈顶 比如类 在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。Android总Activity的启动模式分为四种:Activity启动模式设置:Activity的四种启动模式:1.standard模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。2.singleTop如果在任务的栈顶正好存在该Activity的实例,就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。3.singleTask如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。4.singleInstance在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。其中standard是系统默认的启动模式。下面通过实例来演示standard的运行机制:如何查看Activity任务栈以及dumpsys 有两种实现方式:第一种:自己手动写一个程序,通过系统提供的函数来打印任务栈顶的Activity名称来判断是否是同一个Activity:如下:[java]view plaincopyListrunningTasks=mActivityManager.getRunningTasks(5);for(RunningTaskInfo runningTaskInfo:runningTasks){Log.v(\"taskInfo\",runningTaskInfo.topActivity.toString());}以下是列表页的任务栈顶信息:以下是详情页的任务栈顶信息:很明显,两个页面不是同一个Activity.第二种:通过adb shell dumpsys activity命令:如下:使用cmd启动adb shell:E:\\Android_Sdk\\android-sdks\\platform-tools>adb shellshell@NX601J:/$使用命令dumpsys activity>taskinfo.txt 命令 将打印出的结果输出到taskinfo.txt文件中,方便导出到电脑查看.1.首先在磁盘的根目录建立一个taskinfo.txt的文件:shell@NX601J:/storage/sdcard0$touch taskinfo.txt2.然后通过命令将结果输出到这个文件中:shell@NX601J:/storage/sdcard0$dumpsys activity>/storage/sdcard0/taskinfo.txt命令执行完成文件中就存入了各种任务信息(只截取了部分):这个文件中存储了非常丰富的信息:ACTIVITY MANAGER android a应用的activity启动b应用的activity为什么在同一个任务栈 在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。Android总Activity的启动模式分为四种:Activity启动模式设置:Activity的四种启动模式:1.standard模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。2.singleTop如果在任务的栈顶正好存在该Activity的实例,就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。3.singleTask如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。4.singleInstance在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。其中standard是系统默认的启动模式。下面通过实例来演示standard的运行机制:如何获取栈中的activity 实现获取任务栈必须添加权限:获取Activity任务栈 权限->12具体实现,获取栈以及其中内容:获取activity任务栈ActivityManager manager=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);ActivityManager.RunningTaskInfo info=manager.getRunningTasks(1).get(0);类名.ui.mobile.activity.WebsiteLoginActivity如何判断栈里是否存在一个activity 下面我们用代码进行判断:判断某一个类是否存在任务栈里面private boolean isExistMainActivity(Class?activity){Intent intent=new Intent(this,activity);ComponentName cmpName=intent.resolveActivity(getPackageManager());boolean flag=false;if(cmpName!null){/说明系统中存在这个activityActivityManager am=(ActivityManager)getSystemService(ACTIVITY_SERVICE);ListtaskInfoList=am.getRunningTasks(10);获取从栈顶开始往下查找的10个activityfor(RunningTaskInfo taskInfo:taskInfoList){if(taskInfo.baseActivity.equals(cmpName)){/说明它已经启动了flag=true;break;跳出循环,优化效率}}}return flag;}am.getRunningTasks(max);是取最多多少个activity,那么如果想取栈顶,代码是这样的:(am.getRunningTasks(1).get(0).topActivity).toString();在代码配置文件AndroidManifest.xml 加上权限“android.permission.GET_TASKS”/>Activity的启动模式有哪几种,分别用于什么 刚好最近又梳理了一下,结合我的实际使用场景回答一下=有四种启动模式,需要知道的是activity是交由activity栈(任务栈)管理的standard:会在启动时创建一个新实例入栈,请教关于结束activity任务栈的问题 总的步骤是抄:1.得到当前运行环境(context)的Activity管理袭器;2.通过Activity管理器得到当前百的任务栈信息;3.从任务栈中获度得栈顶的Activity的名称。知 具体读者可以参看下面的代码和Android帮助道文档。代码举例:String getTopActivity(Act.如何改变Activity在当前任务堆栈中的顺序 本示例演示如何通过设置Intent对象的标记,来改变当前任务堆栈中既存的Activity的顺序。1.Intent对象的Activity启动标记说明:FLAG_ACTIVITY_BROUGHT_TO_FRONT:应用程序代码中通常不设置这个标记,而是由系统给单任务启动模式的Activity的设置。FLAG_ACTIVITY_CLEAR_TASK:如果给Intent对象添加了这个标记,那么在Activity被启动之前,会导致跟这个Activity关联的任何既存的任务都被清除。也就是说新的Activity会成为一个空任务的根,而其他任何Activity都会被销毁。它紧跟FLAG_ACTIVITY_NEW_TASK联合使用。FLAG_ACTIVITY_CLEAR_TOP:如果给Intent对象设置这个标记,并且要启动的Activity在当前任务中已经运行了,那么不是创建一个这个Activity的新的实例,而是把堆栈中这个Activity之上的所有其他Activity都关掉,然后把新的Intent对象发送给这个既存的Activity(这时它在堆栈的顶部)。FLAG_ACTIVITY_CLEAR_WHEN_TASK_REST:如果给Intent对象设置了这个标记,那么在这个任务被复位时,在任务的Activity堆栈中这个标记点之后的Activity都应该被清除。FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:如果给Intent对象设置了这个标记,那么新的Activity不会被保留在最近启动的Activity安卓开发中,如何回到任务栈中任意一个创建好的activity呢 可以将activity的启动模式设置为singletask,这样就可以使用startActivity直接回到这个已经创建好的activity,但这个activity上面的activity会被弹出任务栈。

#android开发#堆栈#activity启动模式

随机阅读

qrcode
访问手机版