Activity和任务
就像前面提到的,一个activity可以启动另一个,包括那些定义在不同应用程序中的。假设,例如,你想让用户显示一些地方的街道地图。已经有一个activity可以做这个事,所以你的activity所要做的就是将行为对象和需要的信息放在一起,并将它们传递给startActivity()。地图查看器将显示这个地图。当用户按下后退按钮时,你的activity又重新显示在屏幕上了。
对用户来说,这个地图查看器看起来就像是你的应用程序的一部分,即使它定义在另外的应用程序中并运行在那个程序的进程中。Android通过保持所有的activity在同一个任务中来保持用户体验。简单的的说,任务就是用户所体验到的“应用程序”。它是一组相关的activity,分配到一个栈中。栈中的根activity,是任务的开始——一般来说,它是用户组应用程序加载器中选择的activity。在栈顶的activity正是当前正在运行的——集中处理用户动作的那个。当一个activity启动了另外一个,这个新的activity将压入栈中,它将成为正在运行中的activity。前一个activity保留在栈中。当用户按下后退按键,当前的这个activity将中栈中弹出,而前面的那个activity恢复成运行中状态。
栈包含了对象,如果一个栈有多于一个相同的Activity的子类的实例打开——比如,多个地图查看器——这个栈分别拥有每个实例的入口。栈中的activity不能重新排列,只能压入和弹出。
任务是一些activity组成的栈,不是清单文件中的类或元素。所以没有办法在独立于它包含的activity的条件下,设置它的值。任务的值作为一个整体设置在根activity中。例如,下一节将讨论“任务的亲和性”;这个值是从根activity亲和性中读取出来的。
一个任务中的所有activity一起作为一个单元。整个任务(整个activity栈)可以移动到前台或者后台.假设,例如,当前的任务有四个activity在栈中——三个在当前的activity之下。用户按下了HOME 键,进入了应用程序加载器,选择了一个新的程序(实际上,是一个新的任务)。当前的任务进入了后台,新任务的根activity显示出来。然后,过了一会,用户退回到主界面,又重新选择了前一个应用程序(前一个任务),栈中有四个activity的那个任务,现在出现在了前台。当用户按下BACK按键,屏幕就不会再显示用户刚刚离开的那个activity,而是删除栈顶的activity,同任务中的前一个activity 将被显示出来。
刚才说明的那些行为,是activity和任务的默认行为。但是有也办法修改它的所有方面。activity 和任务的关联,activity在任务中的行为,受控于启动activity的行为对象的标志位和清单文件中的
在这里,主要的行为标志为是:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP
主要的
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
下面一节将说明这些标志和属性都有什么用,他们之间怎么互相影响,应该用什么样的方案来控制它们的使用。
亲和性和新任务
默认情况下,应用程序中的所有activity,都有一个对于其它activity的亲和性—这是一个对于同一个任务中的其他activity的优先权,然后,通过
FLAG_ACTIVITY_NEW_TASK标志
正如前面描述的,一个新的activity,默认情况下,被加载进调用startActivity()方法的activity 对象所在的那个任务中。它被压入和调用者所在的同一个栈中,但是,如果行为对象在调用startActivity()方法时传递了FLAG_ACTIVITY_NEW_TASK标记,系统将用一个不同的任务来容纳这个新的activity。通常,就像这个标记的名字所代表的。它是一个新任务,但是,它不必非要这样。如果已经存在一个和这个activity亲和性相同的任务,这个activity就会载入到那个任务中,如果不是的话,才会启动新任务。
如果activity的allowTaskReparenting 属性设置为“true”,它就能从他启动时所在的任务移动到另一个出现在前台的任务。例如,假设有一个activity可以根据选择的城市包括天气情况,它作为一个旅行应用程序的一部分。它和同一个应用程序中的其他activity有同样的亲和性(默认的亲和性)并且允许重组。你的一个activity开启了天气报告器,所以它属于同一个任务中的这个activity,然而,当旅行应用程序开始运行时,天气报告器将被重新分配并显示到那个任务中。
启动模式
有4中不同的启动模式可以分配给
"standard" (默认的模式)
"singleTop"
"singleTask"
"singleInstance"
这些模式主要区别在以下四点:
?哪个任务存放着activity,用来对行为进行响应。对“standard”和“singleTop”模式来说,这个任务是产生行为(并且调用startActivity())的那个——除非行为对象包含
述的一样,将会选择一个不同的任务。
?它们是否可以有多个实例。"standard"和“singleTop”类型的activity可以被实例化多次。它们可以属于多个任务,一个特定的任务也可以拥有同一个activity的多个实例。
作为比较"singleTask"和"singleInstance"类型的activity只限定有一个实例。因为这些activity是任务的根。这个限制意味着,在设备上不能同时有超过一个任务的实例。
?是否能有其他的activity在它所在的任务中。"singleInstance"类型的activity是它所在任务中唯一的activity。如果它启动了其他的activity,不管那个activity的启动模式如何,它都会加载到一个不同的任务中——好像行为对象中的FLAG_ACTIVITY_NEW_TASK标记。在其他的方面,"singleInstance"和"singleTask"模式是相同的。
其他三种模式运行任务中有多个activity。"singleTask"总是任务中的根activity,但是它可以启动其他的activity并分配到它所在的任务中。"standard"和"singleTop"类型的activity可以出现在任务中的任何地方。
?是否启动一个新的实例来处理一个新的行为。对默认的"standard"模式来说,对于每一个行为都会创建一个新的实例来响应。每个实例只处理一个行为。对于"singleTop"模式,如果一个已经存在的实例位于目标任务activity栈的栈顶,那么他将被重用来处理这个行为。如果它不在栈顶,它将不会被重用,而是为行为创建一个新的实例,并压入栈中。
例如,假设,一个任务的activity栈由根activity A和B,C,D从上到下按这样的顺序组成,所以这个栈就是A-B-C-D。一个行为指向类型为D的activity。如果D是默认的"standard"加载模式,一个新的实例会被启动,栈现在就是这样A-B-C-D-D。但是,如果D的加载模式是"singleTop",已经存在的实例会用来处理这个行为(因为它在栈的顶端)并且栈中还应该是A-B-C-D。
在前面提到,"singleTask"和"singleInstance"类型的activity最多只有一个实例,所以他们的实例应该会处理每个新的行为。"singleInstance"类型的activity总是在栈的顶端(因为他是任务中唯一的一个activity),所以总是能够适当的处理行为。然而,"singleTask"类型的activity也许会有其他的activity在它的上面。如果是这样的话,那就不能处理这个行为,这个行为被丢弃。(即使这个行为被丢弃了,它的到来也会导致那些应该保留不变任务显示到前台来)。
当一个activity被要求处理一个新的行为时,行为对象会通过调用activity的onNewIntent()方法传递进来(最初启动activity的行为可以通过调用getIntent()方法获得)。
注意,当创建一个新的activity实例来处理一个新的行为时,用户总是能够通过按下BACK按键退回到前面的状态(前一个activity)。但是当一个已经存在的activity实例处理一个新的行为时,用户
不能通过按下BACK按键退回到前面的状态。
更多关于加载模式的内容,请看关于
清理栈
如果用户离开一个任务很长时间。系统将清除除了根activity之外的所有activity。当用户重新回到任务中时,像是用户离开了它,除了只有最初的activity还在。这个理念是这样的,过了一段时间,用户很可能放弃之前所做的事情,回到任务去做一些新的事情。
这只是默认情况,有一些activity的属性可以控制和修改它。
alwaysRetainTaskState属性
如果一个任务的根activity的这个属性设置成了"true",那么刚才提到的那些默认行为就不会发生。这个任务保留所有的activity,甚至经过了很长一段时间。
clearTaskOnLaunch属性
如果任务的根activity的这个属性设置成了”true“,那么只要用户离开了任务并返回,就会清除
除了根activity之外的所有activity。换句话说,它和alwaysRetainTaskState正好相反,当用户返回到任务时,总是恢复到最初的状态,不管离开了多长时间。
finishOnTaskLaunch属性
这个属性和clearTaskOnLaunch类似,但是它作用于单个activity,而不是整个任务。它可以导致任何的activity离开,包括根activity。当它设置成"true"的时候,作为任务一部分的activity只对当前会话有效。如果用户离开然后返回到任务中。它将不再出现。
还有其他的方法强制将activity从栈中移除。如果一个行为对象包含
了FLAG_ACTIVITY_CLEAR_TOP标志,它的目标任务中已经有了一个这样类型的activity实例,
所有栈中位于这个实例之上的activity都会被清除,所以这个实例就会出现在栈顶并且对行为进行响应。如果activity被设计成"standard"模式,它也将会从栈中被清除,并且会启动新的实例来处理到来的行为。这是因为当设置成”standard“模式后,对每个新的行为都会创建一个新的实例。
FLAG_ACTIVITY_CLEAR_TOP经常和FLAG_ACTIVITY_NEW_TASK一起使用。当一起使用时,这些标志是定位一个在另一个任务中存在的activity并且将它放在一个可以响应行为的地方的一种方法。
启动任务
Activity通过将行为过滤器”android.intent.action.MAIN“设置为指定动作和
"https://www.doczj.com/doc/de11948760.html,UNCHER"作为指定类型,来成为任务的入口。(前面关于行为过滤器那一些讨论的例子)。这种类型的过滤器会让activity的图标和标签显示在应用程序加载器上面,可以让用户启动和返回activity。
第二个能力更为重要,用户应该可以在离开一个任务一段时间后返回。因为这样,能够初始化任务的"singleTask"和"singleInstance"模式,只能够用在那些拥有MAIN 和LAUNCHER 过滤器的activity中。想像一下如果没有这两个过滤器会发生什么:一个行为启动了"singleTask"模式的activity,启动了一个新的任务并且用户花了一些时间在这个任务上。然后用户按下了HOME键,这个任务被隐藏到了后台。因为没有在应用程序加载器上显示它,所以就没有办法返回到这个任务。
一个类似的麻烦事FLAG_ACTIVITY_NEW_TASK 标志。如果这个标志导致activity启动了一个新任务,并且用户按下HOME键离开了它,必须有一些方法将用户引导回它。一些实体(像是通知管理器)总是在一个外部的任务中启动activity,而不作为它们的一部分,所以他们总是将带有
FLAG_ACTIVITY_NEW_TASK 标记的行为对象传递到startActivity()。如果你有一个可以被外部实体使用这个标签调用的activity,要注意用户应该有办法返回到启动的任务。
对于那些你不想让用户返回到activity的情况,将
为”true“,参看前面的清理栈一节。
一,系统引导bootloader 加电,cpu执行bootloader程序,正常启动系统,加载boot.img【其中包含内核。还有ramdisk】 二,内核kernel bootloader加载kernel,kernel自解压,初始化,载入built-in驱动程序,完成启动。 内核启动后会创建若干内核线程,在后装入并执行程序/sbin/init/,载入init process,切换至用户空间(user-space) 内核zImage解压缩 head.S【这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包裹器。其作用就是解压Linux内核,并将PC指针跳到内核(vmlinux)的第一条指令】首先初始化自解压相关环境(内存等),调用decompress_kernel进行解压,解压后调用start_kernel启动内核【start_kernel是任何版本linux内核的通用初始化函数,它会初始化很多东西,输出linux版本信息,设置体系结构相关的环境,页表结构初始化,设置系 统自陷入口,初始化系统IRQ,初始化核心调度器等等】,最后调用rest_init【rest_init 会调用kernel_init启动init进程(缺省是/init)。然后执行schedule开始任务调度。这个init是由android的./system/core/init下的代码编译出来的,由此进入了android的代码】。 三,Init进程启动 【init是kernel启动的第一个进程,init启动以后,整个android系统就起来了】 init进程启动后,根据init.rc 和init.
Android开发技术讲义之启动另一个 Activity 紧接着上一个练习,我们为上一个练习app添加一些代码,使之当我们点击send 按钮的时候能够启动另一个Activity。 任务 在文本框中输入消息,点击Send按钮,消息会显示在第二个Activity中。 对发送按钮进行响应 1.在res/layout目录中,编辑activity_my.xml 2.在
该属性的属性值"sendMessage",是当点击按钮的时候系统调用的方法名 3.在java/com.mycompanu.myfirstapp目录中,打开MyActivity.java文件 4.在MyActivity类中,添加sendMessage()方法 java/com.mycompany.myfirstapp/MyActivity.java 为了匹配android:onClick属性值,该方法必须满足: ●是public ●返回值为void ●有且仅有一个View作为参数 创建一个Intent 1.在MyActivity.java中的sendMessage()方法中,创建一个Intent启动一个名 为DisplayMessageActivity的Activity java/com.mycompany.myfirstapp/MyActivity.java 注意:此时对DisplayMessageActivity的调用会显示出错,我们这时可以先忽略错误 这里,Intent构造方法用到了两个参数: ●Context作为第一个参数(这里是this,因为Activity是Context的子类) ●第二个参数为系统发送Intent的目标,为某应用组件的Class 2.在本文件的前面,引入Intent类: java/com.mycompany.myfirstapp/MyActivity.java
每个Androi d应用启动之后都会出现一个Spl ash启动界面,显示产品的LOGO、公司的LOGO或者开发者信息。如果应用程序启动时间比较长,那么启动界面就是一个很好的东西,可以让用户耐心等待这段枯燥的时间。 1.制作Splash界面 突出产品LOGO,产品名称,产品主要特色; 注明产品的版本信息; 注明公司信息或者开发者信息; 背景图片,亦可以用背景颜色代替; 2.处理后台资源 大多数的Splash界面都是会等待一定时间,然后切换到下一个界面; 其实,在这段时间里,可以对系统状况进行检测,比如网络是否通,电源是否充足; 或者,预先加载相关数据; 为了能让启动界面展现时间固定,需要计算执行以上预处理任务所花费的时间,那么:启动界面SLEEP的时间=固定时间-预处理任务时间; 思路有两个,一个是用两个Activity来做,一个用来做启动画面,另一个是主页面;还可以用一个Activity来做,程序启动时显现启动画面,当启动完成后,它会被隐藏来。 方法一:两个Activity,通过线程延迟指定的时间再执行Activity的跳转,我们需要建立两个Activity,一个是SplashActivity,用来做启动画面。另一个是HelloWo rldActivity。在这里只是说明如何来做启动画面,所以就不详细来完成Activity了。 核心代码: package com.demo.app; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; public class SplashActivity extends Activity { private final int SPLASH_DISPLAY_LENGHT = 6000; // 延迟六秒 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/de11948760.html,yout.splash); new Handler().postDelayed(new Runnable() { public void run() { Intent mainIntent = new Intent(SplashActivity.this, HelloWorldActivity.class); SplashActivity.this.startActivity(mainIntent); SplashActivity.this.finish(); } }, SPLASH_DISPLAY_LENGHT); }
activiti流程开发指南 ?一、BPMN ?二、activiti主要接口 ?三、如何实现一个业务流程 ?四、如何管理所有流程与实例 ?五、开发流程 ?六、api 一、BPMN 1. 什么是BPMN 首先BPMN规范是由标准组织BPMI发布的.BPMN 1.0规范发布于2004年5月。此规范展示了BPMI组织两年多的努力成果。BPMN的主要目标就是要提供被所有业务用户理解的一套标记语言,包括业务分析者、软件开发者以及业务管理者与监察者。BPMN还将支持生成可执行的 BPEL4WS语言。所以,BPMN在业务流程设计与流程实现之间搭建了一条标准化的桥梁。 BPMN定义了业务流程图,其基于流程图技术,同时为创建业务流程操作的图形化模型进行了裁减。业务流程的模型就是图形化对象的网图,包括活动(也可以说工作)和定义操作顺序的流控制。 2. BPMN基础 业务流程图由一系列的图形化元素组成。这些元素简化了模型的开发,且业务分析者看上去非常熟悉。这些元素每个都有各自的特性,且与大多数的建模器类似。比如,活动是矩形,条件是菱形。应该强调的是:开发BPMN的动力就是为了在创建业务流程模型时提供一个简单的机制,同时又能够处理来自业务流程的复杂性。要处理这两个矛盾的需求的方法就是将标记的图形化方面组织分类为特定的类别。这里提供标记类别中的一小部分,以便业务流程图的读者可以简单地识别出元素的基本类型从而理解图形。以下是四种基本的类型: 1)流对象 2)连接对象 3)泳道
4)人工信息 BPMN2.0概要:https://www.doczj.com/doc/de11948760.html,/workclass/201206272.asp 二、activiti主要接口 ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); RepositoryService repositoryService = processEngine.getRepositoryService(); TaskService taskService = processEngine.getTaskService(); ManagementService managementService = processEngine.getManagementService(); IdentityService identityService = processEngine.getIdentityService(); HistoryService historyService = processEngine.getHistoryService(); FormService formService = processEngine.getFormService(); ProcessEngines.getDefaultProcessEngine()会在第一次调用时初始化并创建一个流程引擎,以后再调用就会返回相同的流程引擎。使用对应的方法可以创建和关闭所有流程引擎:ProcessEngines.init()和ProcessEngines.destroy()。 ProcessEngines会扫描所有activiti.cfg.xml和activiti-context.xml文件。对于activiti.cfg.xml文件,流程引擎会使用Activiti的经典方式构建: ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream (inputStream).buildProcessEngine(). 对于activiti-context.xml文件,流程引擎会使用Spring方法构建:先创建一个Spring的环境,然后通过环境获得流程引擎。
Android系统架构 Android目录结构 1.src目录 src目录中存放的是该项目的源代码,其内部结构会根据用户所声明的包自动组织,该
目录的组织方式为src/com/jiang/Main.java,程序员在项目开发过程中,大部分时间是对该目录下的源代码文件进行编写。 2.gen目录 该目录的文件是ADT自动生成的,并不需要人为地去修改,实际上该目录下只定义了一个R.java文件,该文件相当于项目的字典,项目中用户界面、字符串、图片、声音等资源都会在该类中创建其唯一的ID,当项目中使用这些资源时,会通过该类得到资源的引用。 3.Android2.2 该目录中存放的是该项目支持的JAR包,同时还包含项目打包时需要的META-INF目录。 4.assets目录 该目录用于存放项目相关的资源文件,例如文本文件等,在程序中可以使用”getResources.getAssets().open(“text.txt”)”得到资源文件的输入流InputStream对象。 5.res目录 该目录用于存放应用程序中经常使用的资源文件,包括图片、声音、布局文件及参数描述文件等,包括多个目录,其中以drawable开头的三个文件夹用于存储.png、.9.png、.jpg 等图片资源。layout文件夹存放的是应用程序的布局文件。raw用于存放应用程序所用到的声音等资源。value存放的则是所有XML格式的资源描述文件,例如字符串资源的描述文件strings.xml、样式的描述文件style.xml、颜色描述文件colors.xml、尺寸描述文件dimens.xml,以及数组描述文件arrays.xml等。 6.AndroidManifest.xml文件 该文件为应用程序定义了全局的配置信息。这个文件列出了应用程序所提供的功能,包括四大组件、版本、权限等等。在这个文件中,你可以指定应用程序使用到的服务(如电话服务、互联网服务、短信服务、GPS服务等等)。另外当你新添加一个Activity的时候,也需要在这个文件中进行相应配置,只有配置好后,才能调用此Activity。 android:versionCode是给设备程序识别版本(升级)。 android:versionName是给用户看的。 7.default.properties文件 该文件为项目的配置文件,不需要认为改动,系统会自动为其进行管理,其中主要描述了该项目的版本等信息。
Android讲解 第一讲 1.Android概述 2.开发环境的搭建 3.创建第一个Android应用程序 4.Android程序的结构分析 1. src 毫无疑问,src 目录是放置我们所有Java 代码的地方,它在这里的含义和普通Java项目下的src 目录是完全一样的,展开之后你将看到我们刚才创建的HelloWorldActivity文件就在里面。 2. gen 这个目录里的内容都是自动生成的,主要有一个R.java 文件,你在项目中添加的任何资源都会在其中生成一个相应的资源id。这个文件永远不要手动去修改它。 3. assets 这个目录用得不多,主要可以存放一些随程序打包的文件,在你的程序运行时可以动态读取到这些文件的内容。另外,如果你的程序中使用到了WebView 加载本地网页的功能,所有
网页相关的文件也都存放在这个目录下。 4. bin 这个目录你也不需要过多关注,它主要包含了一些在编译时自动产生的文件。其中会有一个你当前项目编译好的安装包,展开bin 目录你会看到HelloWorld.apk,把这个文件拷到手机上就可以直接安装了。 5. libs 如果你的项目中使用到了第三方Jar 包,就需要把这些Jar 包都放在libs 目录下,放在这个目录下的Jar 包都会被自动添加到构建路径里去。你可以展开上图中Android 6.0、Android Private Libraries、Android Dependencies 这些库,其中显示的Jar 包都是已经被添加到构建路径里的。 6. res 这个目录下的内容就有点多了,简单点说,就是你在项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下,前面提到的R.java 中的内容也是根据这个目录下的文件自动生成的。当然这个目录下还有很多的子目录,图片放在drawable 目录下,布局放在layout 目录下,字符串放在values 目录下,所以你不用担心会把整个res 目录弄得乱糟糟的。 7. AndroidManifest.xml 这是你整个Android 项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册。另外还可以在这个文件中给应用程序添加权限声明,也可以重新指定你创建项目时指定的程序最低兼容版本和目标版本。由于这个文件以后会经常用到,我们用到的时候再做详细说明。 8. project.properties 这个文件非常地简单,就是通过一行代码指定了编译程序时所使用的SDK 版本。我们的HelloWorld 项目使用的是API 14,你也可以在这里改成其他版本试一试。 详解项目中的资源 所有以drawable 开头的文件夹都是用来放图片的,所有以values 开头的文件夹都是用来放字符串的,layout 文件夹是用来放布局文件的,menu 文件夹是用来放菜单文件的。怎么样,是不是突然感觉清晰了很多?之所以有这么多drawable 开头的文件夹,其实主要是为了让程序能够兼容更多的设备。在制作程序的时候最好能够给同一张图片提供几个不同分辨率的副本,分别放在这些文件夹下,然后当程序运行的时候会自动根据当前运行设备分辨率的高低选择加载哪个文件夹下的图片。当然这只是理想情况,更多的时候美工只会提供给我们一份图片,这时你就把所有图片都放在drawable-hdpi 文件夹下就好了。
Activity中 在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。 加载模式分类及在哪里配置 Activity有四种加载模式: ?standard ?singleTop ?singleTask ?singleInstance 设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:
A n d r o i d应用程序绑定服务b i n d S e r v i c e 的过程源代码分析
Android应用程序组件Service与Activity一样,既可以在新的进程中启动,也可以在应用程序进程内部启动;前面我们已经分析了在新的进程中启动Service的过程,本文将要介绍在应用程序内部绑定Service的过程,这是一种在应用程序进程内部启动Service的方法。 在前面一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划中,我们就曾经提到,在Android系统中,每一个应用程序都是由一些Activity和Service组成的,一般Service运行在独立的进程中,而Activity有可能运行在同一个进程中,也有可能运行在不同的进程中;在接下来的文章中,Android系统在新进程中启动自定义服务过程(startService)的原理分析一文介绍了在新的进程中启动Service的过程,Android应用程序启动过程源代码分析一文介绍了在新的进程中启动Activity的过程,而Android应用程序内部启动Activity过程(startActivity)的源代码分析一文则介绍了在应用程序进程内部启动Activity的过程;本文接过最后一棒,继续介绍在应用程序进程内部启动Service的过程,这种过程又可以称在应用程序进程内部绑定服务(bindService)的过程,这样,读者应该就可以对Android应用程序启动Activity和Service有一个充分的认识了。 这里仍然是按照老规矩,通过具体的例子来分析Android应用程序绑定Service的过程,而所使用的例子便是前面我们在介绍Android系统广播机制的一篇文章Android系统中的广播(Broadcast)机制简要介绍和学习计划中所开发的应用程序Broadcast了。 我们先简单回顾一下这个应用程序实例绑定Service的过程。在这个应用程序的MainActivity的onCreate函数中,会调用bindService来绑定一个计数器服务CounterService,这里绑定的意思其实就是在MainActivity内部获得CounterService的接口,所以,这个过程的第一步就是要把CounterService 启动起来。当CounterService的onCreate函数被调用起来了,就说明CounterService已经启动起来了,接下来系统还要调用CounterService的onBind函数,跟CounterService要一个Binder对象,这个Binder对象是在CounterService内部自定义的CounterBinder类的一个实例,它继承于Binder类,里面实现一个getService函数,用来返回外部的CounterService接口。系统得到这个Binder对象之后,就会调用MainActivity在bindService函数里面传过来的ServiceConnection实例的onServiceConnected函数,并把这个Binder对象以参数的形式传到onServiceConnected函数里面,于是,MainActivity就可以调用这个Binder对象的getService函数来获得CounterService的接口了。 这个过程比较复杂,但总体来说,思路还是比较清晰的,整个调用过程为MainActivity.bindService->CounterService.onCreate->CounterService.onBind- >MainActivity.ServiceConnection.onServiceConnection->CounterService.CounterBinder.getService。下面,我们就先用一个序列图来总体描述这个服务绑定的过程,然后就具体分析每一个步骤。
Activity四种启动模式 一、启动模式介绍 启动模式简单地说就是Activity启动时的策略,在Android Manifest.xml中的标签的android:launchMode属性设置; 启动模式有4种,分别为standard、singleTop、singleTask、singleInstance; 讲解启动模式之前,有必要先讲解一下“任务栈”的概念; 任务栈 每个应用都有一个任务栈,是用来存放Activity的,功能类似于函数调用的栈,先后顺序代表了Activity的出现顺序;比如Activity1-->Activity2-->Activity3,则任务栈为: 二、启动模式 (1)standard:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;
(2)singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例; (3)singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;
(4)singleInstance:如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;
SingTask的应用: 可以用来退出整个应用。 将主Activity设为SingTask模式,然后在要退出的Activity中转到主Activity,然后重写主Activity的onNewIntent函数,并在函数中加上一句finish。 附: 退出单个Activity方法: 调用finish 杀死该进程:killprocess(Process.mId) 终止正在运行的虚拟机:system.exit() 退出整个应用: 制造抛异常导致整个程序退出 将所有的activity放入到一个list中,然后在需要退出的时候,将所有的activity,finish掉 通过广播来完成退出功能 通过广播来完成退出功能,具体实现过程是这样的:在每个Activity创建时(onCreate时)给Activity注册一个广播接收器,当退出时发送该广播即可。大概的代码如下: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); IntentFilter filter = new IntentFilter(); filter.addAction("finish");
EOS工作流引擎工作原理 作者:Gocom注册用户dogreet(李国生) 1. 工作流基础知识 ……略 2. EOS工作流引擎工作原理 本文是我在工作之余写的一点我对EOS工作流的了解,我的理解不一定全是对的,可能会与引擎的真正的面目有出入。所以只能提供给大家一点参考。 2.1. EOS工作流引擎核心调度算法 EOS工作流最重要的组成部分是它的核心调度算法,在我们没有深入研究它的工作原理之前我们认为它的工作原理是在工作项,活动和流程实例对象上加了一些标志位来驱动流程的运转。认为其引擎完全是个由数据库来驱动流程的引擎(安徽二期的工作流平台好象就是以库表来驱动流程的运转),其实它是由事件来驱动流程运转的引擎,数据库只是把引擎运转前后的状态持久化。在我近来在工作之余对其引擎的工作原理进行跟踪才弄明白在EOS帮助文档上介绍的“事件驱动”的工作流引擎。 2.1.1. EOS工作流引擎的事件类型
以上的每个事件都是原子的不可分割的。其中一系列事件的集合通过EOS引擎事件调度机制实现我们平时在工作中经常遇到的如启动流程,结束工作项等等。(在事件类型类中EOS定义了29种事件,但在事件工厂类中EOS定义了26种类型。) 1.1.1. EOS工作流事件调度机制 EOS事件的调度服务是在工作流引擎初始化时通过服务工厂类加载到内存中(ServiceFactory.initEventService())。用户可以通过服务工厂类(ServiceFactory)取得JVM的唯一事件服务实例进行事务调度。所有的事件程序入口都是事件类(EventService),这个类其实是个接口,其有两个实现类,一个是单线程的实现类SingleThreadEventService (在实现代码中其实不是单线程,而是单例的对象),一个是多线程的实现类MulThreadThreadSvc,(其实现方式不在这里详细说明,多线程的类后面又跟了一大堆的线程池实现代码),在事件服务类中有一个属性类是WFEventDisposer,这个类包含了事
Android开发历程_3(Activity生命周期) Activity中有7个与生命周期有关的函数。其中onCreated()是activity第一次被启动时执行的,主要是初始化一些变量,onRestart()是当前activity重新被启动时调用的;绑定一些监听器等;onStart()是activity界面被显示出来的时候执行的;onResume()是当该activity与用户能进行交互时被执行;onPause()是另一个activity被启动,当前的activity就被暂停了,一般在该函数中执行保存当前的数据;onStop()表示另一个activity被启动完成时,当前activity对用户同时又完全不可见时才调用的;onDestroy()是退出当前activity时调用的,当然如果程序中调用finish()或者说android系统当前资源不够用时就会被调用。 当用多个activity在执行时,这时候android系统会自动将这些activity压入栈中并且总是显示最顶的那个activity,这个栈在android叫做task,但是这个栈只支持压入和弹出操作,不支持排序插入等操作。 Activity的7个生命周期函数中的onStop()函数被调用时是在其对应的activity被另外的activity完全遮挡的时候,如果只有部分遮挡,则不会被调用。部分遮挡一般是以消息activtiy的形式出现,这个只需在AndroidManifest.xml中将其对于的activity的主题设置theme中更改即可。 这7个周期函数,当系统资源不够时,其中onPause(),onStop(),onDestroy()是有可能被系统kill掉的,但其它4个是不会被kill掉。 参考资料为mars老师的资料。 官方给出关于这7个生命周期的图如下:
软外学院过程化第三次考核试卷 科目:Android应用开发命题教师:李会平班级:嵌入式11-1 姓名:学号:成绩: 一、填空(每空2分,共30分) 1.android中常用的四个布局是_线性布局相对布局、绝对布局、表格布局。 2. android 的四大组件是Activity、Service(没有UI)、Content Provider(内容提供者)、Brodcast Receiver(广播 intent一种中转的控件)。 3. android 中service的实现方法是OnStart()、OnBound()。 4.activity一般会重载7个方法用来维护其生命周期, 除了OnCreate(),onStart(), onDestory()方法外,还有哪些方法onResume()、onPause()、onStop()、onRestart(). 5.当启动一个新的Activity时,要用那个组件启动Intent. 二.选择题(每题2分,共30分) 1.android是如何组织Activity的( A ) A、以栈(先进后出)的方式组式Activity B、以队列的方式组织Activity C、以树形方式组织Activity D、以链式方式组织Activity。 2.onPause什么时候调用( C ) A.当界面启动时 B.当onCreate方法被执行之后 C.当界面被隐藏时 D.当界面重新显示时 3.在Activity中,如何获取service对象(A) A.可以通过直接实例化得到。 B.可以通过绑定得到。 C.通过startService() D.通过getService()获取。 4. 创建Menu需要重写的方法是( C ) A、onOptionsCreateMenu(Menu menu) B、onOptionsCreateMenu(MenuItem menu) C、onCreateOptionsMenu(Menu menu) D、onCreateOptionsMenu(MenuItem menu) ??5. 关于适配器的说法正确的有( B ) A.它主要是用来存储数据 B.它主要用来把数据绑定到组件上 C.它主要用来解析数据 D.它主要用来存储xml数据 6.关于Activity说的法不正确的是( C ) A. Activity是为用户操作而展示的可视化用户界面 B. 一个应用程序可以有若干个Activity C. Activity可以通过一个别名去访问 D. Activity可以表现为一个漂浮的窗口
Stopping and Restarting an Activity 停止与重启Activity 在activity生命周期中,恰当的停止与重启activity是很重要的,这样能确保用户感知到程序的存在并不会丢失他们的进度。在下面一些关键的场景中会涉及到停止与重启: 用户打开“最近使用的程序(Recent Apps)”的菜单并从当前app切换到另外一个app,这个时候先前的app是被停止的。如果用 户通过“主屏幕加载图标(Home screen launcher icon”或“最近使用的程序(Recent Apps)”重新回到这个app,则activity会重启。 用户在当前的app里面执行启动一个新的activity的操作时,当前activity会在第二个activity被创建后停止。如果用户点 击back按钮,之前的activtiy会被重启。 用户在运行app时接受到一个来电通话。 Activity类提供了onStop()方法与onRestart()方法用于在activity停止与重启时进行调用。和暂停状态时部分阻塞用户接口不同,停止状态时UI不可见并且用户的焦点转移到另一个activity中。 注意:因为系统在Activity停止时会在内存中保存了Activity实例,所以很多时候不需要实现onStop()方法与onRestart()方法,甚至是onStart()方法。因为大多数的Activity相对比较简单,Activity会自动正常停止与重启,只需要使用onPause()来停止正在运行的动作并断开系统资源链接。
如图1所示:当用户离开Activity时系统会调用onStop()来停止Activity (1)。这个时候如果用户返回,系统会调用onRestart()(2), 紧接着会调用onStart()(3)与onResume()(4)。需要注意的是:无论什么原因导致Activity停止,系统总是会在onStop()之前调用onPause()方法。 停止Activity 当activity调用onStop()方法时,该activity不再可见并且应该释放所有不再需要的资源。一旦activity停止了,系统可能会摧毁activity的实例以回收内存,甚至,系统会不执行activity的onDestroy()回调方法而直接杀死你的app进程, 因此需要使用onStop()来释放资源,从而避免内存泄漏。 尽管onPause()方法是在onStop()之前调用,通常应该使用onStop()来执行CPU密集型的关闭操作,例如把数据写入数据库。 例如,下面是一个在onStop()的方法里面保存笔记草稿到永久存储介质的示例: @Override
AndEngine游戏引擎讲解 AndEngine是一款以OpenGL ES方式进行画面渲染的2D游戏引擎,可以运行在支持Android 1.6及以上版本的系统当中。它在默认情况下已经可以支持中文,采用屏幕坐标系绘也更符合一般Android绘图习惯。 AndEngine引擎基础构成如下图所示: 如何使用AndEngine AndEngine的基本运行原理 解读AndEngine源码后我们可以发现,AndEngine除了采取低耦合、高内聚的框架策略细分引擎模块,使用OpenGLES进行游戏渲染之外;该引擎还以双线程方式 具体地说,其绘图线程位于AndEngine提供的GLSurfaceView内部类GLThread(在AndEngine的org.anddev.andengine.opengl.view包下,非Android默认的 当AndEngine进行游戏绘图时,游戏业务线程会通过wait方式锁定,而当游戏业务处理时,也会以同样的手段锁定绘图线程,二者间具体交互关系由Engine类
另外,或许是考虑到持续双线程运行电量消耗较大的缘故,AndEngine默认情况下要求用户启动PowerManager进行电源管理,故此需要
Activity创建: 1.创建一个class继承Activity或者Activity的子孙类。 2.在清单文件中声明Activity 3.在创建的类中。重写onCreate方法,在其中添加setContentView方法指定activity的界 面 Activity的结束: 1.点击back键结束activity 2.调用finish方法结束activity 3.异常退出activity 4.通过System.exit()退出activity 一、activity的生命周期 1.oncreate:activity在创建时执行 2.onstart:activity从不可见到可见的时候执行 3.onresume:activity可见,获取到activity焦点时候执行 4.onpause:activity可见,失去焦点的时候执行 5.onstop:activity从可见到不可见的时候执行 6.ondestory:activity销毁的时候执行 7.onrestart:activity从stop状态从新启动时执行
二、activity的启动方式(2种,通过intent实现) 1.显示:直接指定包名和类名启动 2.隐式:通过intent-filter匹配action/category/data,来启动activity 想隐式启动一个activity,必须在清单文件中对这个Activity指定一个intent-filter。 intent-filter中必须包含:action和category PS:匹配方式参考intent笔记 显示和隐式的区别: 1.显示启动:指定一个特定的人去做特定的事情 2.隐式启动:指定特定对的事情,完成事情的人不确定(当可选人唯一的时候,和显 示一样) 3.显示启动不能夸应用启动,隐式启动可以完成夸应用启动(隐式启动是根据清单文 件的信息来查询的,清单文件都是托管给系统,作为系统是有跨进程能力的,本身 应用是没有跨进程能力的) 三、activity的启动模式(4种) 1.standard:每次启动activity都在task栈中新建一个空间存放启动的activity 2.singleTop:当且仅当要启动的activity在栈顶时,不创建新的空间存,直接使用栈顶 的空间 3.singleTask:当启动一个被指定为singleTask的activity时,系统首先检测当前的task 栈中有没有这个activity,如果没有,新建一个空间存放。如果存在,像弹夹一样,先移除所有在其之上的activity,然后显示栈顶 4.singleInstance:当启动一个被声明为singleInstance的activity是,系统会创建一个 新的task来唯一存放这个activity 四、activity的数据传递(通过intent实现) 1.启动传递 2.结束传递
Activiti数据表结构和核心对象关系 西安创富电子科技有限公司 二〇一三年九月
版本历史
目录 1ACTIVITI数据库表结构--------------------------------------------------------------------------------------- 4 1.1 数据库表名说明 ---------------------------------------------------------------------------------------- 4 1.2 数据库表结构 ------------------------------------------------------------------------------------------- 4 2ACTIVITI中主要对象的关系 -------------------------------------------------------------------------------- 5
1Activiti数据库表结构 1.1数据库表名说明 Activiti工作流总共包含23张数据表,所有的表名默认以“ACT_”开头。并且表名的第二部分用两个字母表明表的用例,而这个用例也基本上跟Service API匹配。 ◆ACT_GE_* : “GE”代表“General”(通用),用在各种情况下; ◆ACT_HI_*: “HI”代表“History”(历史),这些表中保存的都是历史数 据,比如执行过的流程实例、变量、任务,等等。当系统中配置history的信息记录级别为“none”时,这一类表也可以不用; ◆ACT_ID_* : “ID”代表“Identity”(身份),这些表中保存的都身份信 息,如用户和组以及两者之间的关系。如果Activiti被集成在某一系统当中的话,这些表可以不用,可以直接使用现有系统中的用户或组信息; ◆ACT_RE_* : “RE”代表“Repository”(仓库),这些表中保存一些‘静 态’信息,如流程定义和流程资源(如图片、规则等); ◆ACT_RU_*: “RU”代表“Runtime”(运行时),这些表中保存一些流程实 例、用户任务、变量等的运行时数据。Activiti只保存流程实例在执行过程中的运行时数据,并且当流程结束后会立即移除这些数据,这是为了保证运行时表尽量的小并运行的足够快; 1.2数据库表结构 Activiti数据表清单: