-
2013-03-13 11:06:32运行机制:是指在人类社会有规律的运动中,影响这种运动的各因素的结构、功能、及其相互关系,以及这些因素产生影响、发挥功能的作用过程和作用原理及其运 行方式。是引导和制约决策并与人、财、物相关的各项活动的基本准则及相应制度,是决定行为的内外因素及相互关系的总称。各种因素相互联系,相互作用,要保 证社会各项工作的目标和任务真正实现,必须建立一套协调、灵活、高效的运行机制。如市场运行机制、竞争运行机制、企业运行机制 。
管理体制:是指管理系统的结构和组成方式,即采用怎样的组织形式以及如何将这些组织形式结合成为一个合理的有机系统,并以怎样的手段、方法来实现管理的任 务和目的。具体地说:管理的体制是规定中央、地方、部门、企业在各自方面的管理范围、权限职责、利益及其相互关系的准则,它的核心是管理机构的设置。各管 理机构职权的分配以及各机构间的相互协调,它的强弱直接影响到管理的效率和效能,在中央、地方、部门、企业整个管理中起着决定性作用。
运行机制与管理体制的区别:
“运行机制”指的是有机体的构造、功能和相互关系,泛指一个工作系统的组织或部分之间相互作用的过程和方式,如:市场机制、竞争机制、用人机制等。
“管理体制”指的是国家机关、企业、事业单位等的组织制度,如:学校体制、领导体制、政治体制等。
两个词的中心语和使用范围不一样,“运行机制”由有机体喻指一般事物,重在事物内部各部分的机理即相互关系,“管理体制”指的是有关组织形式的制度,限于上下之间有层级关系的国家机关、企事业单位。
“体制决定机制,机制决定活力”。来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/238581/viewspace-755988/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/238581/viewspace-755988/
更多相关内容 -
学校权力运行机制建设实施方案.pdf
2021-10-20 07:50:51学校权力运行机制建设实施方案.pdf -
学校校企合作工学结合运行机制建设工作总结.doc
2021-12-01 15:56:40学校校企合作工学结合运行机制建设工作总结.doc -
学校校企合作工学结合运行机制建设工作总结.pdf
2021-11-22 08:50:54学校校企合作工学结合运行机制建设工作总结.pdf -
有效的学校传染病防治运行机制及监督管理对策研究.docx
2021-11-23 06:59:32有效的学校传染病防治运行机制及监督管理对策研究.docx -
学校校企合作工学结合运行机制建设工作计划总结.doc
2021-11-09 12:21:34学校校企合作工学结合运行机制建设工作计划总结.doc -
学校权力运行监控机制建设实施方案.pdf
2021-10-19 23:08:42学校权力运行监控机制建设实施方案.pdf -
学校权力运行监控机制建设实施计划方案.doc
2021-12-07 12:05:03学校权力运行监控机制建设实施计划方案.doc -
学校权力运行监控机制建设实施方案宣贯.pdf
2022-02-25 11:48:37学校权力运行监控机制建设实施方案宣贯.pdf -
精品资料(2021-2022年收藏)学校校企合作工学结合运行机制建设工作总结.doc
2021-10-11 00:21:47精品资料(2021-2022年收藏) -
高职高专学生英语素质拓展运行机制――以承德石油高等专科学校为例 (2013年)
2021-05-13 09:41:08从高职高专学生特点出发,探讨了英语素质拓展的概念、必要性和可行性,并以承德石油高等专科学校为例,对英语素质拓展运行的体制机制进行了系统化整体化研究和构建。 -
剑阁县学校权力运行与监督三同机制建设方案.doc
2021-11-24 06:46:51剑阁县学校权力运行与监督三同机制建设方案.doc -
教学信息反馈与运行机制探究 (2011年)
2021-05-19 10:29:56提高教学质量的一项重要措施就是建立切实有效的教学质量监控...而学校教学信息反馈与运行机制就是这一体系中的重要一环,需要信息员、教师、管理者三方面统一认识,加强信息反馈队伍建设,规范信息反馈程序,完善激励机制。 -
中国国际学校研究报告
2021-03-26 11:29:42广义来说,国际学校的运行要素有很多:师资情况、课程情况、升学情况、硬件设施、文化氛围……甚至具体到教师的薪 资水平,都会影响国际学校的发展。“教育”的生效机制目前尚不透明,诸多因素之间存在着千丝万缕的... -
关于高校工程研究中心建设与运行的思考
2020-06-25 20:56:31在此基础上,深入探讨了依托高等学校建设工程研究中心的运行模式、合作关系、资源整合、建设方向、团队建设、开放特征等关键问题,同时分析了学科建设对高校工程研究中心建设与运行的有利支撑作用,为高校工程研究中心... -
国家重点实验室运行管理改革初探——以重庆大学为例
2020-06-26 09:56:59为使重庆大学建设的国家重点实验室能够引领学科前沿,增强核心竞争力,从而更好地满足新兴学科快速发展和国家重大需求,学校进行了实验室体制机制改革的实践。针对重庆大学实际情况,从优化调整研究领域、凝练研究方向、... -
构建学校·家庭·社会三维一体式互动教育模式
2020-06-26 03:36:18知识经济时代的到来,对未来教育提出了高质、高效的要求,反思我国目前教育现状,各方教育资源没有充分整合,学校、家庭、社会无法形成有效地合作互动机制,教育互动模式有待创新。文章在此背景下,从围绕学生全面发展为... -
知识管理与学习型学校的构建 (2007年)
2021-05-31 20:20:32在学校中实施对知识的有效管理,整合教师的显性知识和隐性知识,促进知识的采集与加工、交流与共享、创新与增值,推进管理体制和运行机制的改革,建立学习型学校,必将能极大地促进学校的发展。 -
去行政化背景下高校内部治理价值链机制及效率评价指标体系研究
2020-04-29 15:05:44借鉴企业价值链模型,提出教育价值链概念,以此构建高校内部治理价值链机制模型。在此基础上,基于行政权力...内部治理价值链机制运行效率包括学生满意度、教师满意度、毕业生声誉、学校综合力以及社会影响力5个评价指标。 -
基于网络的高校学术创新团队开放式管理机制探析 (2006年)
2021-06-01 07:30:04以高校创新团队的建设与管理入手,组建高层次人才门户网站,通过虚拟中心实现对创新团队的管理与监督,探索适应新时期高层次人才培养的运行机制和评价体系,使高校创新团队在师资队伍和学科建设中真正发挥作用,为学校的... -
高校工程(研究)中心建设发展现状研究
2020-06-25 22:28:55工程(研究)中心是我国国家创新体系建设中的一个重要环节,加强...高等学校的工程(研究)中心建设,作为"工程中心"建设计划的重要组成部分,其建设和运行水平将直接影响到国家创新能力建设的效果,有着非常重要的现实意义。 -
学校.net的课程,从入门到精通,,,
2018-11-21 18:06:22ASP.NET是基于公共语言运行库的程序体系结构,因此整个系统框架可以用于任何ASP.NET应用程序。ASP.net的执行效率已经大大提高,并且它强大且适应性强,因为ASP.NET是一种通用的操作方法。所以它的规模可以适应几乎... -
Java 反射机制详解
2017-04-01 20:35:41为什么要写这一系列的博客呢?因为在 Android 开发的过程中, 泛型,反射,注解这些知识进场会用到,几乎所有的框架至少都会...java Type 详解java 反射机制详解注解使用入门(一)反射机制什么是反射机制简单来说,本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布
为什么要写这一系列的博客呢?
因为在 Android 开发的过程中, 泛型,反射,注解这些知识进场会用到,几乎所有的框架至少都会用到上面的一两种知识,如 Gson 就用到泛型,反射,注解,Retrofit 也用到泛型,反射,注解 。学好这些知识对我们进阶非常重要,尤其是阅读开源框架源码或者自己开发开源框架。
反射机制
什么是反射机制
简单来说,反射可以帮助我们在动态运行的时候,对于任意一个类,可以获得其所有的方法(包括 public protected private 默认状态的),所有的变量 (包括 public protected private 默认状态的)。是不是很强大呢。
反射机制有什么作用呢?
- 获取某些类的一些变量,调用某些类的私有方法。(例如在Android开发中我们可以用来开启 WiFi 热点,调用 WifiManager 中的 setWifiApEnabled() 方法 )
- 增加代码的灵活性。很多主流框架都使用了反射技术.像ssh框架都采用两种技术 xml做配置文件+反射技术.
假如有这样一个类 Person,它拥有多个成员变量,country,city,name,province,height,age 等,同时它拥有多个 构造方法,多个方法,这些变量,方法的访问权限既有 public 也有 private 的。下面我们以这个为例子,一起看怎样使用反射获得相应的 Filed,Constructor,Method。
/** * 博客地址:http://blog.csdn.net/gdutxiaoxu * @author xujun * @time 2017/3/29 22:19. */ public class Person { public String country; public String city; private String name; private String province; private Integer height; private Integer age; public Person() { System.out.println("调用Person的无参构造方法"); } private Person(String country, String city, String name) { this.country = country; this.city = city; this.name = name; } public Person(String country, Integer age) { this.country = country; this.age = age; } private String getMobile(String number) { String mobile = "010-110" + "-" + number; return mobile; } private void setCountry(String country) { this.country=country; } public void getGenericHelper(HashMap<String, Integer> hashMap) { } public Class getGenericType() { try { HashMap<String, Integer> hashMap = new HashMap<String, Integer>(); Method method = getClass().getDeclaredMethod("getGenericHelper",HashMap.class); Type[] genericParameterTypes = method.getGenericParameterTypes(); if (null == genericParameterTypes || genericParameterTypes.length < 1) { return null; } ParameterizedType parameterizedType=(ParameterizedType)genericParameterTypes[0]; Type rawType = parameterizedType.getRawType(); System.out.println("----> rawType=" + rawType); Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); if (actualTypeArguments==genericParameterTypes || actualTypeArguments.length<1) { return null; } for (int i = 0; i < actualTypeArguments.length; i++) { Type type = actualTypeArguments[i]; System.out.println("----> type=" + type); } } catch (Exception e) { } return null; } @Override public String toString() { return "Person{" + "country='" + country + '\'' + ", city='" + city + '\'' + ", name='" + name + '\'' + ", province='" + province + '\'' + ", height=" + height + '}'; } }
使用反射获得所有构造方法(包括私有的,非私有的)
默认权限的指的是没有修饰符修饰的
几个重要的方法讲解
方法 描述 public Constructor getConstructor(Class<?>… parameterTypes) 获得指定的构造方法,注意只能获得 public 权限的构造方法,其他访问权限的获取不到 public Constructor getDeclaredConstructor(Class<?>… parameterTypes) 获得指定的构造方法,注意可以获取到任何访问权限的构造方法。 public Constructor<?>[] getConstructors() throws SecurityException 获得所有 public 访问权限的构造方法 public Constructor<?>[] getDeclaredConstructors() throws SecurityException 获得所有的构造方法,包括(public, private,protected,默认权限的) 看了上面的几个方法,其实很好区分
- 后缀带 s 的返回对象时数组类型,是可以获得相应权限的所有方法的,如 Constructor getConstructor() 方法 和 Constructor<?>[] getConstructors() 方法。几乎可以这样说,java 99% 的代码风格是这样的。 同时这里也引申出一个问题,平时你在开发中有没有遵循一定的开发规范。
- getConstructor() 方法和 getDeclaredConstructor 中间只相差一个单词 Declared ,区别在与是获得 public 权限的方法还是所有权限的方法。
这里为什么要强调这一点呢?因为以下要讲解的 getMethod(), getMethods(),getDeclaredMethod(),getDelcaredMethods() 等方法与这个类似,下面不再阐述。
获得所有的构造方法
public static void printConstructor(String className) { try { Class<?> aClass = Class.forName(className); Constructor<?>[] constructors = aClass.getConstructors(); print(constructors); Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors(); print(declaredConstructors); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
print: private com.example.reflectdemo.Person(java.lang.String,java.lang.String,java.lang.String)
print: public com.example.reflectdemo.Person()
print:public com.example.reflectdemo.Person(java.lang.String,java.lang.Integer)
print:public com.example.reflectdemo.Person(java.lang.String,java.lang.Integer)
对比 Person 里面所有的构造方法,可以知道我们代码的逻辑是正确的
获得指定的构造方法
public static Constructor getConstructor(String className, Class<?>... clzs) { try { Class<?> aClass = Class.forName(className); Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(clzs); print(declaredConstructor); // if Constructor is not public,you should call this declaredConstructor.setAccessible(true); return declaredConstructor; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return null; } public class TestHelper { public static final String TAG="xujun"; public static final String CLASS_NAME = "com.example.reflectdemo.Person"; public static final String CHINA = "China"; public static void testConstructor(){ ReflectHelper.printConstructor(CLASS_NAME); Constructor constructor = ReflectHelper.getConstructor(CLASS_NAME, String.class, Integer.class); try { Object meinv = constructor.newInstance(CHINA, 12); Person person = (Person) meinv; Log.i(TAG, "testConstructor: =" + person.toString()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
我们将可以看到以下的输出结果
testConstructor: =Person [country=China, city=null, name=null, province=null, height=null, age=12]
可以看到 country=China,age=12 这说明我们成功通过反射调用 Person 带两个参数的沟改造方法。
注意事项
如果该方法,或者该变量不是 public 访问权限的,我们应该调用相应的 setAccessible(true) 方法,才能访问得到
//if Constructor is not public,you should call this declaredConstructor.setAccessible(true);
使用反射获得所有的 Field 变量
获得所有的 Field 变量
public static void printField(String className) { try { Class<?> aClass = Class.forName(className); Field[] fields = aClass.getFields(); PrintUtils.print(fields); Field[] declaredFields = aClass.getDeclaredFields(); PrintUtils.print(declaredFields); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
获得指定的成员变量
现在假如我们要获得 Person 中的私有变量 age ,我们可以通过以下的代码获得,同时并打印出所有的成员变量。
public static Field getFiled(String className, String filedName) { Object o = null; try { Class<?> aClass = Class.forName(className); Field declaredField = aClass.getDeclaredField(filedName); // if not public,you should call this declaredField.setAccessible(true); return declaredField; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } return null; } public static void testFiled(){ ReflectHelper.printFileds(CLASS_NAME); Person person = new Person(CHINA, 12); Field field = ReflectHelper.getFiled(CLASS_NAME, "age"); try { Integer integer = (Integer) field.get(person); PrintUtils.print("integer="+integer); } catch (IllegalAccessException e) { e.printStackTrace(); } }
我们可以看到以下的输出结果
print: public java.lang.String com.example.reflectdemo.Person.country
print: public java.lang.String com.example.reflectdemo.Person.city
print: public java.lang.String com.example.reflectdemo.Person.country
print: public java.lang.String com.example.reflectdemo.Person.city
print: private java.lang.String com.example.reflectdemo.Person.name
print: private java.lang.String com.example.reflectdemo.Person.province
print: private java.lang.Integer com.example.reflectdemo.Person.height
print: private java.lang.Integer com.example.reflectdemo.Person.age
print:integer=12
使用反射执行相应的 Method
主要有以下几个方法,
- public Method[] getDeclaredMethods()
- public Method[] getMethods() throws SecurityException
- public Method getDeclaredMethod()
- public Method getMethod(String name, Class<?>… parameterTypes)
几个方法的作用我就不一一阐述了,因为上面在讲解 使用反射获得所有构造方法(包括私有的,非私有的) 的时候已经提到过了。
获取所有的 Method
public static void printMethods(String className) { try { Class<?> aClass = Class.forName(className); Method[] declaredMethods = aClass.getDeclaredMethods(); PrintUtils.print(declaredMethods); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
print: public java.lang.String com.example.reflectdemo.Person.toString()
print: public java.lang.Class com.example.reflectdemo.Person.getGenericType()
print: private void com.example.reflectdemo.Person.setCountry(java.lang.String)
print: public void com.example.reflectdemo.Person.getGenericHelper(java.util.HashMap)
print: private java.lang.String com.example.reflectdemo.Person.getMobile(java.lang.String)
对比 Person 里面的所有方法,毫无疑问我们的代码逻辑是正确的。
获取指定的 Method
我们可以使用 getDeclaredMethod(String name, Class<?>... parameterTypes) 或者 getMethod(String name, Class<?>… parameterTypes) 获得指定的方法,只不过 getMethod 方法只能获得 public 访问权限的方法,getDeclaredMethod 可以获得任何访问权限的方法。
注意一下方法参数, name 代表的是方法的名称,Class<?>… parameterTypes 代表的是方法参数的类型,至于为什么是 … 数组类型的,因为我们参数可能是一个也可能是多个的。
这里我们以 Person 类 里面的 private void setCountry(String country) 方法为例子讲解,可以看到方法名称为 setCountry ,方法参数的类型为 String ,所以我们在传递参数的时候 name 为 setCountry ,parameterTypes 为 String.class 。如果有多个参数,在加上该参数的 Class 类型即可。
public static void testMethod(){ ReflectHelper.printMethods(CLASS_NAME); Person person=new Person(); Method method = ReflectHelper.getMethod(CLASS_NAME, "setCountry", String.class); try { // 执行方法,结果保存在 person 中 Object o = method.invoke(person, CHINA); // 拿到我们传递进取的参数 country 的值 China String country=person.country; PrintUtils.print(country); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } public class ReflectHelper { private static final String TAG = "ReflectHelper"; public static Method getMethod(String className, String methodName, Class<?>... clzs) { try { Class<?> aClass = Class.forName(className); Method declaredMethod = aClass.getDeclaredMethod(methodName, clzs); declaredMethod.setAccessible(true); return declaredMethod; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return null; } }
执行上面的函数,将可以看到下面的结果
print:China
即我们成功利用反射调用 Person 的 setCountry 方法,并将值成功改变。
使用反射操作数组
/** * 利用反射操作数组 * 1 利用反射修改数组中的元素 * 2 利用反射获取数组中的每个元素 */ public static void testArrayClass() { String[] strArray = new String[]{"5","7","暑期","美女","女生","女神"}; Array.set(strArray,0,"帅哥"); Class clazz = strArray.getClass(); if (clazz.isArray()) { int length = Array.getLength(strArray); for (int i = 0; i < length; i++) { Object object = Array.get(strArray, i); String className=object.getClass().getName(); System.out.println("----> object=" + object+",className="+className); } } }
----> object=帅哥,className=java.lang.String
----> object=7,className=java.lang.String
----> object=暑期,className=java.lang.String
----> object=美女,className=java.lang.String
----> object=女生,className=java.lang.String
----> object=女神,className=java.lang.String
从结果可以说明,我们成功通过 Array.set(strArray,0,“帅哥”) 改变数组的值。
使用反射获得泛型类型
public static void getGenericHelper(HashMap<String, Person> map) { }
现在假设我们有这样一个方法,那我们要怎样获得 HashMap 里面的 String,Person 的类型呢?
对于 Java Type还不熟悉的可以先读这一篇博客 java Type 详解
public static void getGenericType() { try { Method method =TestHelper.class.getDeclaredMethod("getGenericHelper",HashMap.class); Type[] genericParameterTypes = method.getGenericParameterTypes(); // 检验是否为空 if (null == genericParameterTypes || genericParameterTypes.length < 1) { return ; } // 取 getGenericHelper 方法的第一个参数 ParameterizedType parameterizedType=(ParameterizedType)genericParameterTypes[0]; Type rawType = parameterizedType.getRawType(); System.out.println("----> rawType=" + rawType); Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); if (actualTypeArguments==genericParameterTypes || actualTypeArguments.length<1) { return ; } // 打印出每一个类型 for (int i = 0; i < actualTypeArguments.length; i++) { Type type = actualTypeArguments[i]; System.out.println("----> type=" + type); } } catch (Exception e) { } }
执行上面的代码,输出结果
----> rawType=class java.util.HashMap
----> type=class java.lang.String
----> type=class com.example.reflectdemo.Person
怎样获得 Metho,Field,Constructor 的访问权限 ( public,private,ptotected 等)
其实很简单,我们阅读文档可以发现他们都有 getModifiers() 方法,该方法放回 int 数字, 我们在利用 Modifier.toString() 就可以得到他们的访问权限
int modifiers = method.getModifiers(); Modifier.toString(modifiers);
好了,今天就写这么多了,明天准备回一下家,接着回一下学校。下一篇准备写 关于怎样编写自定义注解(基于编译时期的),敬且期待。
推荐阅读
Android 面试必备 - http 与 https 协议
Android 面试必备 - 计算机网络基本知识(TCP,UDP,Http,https)
扫一扫,欢迎关注我的微信公众号 stormjun94, 目前专注于 Android 开发,主要分享 Android开发相关知识和技术人成长历程,包括个人总结,职场经验,面试经验等。
-
课余体育训练可持续发展的研究——以浙江科技学院为例 (2007年)
2021-06-13 02:55:06以竞赛体制改革为突破口,完善课余训练运行机制;处理好学生运动员文化学习与运动训练的关系;拓宽筹集学校课余体育训练和竞赛经费的来源渠道;学校体育场地设施和器材的投入和建设应适度超前。 -
如何提升优势特色学科竞争力 (2012年)
2021-04-22 20:10:54应以国家发展战略需求为导向,以学科平台建设为载体,以服务社会、科技成果转化强化在行业的领先地位,以科技创新团队为支撑,构建优势特色学科竞争优势路径,逐渐形成开放、流动、竞争、协作的运行机制,... -
Activity调度机制
2011-09-29 17:06:44Activity调度机制 10.1 Activity调度机制 在Android中,Activity调度的基本思路是这样的:各应用进程要启动新的Activity或者停止当前的Activity,都要首先报告给AmS,而不能“擅自处理”。AmS在内部为所有应用...Activity调度机制
10.1 Activity调度机制
在Android中,Activity调度的基本思路是这样的:各应用进程要启动新的Activity或者停止当前的Activity,都要首先报告给AmS,而不能“擅自处理”。AmS在内部为所有应用进程都做了记录,当AmS接到启动或停止的报告时,首先更新内部记录,然后再通知相应客户进程运行或者停止指定的Activity。由于AmS内部有所有Activity的记录,也就理所当然地能够调度这些Activity,并根据Activity和系统内存的状态自动杀死后台的Activity。
具体来讲,启动一个Activity有以下几种方式。
— 在应用程序中调用startActivity()启动指定的Activity。
— 在Home程序中单击一个应用图标,启动新的Activity。
— 按“Back”键,结束当前Activity,自动启动上一个Activity。
— 长按“Home”键,显示出当前任务列表,从中选择一个启动。
这四种启动方式的主体处理流程都会按照第一种启动方式运行,后面三种方式只是在前端消息处理上各有不同,因此,后面首先介绍第一种启动方式,然后介绍其他启动方式的前端处理差异。
10.1.1 几个重要概念
AmS中定义了几个重要的数据类,分别用来保存进程(Process)、活动(Activity)和任务(Task)。
1.进程数据类ProcessRecord
该类在framework/base/services/java/com/android/server/am/路径下,该路径最后的am代表Activity Manager,和AmS有关的重要类都在该目录下。
一个APK文件运行时会对应一个进程,当然,多个APK文件也可以运行在同一个进程中。ProcessRecord正是记录一个进程中的相关信息,该类中内部变量可分为三个部分,大家先不用琢磨具体某个变量如何被使用,而只需要先了解它们的作用。这三个部分如表10-1所示。
2.HistoryRecord数据类
AmS中使用HistoryRecord数据类来保存每个Activity的信息,有些读者可能奇怪,Activity本身也是一个类啊,为什么还要用HistoryRecord来保存Activity的信息,而不直接使用Activity呢?因为,Activity是具体的功能类,这就好比每一个读者都是一个Activity,而“学校”要为每一个读者建立一个档案,这些档案中并不包含每个读者具体的学习能力,而只是学生的籍贯信息、姓名、出生年月、家庭关系等。HistoryRecord正是AmS为每一个Activity建立的档案,该数据类中的变量主要包含两部分,如表10-2所示。
需要注意,HistoryRecord类也是一个Binder,它基于IApplicationToken.Stub类,因此,可以被IPC调用,一般是在WmS中进行该对象的IPC调用。
3.TaskRecord类
AmS中使用任务的概念确保Activity启动和退出的顺序。比如以下启动流程,A、B、C分别代表三个应用程序,数字1、2、3分别代表该应用中的Activity。
A1→A2→A3→B1→B2→C1→C2,此时应该处于C2,如果AmS中没有任务的概念,此时又要从C2启动B1,那么会存在以下两个问题:
— 虽然程序上是要启动B1,但是用户可能期望启动B2,因为B1和B2是两个关联的Activity,并且B2已经运行于B1之后。如何提供给程序员一种选择,虽然指定启动B1,但如果B2已经运行,那么就启动B2。
— 假设已经成功从C2跳转到B2,此时如果用户按“Back”键,是应该回到B1呢,还是应该回到C2?
任务概念的引入正是为了解决以上两个问题,HistoryRecord中包含一个int task变量,保存该Activity所属哪个任务,程序员可以使用Intent.FLAG_NEW_TASK标识告诉AmS为启动的Activity重新创建一个Task。
有了Task的概念后,以上情况将会是这样的:
虽然程序明确指定从C2启动到B1,程序员可以在intent的FLAG中添加NEW_TASK标识,从而使得AmS会判断B1是否已经在mHistory中。如果在,则找到B1所在的Task,并从该Task中的最上面的Activity处运行,此处也就是B2。当然,如果程序的确要启动B1,那么就不要使用NEW_TASk标识,使用的话,mHistory中会有两个B1记录,隶属于不同的Task。
TaskRecord类中的变量如表10-3所示。
需要注意的是,TaskRecord中并没有该任务中所包含的Activity列表,比如ArrayList<HistoryRecord>或者HistoryRecord[]之类的变量,这意味着不能直接通过任务id找到其所包含的Activity。要达到这个目的,可以遍历AmS中mHistory中的全部HistroyRecord,然后根据每一个HistoryRecord中的TaskRecord task变量确定是否属于指定的任务。
本文选自《Android内核剖析 》一书
图书详细信息:http://blog.csdn.net/broadview2006/article/details/6804573