免费建站平台官网福州做网站价格

diannao/2026/1/17 13:50:14/文章来源:
免费建站平台官网,福州做网站价格,自媒体app推广,网站是否含有seo收录功能Application Fundamentals 署名#xff1a;译言biAji 链接#xff1a;http://developer.android.com/guide/topics/fundamentals.html 应用程序基础(Application Fundamentals) Android应用程序使用Java做为开发语言。aapt工具把编译后的Java代码连同其它应用程序需要的数据…Application Fundamentals 署名译言biAji 链接http://developer.android.com/guide/topics/fundamentals.html    应用程序基础(Application Fundamentals) Android应用程序使用Java做为开发语言。aapt工具把编译后的Java代码连同其它应用程序需要的数据和资源文件一起打包到一个Android包文件中这个文件使用.apk做为扩展名它是分发应用程序并安装到移动设备的媒介用户只需下载并安装此文件到他们的设备。单一.apk文件中的所有代码被认为是一个应用程序。 从很多方面来看每个Android应用程序都存在于它自己的世界之中 l 默认情况下每个应用程序均运行于它自己的Linux进程中。当应用程序中的任意代码开始执行时Android启动一个进程而当不再需要此进程而其它应用程序又需要系统资源时则关闭这个进程。 l 每个进程都运行于自己的Java虚拟机VM中。所以应用程序代码实际上与其它应用程序的代码是隔绝的。 l 默认情况下每个应用程序均被赋予一个唯一的Linux用户ID并加以权限设置使得应用程序的文件仅对这个用户、这个应用程序可见。当然也有其它的方法使得这些文件同样能为别的应用程序所访问。 使两个应用程序共有同一个用户ID是可行的这种情况下他们可以看到彼此的文件。从系统资源维护的角度来看拥有同一个ID的应用程序也将在运行时使用同一个Linux进程以及同一个虚拟机。   应用程序组件(Application Components)        Android的核心功能之一就是一个应用程序可以使用其它应用程序的元素如果那个应用程序允许的话。比如说如果你的应用程序需要一个图片卷动列 表而另一个应用程序已经开发了一个合用的而又允许别人使用的话你可以直接调用那个卷动列表来完成工作而不用自己再开发一个。你的应用程序并没有吸纳 或链接其它应用程序的代码它只是在有需求的时候启动了其它应用程序的那个功能部分。          为达到这个目的系统必须在一个应用程序的一部分被需要时启动这个应用程序并将那个部分的Java对象实例化。与在其它系统上的应用程序不同Android应用程序没有为应用准备一个单独的程序入口比如说没有main()方法 而是为系统依照需求实例化提供了基本的组件。共有四种组件类型          Activities l  Activity是为用户操作而展示的可视化用户界面。比如说一个activity可以展示一个菜单项列表供用户选择或者显示一些包含说明的照片。一个短消息应用程序可以包括一个用于显示做为发送对象的联系人的列表的activity一个给选定的联系人写短信的activity以及翻阅以前的短信和改变设置的activity。尽管它们一起组成了一个内聚的用户界面但其中每个activity都与其它的保持独立。每个都是以Activity类为基类的子类实现。 l  一个应用程序可以只有一个activity或者如刚才提到的短信应用程序那样包含很多个。每个activity的作用以及其数目自然取决于应用 程序及其设计。一般情况下总有一个应用程序被标记为用户在应用程序启动的时候第一个看到的。从一个activity转向另一个的方式是靠当前的 activity启动下一个。 l  每个activity都被给予一个默认的窗口以进行绘制。一般情况下这个窗口是满屏的但它也可以是一个小的位于其它窗口之上的浮动窗口。一个 activity也可以使用超过一个的窗口──比如在activity运行过程中弹出的一个供用户反应的小对话框或是当用户选择了屏幕上特定项目后显 示的必要信息。 l  窗口显示的可视内容是由一系列视图构成的这些视图均继承自 View 基类。每个视图均控制着窗口中一块特定的矩形空 间。父级视图包含并组织它子视图的布局。叶节点视图位于视图层次最底端在它们控制的矩形中进行绘制并对用户对其直接操作做出响应。所以视图是 activity与用户进行交互的界面。比如说视图可以显示一个小图片并在用户指点它的时候产生动作。Android有很多既定的视图供用户直接使 用包括按钮、文本域、卷轴、菜单项、复选框等等。 l  视图层次是由Activity.setContentView() 方法放入activity的窗口之中的。上下文视图是位于视图层次根位置的视图对象。参见用户界面章节获取关于视图及层次的更多信息。          服务(Services) l  服务没有可视化的用户界面而是在一段时间内在后台运行。比如说一个服务可以在用户做其它事情的时候在后台播放背景音乐、从网络上获取一些数据或者计算一些东西并提供给需要这个运算结果的activity使用。每个服务都继承自Service基类。 l  一个媒体播放器播放播放列表中的曲目是一个不错的例子。播放器应用程序可能有一个或多个activity来给用户选择歌曲并进行播放。然而音乐播放这个 任务本身不应该为任何activity所处理因为用户期望在他们离开播放器应用程序而开始做别的事情时音乐仍在继续播放。为达到这个目的媒体播放器 activity应该启用一个运行于后台的服务。而系统将在这个activity不再显示于屏幕之后仍维持音乐播放服务的运行。 l  你可以连接至绑定一个正在运行的服务如果服务没有运行则启动之。连接之后你可以通过那个服务暴露出来的接口与服务进行通讯。对于音乐服务来说这个接口可以允许用户暂停、回退、停止以及重新开始播放。 l  如同activity和其它组件一样服务运行于应用程序进程的主线程内。所以它不会对其它组件或用户界面有任何干扰它们一般会派生一个新线程来进行一些耗时任务比如音乐回放。参见下述 进程和线程(Processes and Threads) 。          广播接收器(Broadcast receivers) l  广播接收器是一个专注于接收广播通知信息并做出对应处理的组件。很多广播是源自于系统代码的──比如通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说通知其它应用程序一些数据下载完成并处于可用状态。 l  应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。 l  广播接收器没有用户界面。然而它们可以启动一个activity来响应它们收到的信息或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标用户可以打开它并获取消息。          内容提供者(Content providers) l  内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继承于ContentProvider 基类为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而应用程序并不直接调用这些方法而是使用一个 ContentResolver 对象调用它的方法作为替代。ContentResolver可以与任意内容提供者进行会话与其合作来对所有相关交互通讯进行管理。 l  参阅独立的内容提供者Content Providers 章节获得更多关于使用内容提供者的内容。          每当出现一个需要被特定组件处理的请求时Android会确保那个组件的应用程序进程处于运行状态或在必要的时候启动它。并确保那个相应组件的实例的存在必要时会创建那个实例。   激活组件Activating components: intents          当接收到ContentResolver发出的请求后内容提供者被激活。而其它三种组件──activity、服务和广播接收器被一种叫做intent的异步消息所激活。intent是一个保存着消息内容的Intent对 象。对于activity和服务来说它指明了请求的操作名称以及作为操作对象的数据的URI和其它一些信息。比如说它可以承载对一个activity 的请求让它为用户显示一张图片或者让用户编辑一些文本。而对于广播接收器而言Intent对象指明了声明的行为。比如它可以对所有感兴趣的对象声 明照相按钮被按下。          对于每种组件来说激活的方法是不同的 l  通过传递一个Intent对象至 Context.startActivity()或Activity.startActivityForResult()以载入或指定新工作给一个activity。相应的activity可以通过调用 getIntent() 方法来查看激活它的intent。Android通过调用activity的onNewIntent()方法来传递给它继发的intent。 一个activity经常启动了下一个。如果它期望它所启动的那个activity返回一个结果它会以调用startActivityForResult()来取代startActivity()。比如说如果它启动了另外一个activity以使用户挑选一张照片它也许想知道哪张照片被选中了。结果将会被封装在一个Intent对象中并传递给发出调用的activity的onActivityResult() 方法。 l  通过传递一个Intent对象至Context.startService()将启动一个服务或给予正在运行的服务以一个新的指令。Android调用服务的 onStart()方法并将Intent对象传递给它。 与此类似一个Intent可以被调用组件传递给 Context.bindService()以获取一个正在运行的目标服务的连接。这个服务会经由onBind() 方法的调用获取这个Intent对象如果服务尚未启动bindService()会先启动它。比如说一个activity可以连接至前述的音乐回放服务并提供给用户一个可操作的用户界面以对回放进行控制。这个activity可以调用 bindService() 来建立连接然后调用服务中定义的对象来影响回放。 后面一节远程方法调用(Remote procedure calls)将更详细的阐明如何绑定至服务。 l  应用程序可以凭借将Intent对象传递给 Context.sendBroadcast() Context.sendOrderedBroadcast() 以及Context.sendStickyBroadcast()和其它类似方法来产生一个广播。Android会调用所有对此广播有兴趣的广播接收器的 onReceive()方法将intent传递给它们。 欲了解更多intent消息的信息请参阅独立章节 Intent和Intent滤过器(Intents and Intent Filters)。   关闭组件(Shutting down components)          内容提供者仅在响应ContentResolver提出请求的时候激活。而一个广播接收器仅在响应广播信息的时候激活。所以没有必要去显式的关闭这些组件。          而activity则不同它提供了用户界面并与用户进行会话。所以只要会话依然持续哪怕对话过程暂时停顿它都会一直保持激活状态。与此相似服务也会在很长一段时间内保持运行。所以Android为关闭activity和服务提供了一系列的方法。 l  可以通过调用它的finish()方法来关闭一个activity。一个activity可以通过调用另外一个activity它用startActivityForResult() 启动的的finishActivity()方法来关闭它。 l  服务可以通过调用它的stopSelf()方法来停止或者调用 Context.stopService()。 系统也会在组件不再被使用的时候或者Android需要为活动组件声明更多内存的时候关闭它。后面的activity元素的name属性指定了实现了这个activity的 Activity的子类。icon和label属性指向了包含展示给用户的此activity的图标和标签的资源文件。          其它组件也以类似的方法声明──service 元素用于声明服务 receiver 元素用于声明广播接收器而provider 元素用于声明内容提供者。 manifest文件中未进行声明的activity、服务以及内容提供者将不为系统所见从而也就不会被运行。然而广播接收器既可以在manifest文件中声明也可以在代码中进行动态的创建并以调用Context.registerReceiver()的方式注册至系统。          欲更多了解如何为你的应用程序构建manifest文件请参阅AndroidManifest.xml文件一章。   Intent过滤器(Intent filters)          Intent对象可以被显式的指定目标组件。如果进行了这种指定Android会找到这个组件依据manifest文件中的声明并激活它。但如果 Intent没有进行显式的指定Android就必须为它找到对于intent来说最合适的组件。这个过程是通过比较Intent对象和所有可能对象的intent过滤器完成的。组件的intent过滤器会告知Android它所能处理的intent类型。如同其它相对于组件很重要的信息一样这些是在manifest文件中进行声明的。这里是上面实例的一个扩展其中加入了针对activity的两个intent过滤器声明   示例中的第一个过滤器──action “android.intent.action.MAIN”和类别“android.intent.category.LAUNCHER”的组合──是通常具有的。它标明了这个activity将在应用程序加载器中显示就是用户在设备上看到的可供加载的应用程序列表。换句话说这个activity是应用程序的入口是用户选择运行这个应用程序后所见到的第一个activity。          第二个过滤器声明了这个activity能被赋予一种特定类型的数据。          组件可以拥有任意数量的intent过滤器每个都会声明一系列不同的能力。如果它没有包含任何过滤器它将只能被显式声明了目标组件名称的intent激活。          对于在代码中创建并注册的广播接收器来说intent过滤器将被直接以 IntentFilter对象实例化。其它过滤器则在manifest文件中设置。          欲获得更多intent过滤器的信息请参阅独立章节 Intent和Intent过滤器。   Activity和任务(Activities and Tasks)          如前所述一个activity可以启动另外一个甚至包括与它不处于同一应用程序之中的。举个例子说假设你想让用户看到某个地方的街道地图。而已经存 在一个具有此功能的activity了那么你的activity所需要做的工作就是把请求信息放到一个Intent对象里面并把它传递给startActivity()。于是地图浏览器就会显示那个地图。而当用户按下BACK键的时候你的activity又会再一次的显示在屏幕上。          对于用户来说这看起来就像是地图浏览器是你activity所在的应用程序中的一个组成部分其实它是在另外一个应用程序中定义并运行在那个应用程序的进程之中的。Android将这两个activity放在同一个任务中 来维持一个完整的用户体验。简单的说任务就是用户所体验到的“应用程序”。它是安排在一个堆栈中的一组相关的activity。堆栈中的根 activity就是启动了这整个任务的那个──一般情况下它就是用户在应用程序加载器中所选择的。而堆栈最上方的activity则是当前运行的── 用户直接对其进行操作的。当一个activity启动另外一个的时候新的activity就被压入堆栈并成为当前运行的activity。而前一个 activity仍保持在堆栈之中。当用户按下BACK键的时候当前activity出栈而前一个恢复为当前运行的activity。          堆栈中保存的其实是对象所以如果发生了诸如需要多个地图浏览器的情况就会使得一个任务中出现多个同一Activity子类的实例同时存在堆栈会为每个实例单独开辟一个入口。堆栈中的Activity永远不会重排只会压入或弹出。          任务其实就是activity的堆栈而不是manifest文件中的一个类或者元素。所以你无法撇开activity而为一个任务设置一个值。而事实上 整个任务使用的值是在根activity中设置的。比如说下一节我们会谈及“任务的affinity”从affinity中读出的值将会设置到任务的 根activity之中。          任务中的所有activity是作为一个整体进行移动的。整个的任务即activity堆栈可以移到前台或退至后台。举个例子说比如当前任务在堆 栈中存有四个activity──三个在当前activity之下。当用户按下HOME键的时候回到了应用程序加载器然后选择了一个新的应用程序也 就是一个新任务。则当前任务遁入后台而新任务的根activity显示出来。然后过了一小会儿用户再次回到了应用程序加载器而又选择了前一个应用程序上一个任务。于是那个任务带着它堆栈中所有的四个activity再一次的到了前台。当用户按下BACK键的时候屏幕不会显示出用户刚才离开的activity上一个任务的根activity。取而代之当前任务的堆栈中最上面的activity被弹出而同一任务中的上一个activity显示了出来。          上述的种种即是activity和任务的默认行为模式。但是有一些方法可以改变所有这一切。activity和任务的联系、任务中activity的行为 方式都被启动那个activity的Intent对象中设置的一系列标记和manifest文件中那个activity中的activity元素的系列属性之间的交互所控制。无论是请求发出者和回应者在这里都拥有话语权。          我们刚才所说的这些关键Intent标记如下                    FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_RESET_TASK_IF_NEEDED FLAG_ACTIVITY_SINGLE_TOP          而关键的activity属性是                    taskAffinity launchMode allowTaskReparenting clearTaskOnLaunch alwaysRetainTaskState finishOnTaskLaunch          接下来的一节会描述这些标记以及属性的作用它们是如何互相影响的以及控制它们的使用时必须考虑到的因素。   任务共用性和新任务Affinities and new tasks          默认情况下一个应用程序中的activity相互之间会有一种Affinity──也就是说它们首选都归属于一个任务。然而可以在activity元素中把每个activity的taskAffinity属 性设置为一个独立的affinity。于是在不同的应用程序中定义的activity可以享有同一个affinity或者在同一个应用程序中定义的 activity有着不同的affinity。affinity在两种情况下生效当加载activity的Intent对象包含了FLAG_ACTIVITY_NEW_TASK 标记或者当activity的allowTaskReparenting属性设置为“true”。          FLAG_ACTIVITY_NEW_TASK标记                    如前所述在默认情况下一个新activity被另外一个调用了startActivity()方法的activity载入了任务之中。并压入了调用者所在的堆栈。然而如果传递给startActivity()的Intent对象包含了FLAG_ACTIVITY_NEW_TASK标记系统会为新activity安排另外一个任务。一般情况下如同标记所暗示的那样这会是一个新任务。然而这并不是必然的。如果已经存在了一个与新activity有着同样affinity的任务则activity会载入那个任务之中。如果没有则启用新任务。          allowTaskReparenting 属性                    如果一个activity将allowTaskReparenting属 性设置为“true”。它就可以从初始的任务中转移到与其拥有同一个affinity并转向前台的任务之中。比如说一个旅行应用程序中包含的预报所选城 市的天气情况的activity。它与这个应用程序中其它的activity拥有同样的affinity默认的affinity而且允许重定父级。你 的另一个activity启动了天气预报于是它就会与这个activity共处与同一任务之中。然而当那个旅行应用程序再次回到前台的时候这个天气 预报activity就会被再次安排到原先的任务之中并显示出来。          如果在用户的角度看来一个.apk文件中包含了多于一个的“应用程序”你可能会想要为它们所辖的activity安排不一样的affinity。   加载模式(Launch modes)          activity元素的launchMode属性可以设置四种不同的加载模式 standard (默认模式) singleTop singleTask singleInstance          这些模式之间的差异主要体现在四个方面 l  哪个任务会把持对intent做出响应的activity。对“standard”和“singleTop”模式而言是产生intent并调用startActivity()的任务──除非Intent对象包含FLAG_ACTIVITY_NEW_TASK标记。而在这种情况下如同上面Affinitie和新任务一节所述会是另外一个任务。 相反对“singleTask”和“singleInstance”模式而言activity总是位于任务的根部。正是它们定义了一个任务所以它们绝不会被载入到其它任务之中。 l  activity是否可以存在多个实例。一个“standard”或“singleTop”的activity可以被多次初始化。它们可以归属于多个任务而一个任务也可以拥有同一activity的多个实例。 相反对“singleTask”和“singleInstance”的activity被限定于只能有一个实例。因为这些activity都是任务的起源这种限制意味着在一个设备中同一时间只允许存在一个任务的实例。 l  在实例所在的任务中是否会有别的activity。一个“singleInstance”模式的activity将会是它所在的任务中唯一的activity。如果它启动了别的activity那个activity将会依据它自己的加载模式加载到其它的任务中去──如同在intent中设置了FLAG_ACTIVITY_NEW_TASK 标记一样的效果。在其它方面“singleInstance”模式的效果与“singleTask”是一样的。 剩下的三种模式允许一个任务中出现多个activity。“singleTask”模式的activity将是任务的根activity但它可以启动别的activity并将它们置入所在的任务中。“standard”和“singleTop”activity则可以在堆栈的任意位置出现。 l  是否要载入新的类实例以处理新的intent。对默认的standard模式来说对于每个新intent都会创建一个新的实例以进行响应每个实例仅处理一个intent。“singleTop”模式下如果activity位于目的任务堆栈的最上面则重用目前现存的activity来处理新的intent。如果它不是在堆栈顶部则不会发生重用。而是创建一个新实例来处理新的intent并将其推入堆栈。 举例来说假设一个任务的堆栈由根activityA和activity B、C和位于堆栈顶部的D组成即堆栈A-B-C-D。一个针对D类型的activity的intent抵达的时候如果D是默认的“standard”加载模式则创建并加载一个新的类实例于是堆栈变为A-B-C-D-D。 然而如果D的载入模式为“singleTop”则现有的实例会对新intent进行处理因为它位于堆栈顶部而堆栈保持A-B-C-D的形态。 换言之如果新抵达的intent是针对B类型的activity则无论B的模式是“standard”还是“singleTop” 都会加载一个新的B的实例因为B不位于堆栈的顶部而堆栈的顺序变为A-B-C-D-B。 如前所述“singleTask”或“singleInstance”模式的activity永远不会存在多于一个实例。所以实例将处理所有新的intent。一个“singleInstance”模式的activity永远保持在堆栈的顶部因为它是那个堆栈中唯一的一个activity所以它一直坚守在处理intent的岗位上。然而对一个“singleTask”模式的activity来说它上面可能有也可能没有别的activity和它处于同一堆栈。在有的情况下它就不在能够处理intent的位置上则那个intent将被舍弃。即便在intent被舍弃的情况下它的抵达仍将使这个任务切换至前台并一直保留          当一个现存的activity被要求处理一个新的intent的时候会调用onNewIntent()方法来将intent对象传递至activity。启动activity的原始intent对象可以通过调用getIntent()方法获得。          请注意当一个新的activity实例被创建以处理新的intent的时候用户总可以按下BACK键来回到前面的状态回到前一个 activity。但当使用现存的activity来处理新intent的时候用户是不能靠按下BACK键回到当这个新intent抵达之前的状态 的。          想获得更多关于加载模式的内容请参阅 activity 元素的描述。   清理堆栈(Clearing the stack)          如果用户离开一个任务很长一段时间系统会清理该任务中除了根activity之外的所有activity。当用户再次回到这个任务的时候除了只剩下初 始化activity尚存之外其余都跟用户上次离开它的时候一样。这样做的原因是在一段时间之后用户再次回到一个任务的时候他们更期望放弃他们之 前的所作所为做些新的事情。          这些属于默认行为另外也存在一些activity的属性用以控制并改变这些行为          alwaysRetainTaskState 属性                    如果一个任务的根activity中此属性设置为“true”则上述默认行为不会发生。任务将在很长的一段时间内保留它堆栈内的所有activity。          clearTaskOnLaunch属性                    如果一个任务的根activity中此属性设置为“true”则每当用户离开这个任务和返回它的时候堆栈都会被清空至只留下rootactivity。换句话说这是alwaysRetainTaskState的另一个极端。哪怕仅是过了一小会儿用户回到任务时也是见到它的初始状态。          finishOnTaskLaunch属性                    这个属性与clearTaskOnLaunch属性相似但它仅作用于单个的activity而不是整个的task。而且它可以使任意activity都被清理甚至根activity也不例外。当它设置为“true”的时候此activity仅做为任务的一部分存在于当前回话中一旦用户离开并再次回到这个任务此activity将不复存在。          此外还有别的方式从堆栈中移除一个activity。如果一个intent对象包含FLAG_ACTIVITY_CLEAR_TOP标记而且目标任务的堆栈中已经存在了一个能够响应此intent的activity类型的实例。则这个实例之上的所有activity都将被清理以使它位于堆栈的顶部来对intent做出响应。如果此时指定的activity的加载模式为“standard”则它本身也会从堆栈中移除并加载一个新的实例来处理到来的intent。这是因为加载模式为“standard”的activity总会创建一个新实例来处理新的intent。          FLAG_ACTIVITY_CLEAR_TOP与FLAG_ACTIVITY_NEW_TASK经常合并使用。这时这些标记提供了一种定位其它任务中现存的activity并将它们置于可以对intent做出响应的位置的方法。   启动任务(Starting tasks)          当一个activity被指定一个“android.intent.action.MAIN”做为动作以及“android.intent.category.LAUNCHER”做为类别的intent过滤器之后在前述intent过滤器一节中已经有了这个示例它就被设置为一个任务的入口点。这样的过滤器设置会在应用程序加载器中为此activity显示一个图标和标签以供用户加载任务或加载之后在任意时间回到这个任务。          第二个能力相当重要用户必须可以离开一个任务并在一段时间后返回它。出于这个考虑加载模式被设定为“singleTask”和“singleInstance”的activity总是会初始化一个新任务这样的activity仅能用于指定了一个MAIN和LAUNCHER过滤器的情况之下。我们来举例说明如果没指定过滤器的情况下会发生的事情一个intent加载了一个“singleTask”的activity初始化了一个新任务用户在这个任务中花费了一些时间来完成工作。然后用户按下了HOME键。于是任务被要求转至后台并被主屏幕所掩盖。因为它并没有在应用程序加载器中显示图标这将导致用户无法再返回它。          类似的困境也可由FLAG_ACTIVITY_NEW_TASK标记引起。如果此标记使一个activity启动了一个新任务继而用户按下了HOME键离开了它则用户必须要有一些方法再次回到这个任务。一些实体诸如通知管理器总是在另外的任务中启动新activity而不是做为它们自己的一部分所以它们总是将FLAG_ACTIVITY_NEW_TASK标记包含在intent里面并传递给startActivity()。如果你写了一个能被外部实体使用这个标记调用的activity你必须注意要给用户留一个返回这个被外部实体启动的任务的方法。          当你不想让用户再次返回一个activity的情况下可以将 activity 元素的 finishOnTaskLaunch设置为“true”。参见前述View.onKeyDown()这样报告用户动作以及后面 线程一节所叙述的那样为这些长时间操作衍生出一个单独的线程进行处理。          在可用内存不足而又有一个正在为用户进行服务的进程需要更多内存的时候Android有时候可能会关闭一个进程。而在这个进程中运行着的应用程序也因此被销毁。当再次出现需要它们进行处理的工作的时候会为这些组件重新创建进程。          在决定结束哪个进程的时候Android会衡量它们对于用户的相对重要性。比如说相对于一个仍有用户可见的activity的进程它更有可能去关闭 一个其activity已经不为用户所见的进程。也可以说决定是否关闭一个进程主要依据在那个进程中运行的组件的状态。这些状态将在后续的一节Thread对象创建的。Android提供了很多便于管理线程的类 Looper用于在一个线程中运行一个消息循环 Handler用于处理消息HandlerThread 用于使用一个消息循环启用一个线程。   远程方法调用(Remote procedure calls)          Android有一个轻量级的远程方法调用RPC机制即在本地调用一个方法但在远程其它的进程中进行处理然后将结果返回调用者。这将方法调用及其附属的数据以系统可以理解的方式进行分离并将其从本地进程和本地地址空间传送至远程过程和远程地址空间并在那里重新装配并对调用做出反应。返回 的结果将以相反的方向进行传递。Android提供了完成这些工作所需的所有的代码以使你可以集中精力来实现RPC接口本身。          RPC接口可以只包括方法。即便没有返回值所有方法仍以同步的方式执行本地方法阻塞直至远程方法结束。          简单的说这套机制是这样工作的一开始你用简单的IDL界面描绘语言声明一个你想要实现的RPC接口。然后用 aidl 工具为这个声明生成一个Java接口定义这个定义必须对本地和远程进程都可见。它包含两个内部类如下图所示            内部类中有管理实现了你用IDL声明的接口的远程方法调用所需要的所有代码。两个内部类均实现了 IBinder接口。一个用于系统在本地内部使用你些的代码可以忽略它另外一个我们称为Stub扩展了Binder类。除了实现了IPC调用的内部代码之外它还包括了你声明的RPC接口中的方法的声明。你应该如上图所示的那样写一个Stub的子类来实现这些方法。          一般情况下远程过程是被一个服务所管理的因为服务可以通知系统关于进程以及它连接到别的进程的信息。它包含着 aidl工具产生的接口文件和实现了RPC方法的Stub的子类。而客户端只需要包括aidl工具产生的接口文件。          下面将说明服务与其客户端之间的连接是如何建立的 l  服务的客户端位于本地应该实现 onServiceConnected() 和 onServiceDisconnected() 方法。这样当至远程服务的连接成功建立或者断开的时候它们会收到通知。这样它们就可以调用 bindService() 来设置连接。 l  而服务则应该实现 onBind() 方法以接受或拒绝连接。这取决于它收到的intentintent将传递给bindService()。如果接受了连接它会返回一个Stub的子类的实例。 l  如果服务接受了连接Android将会调用客户端的onServiceConnected() 方法并传递给它一个IBinder对象它是由服务所管理的Stub的子类的代理。通过这个代理客户端可以对远程服务进行调用。   线程安全方法(Thread-safe methods)          在一些情况下你所实现的方法有可能会被多于一个的线程所调用所以它们必须被写成线程安全的。          对于我们上一节所讨论的RPC机制中的可以被远程调用的方法来说这是必须首先考虑的。如果针对一个IBinder对象中实现的方法的调用源自这个 IBinder对象所在的进程时这个方法将会在调用者的线程中执行。然而如果这个调用源自其它的进程则这个方法将会在一个线程池中选出的线程中运 行这个线程池由Android加以管理并与IBinder存在于同一进程内这个方法不会在进程的主线程内执行。反过来说一个服务的 onBind() 方法应为服务进程的主线程所调用而实现了由 onBind() 返回的对象比如说一个实现了RPC方法的Stub的子类的方法将为池中的线程所调用。因为服务可以拥有多于一个的客户端而同一时间也会有多个池中的线程调用同一个IBinder方法。因此IBinder方法必须实现为线程安全的。          类似的一个内容提供者能接受源自其它进程的请求数据。尽管ContentResolver和ContentProvider类隐藏了交互沟通过程的管理细节ContentProvider会由query() insert() delete() update()和getType()方法来相应这些请求而这些方法也都是由那个内容提供者的进程中所包涵的线程池提供的而不是进程的主线程本身。所以这些有可能在同一时间被很多线程调用的方法也必须被实现为线程安全的。   组件生命周期(Component Lifecycles) 应用程序组件有其生命周期──由Android初始化它们以相应intent直到这个实例被摧毁。在此之间它们有时是激活的有时则相反。或者如果它是 一个activity则是可为用户所见或者不能。这一节讨论了activity、服务以及广播接收器的生命周期包括它们在生命周期中的状态、在状态之 间转变时通知你的方法、以及当这些进程被关闭或实例被摧毁时这些状态产生的效果。   Activity生命周期(Activity lifecycle)          一个activity主要有三个状态 l  当在屏幕前台时位于当前任务堆栈的顶部它是活跃或运行的状态。它就是相应用户操作的activity。 l  当它失去焦点但仍然对用户可见时它处于暂停状态。即是在它之上有另外一个activity。这个activity也许是透明的或者未能完全遮蔽全屏所以被暂停的activity仍对用户可见。暂停的activity仍然是存活状态它保留着所有的状态和成员信息并连接至窗口管理器但当系统处于极低内存的情况下仍然可以杀死这个activity。 l  如果它完全被另一个activity覆盖是它处于停止状态。它仍然保留所有的状态和成员信息。然而它不在为用户可见所以它的窗口将被隐藏如果其它地方需要内存则系统经常会杀死这个activity。 如果一个activity处于暂停或停止状态系统可以通过要求它结束调用它的 finish() 方法或直接杀死它的进程来将它驱出内存。当它再次为用户可见的时候它只能完全重新启动并恢复至以前的状态。 当一个activity从这个状态转变到另一个状态时它被以下列protected方法所通知          void onCreate(Bundle savedInstanceState) void onStart() void onRestart() void onResume() void onPause() void onStop() void onDestroy()          你可以重载所有这些方法以在状态改变时进行合适的工作。所有的activity都必须实现 onCreate() 用以当对象第一次实例化时进行初始化设置。很多activity会实现 onPause()以提交数据变化或准备停止与用户的交互。   调用父类(Calling into the superclass)          所有activity生命周期方法的实现都必须先调用其父类的版本。比如说                    总得来说这七个方法定义了一个activity完整的生命周期。实现这些方法可以帮助你监察三个嵌套的生命周期循环 l  一个activity 完整的生命周期 自第一次调用 onCreate()开始直至调用onDestroy()为止。activity在onCreate()中设置所有“全局”状态以完成初始化而在onDestroy()中释放所有系统资源。比如说如果activity有一个线程在后台运行以从网络上下载数据它会以 onCreate()创建那个线程而以 onDestroy()销毁那个线程。 l  一个activity的 可视生命周期自 onStart() 调用开始直到相应的 onStop()调用。在此期间用户可以在屏幕上看到此activity尽管它也许并不是位于前台或者正在与用户做交互。在这两个方法中你可以管控用来向用户显示这个activity的资源。比如说你可以在onStart() 中注册一个BroadcastReceiver 来监控会影响到你UI的改变而在onStop() 中来取消注册这时用户是无法看到你的程序显示的内容的。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。 l  一个activity的 前台生命周期 自 onResume() 调用起至相应的 onPause()调用为止。在此期间activity位于前台最上面并与用户进行交互。activity会经常在暂停和恢复之间进行状态转换──比如说当设备转入休眠状态或有新的activity启动时将调用onPause() 方法。当activity获得结果或者接收到新的intent的时候会调用onResume() 方法。因此在这两个方法中的代码应当是轻量级的。 下图展示了上述循环过程以及activity在这个过程之中历经的状态改变。着色的椭圆是activity可以经历的主要状态。矩形框代表了当activity在状态间发生改变的时候你进行操作所要实现的回调方法。            下表详细描述了这些方法并在activity的整个生命周期中定位了它们。 方法 描述 是否可被杀死(Killable?) 下一个 onCreate() 在activity第一次被创建的时候调用。这里是你做所有初始化设置的地方──创建视图、绑定数据至列表等。如果曾经有状态记录参阅后述Saving Activity State。则调用此方法时会传入一个包含着此activity以前状态的包对象做为参数。 接下来始终遵循调用onStart()。 否 onStart() onRestart() 在activity停止后在再次启动之前被调用。 接下来始终遵循调用onStart()。 否 onStart() onStart() 当activity正要变得为用户所见时被调用。 当activity转向前台时接下来调用onResume()在activity变为隐藏时接下来调用onStop()。 否 onResume() 或 onStop() onResume() 在activity开始与用户进行交互之前被调用。此时activity位于堆栈顶部并接受用户输入。 接下来始终遵循调用onPause()。 否 onPause() onPause() 当系统将要启动另一个activity时调用。此方法主要用来将未保存的变化进行持久化停止类似动画这样耗费CPU的动作等。这一切动作应该在短时间内完成因为下一个activity必须等到此方法返回后才会继续。 当activity重新回到前台时接下来调用onResume()。当activity变为用户不可见时接下来调用onStop()。 是 onResume() 或 onStop() onStop() 当activity不再为用户可见时调用此方法。这可能发生在它被销毁或者另一个activity可能是现存的或者是新的回到运行状态并覆盖了它。 如果activity再次回到前台跟用户交互则接下来调用onRestart()如果关闭activity则接下来调用onDestroy()。 是 onRestart() or onDestroy() onDestroy() 在activity销毁前调用。这是activity接收的最后一个调用。这可能发生在activity结束调用了它的 finish() 方法或者因为系统需要空间所以临时的销毁了此acitivity的实例时。你可以用isFinishing()方法来区分这两种情况。 是 无          请注意上表中可被杀死一列。它标示了在方法返回后还没执行activity的其余代码的任意时间里系统是否可以杀死包含此activity的进程。三个方法onPause()、 onStop()和onDestroy()被标记为“是”。onPause()是三个中的第一个它也是唯一一个在进程被杀死之前必然会调用的方法──onStop() 和 onDestroy() 有可能不被执行。因此你应该用 onPause() 来将所有持久性数据比如用户的编辑结果写入存储之中。          在可被杀死一列中标记为“否”的方法在它们被调用时将保护activity所在的进程不会被杀死。所以只有在onPause()方法返回后到onResume() 方法被调用时一个activity才处于可被杀死的状态。在onPause()再次被调用并返回之前它不会被系统杀死。     如后面一节进程和生命周期所述即使是在这里技术上没有被定义为“可杀死”的activity仍然有可能被系统杀死──但这仅会发生在实在没有其它方法的极端情况之下。   保存activity状态(Saving activity state)          当系统而不是用户自己出于回收内存的考虑关闭了一个activity之后。用户会期望当他再次回到那个activity的时候它仍保持着上次离开时的样子。          为了获取activity被杀死前的状态你应该为activity实现onSaveInstanceState() 方法。Android在activity有可能被销毁之前即onPause() 调用之前会调用此方法。它会将一个以名称-值对方式记录了activity动态状态的Bundle 对象传递给该方法。当activity再次启动时这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState()所以它们两个都可以恢复捕获的状态。          与onPause()或先前讨论的其它方法不同onSaveInstanceState() 和 onRestoreInstanceState() 并不是生命周期方法。它们并不是总会被调用。比如说Android会在activity易于被系统销毁之前调用 onSaveInstanceState()但用户动作比如按下了BACK键造成的销毁则不调用。在这种情况下用户没打算再次回到这个activity所以没有保存状态的必要。          因为onSaveInstanceState()不是总被调用所以你应该只用它来为activity保存一些临时的状态而不能用来保存持久性数据。而是应该用onPause()来达到这个目的。   服务生命周期(Coordinating activities)          服务以两种方式使用 l  它可以启动并运行直至有人停止了它或它自己停止。在这种方式下它以调用Context.startService()启动而以调用Context.stopService()结束。它可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。不论调用了多少次startService()方法你只需要调用一次stopService()来停止服务。 l  它可以通过自己定义并暴露出来的接口进行程序操作。客户端建立一个到服务对象的连接并通过那个连接来调用服务。连接以调用Context.bindService()方法建立以调用 Context.unbindService()关闭。多个客户端可以绑定至同一个服务。如果服务此时还没有加载bindService()会先加载它。 这两种模式并不是完全分离的。你可以绑定至一个用 startService()启动的服务。比如说一个后台音乐播放服务可以调用startService()并传递给它一个包含欲播放的音乐列表的Intent对象来启动。不久当用户想要对播放器进行控制或者查看当前播放曲目的详情时会启用一个activity调用bindService()连接到服务来完成操作。在这种情况下直到绑定连接关闭stopService() 才会真正停止一个服务。 与activity一样服务也有一系列你可以实现以用于监控其状态变化的生命周期方法。但相对于activity要少一些只有三个而且它们是public属性并非protected void onCreate() void onStart(Intent intent) void onDestroy()          倚仗实现这些方法你监控服务的两个嵌套的生命周期循环 l  服务的完整生命周期始于调用onCreate()而终于onDestroy()方法返回。如同activity一样服务在onCreate()里面进行它自己的初始化而在onDestroy()里面释放所有资源。比如说一个音乐回放服务可以在onCreate()中创建播放音乐的线程 而在onDestroy()中停止这个线程。 l  服务的活跃生命周期始于调用onStart()。这个方法用于处理传递给startService()的Intent对象。音乐服务会打开Intent来探明将要播放哪首音乐并开始播放。 服务停止时没有相应的回调方法──不存在onStop()方法。          onCreate()和onDestroy()方法在所有服务中都会被调用无论它们是由Context.startService()还是由Context.bindService()所启动的。而onStart()仅会被startService()所启用的服务调用。          如果一个服务允许别的进程绑定则它还会有以下额外的回调方法以供实现 IBinder onBind(Intent intent) boolean onUnbind(Intent intent) void onRebind(Intent intent)          传递给bindService的Intent的对象也会传递给onBind()回调方法而传递给unbindService()的Intent对象同样传递给onUnbind()。如果服务允许绑定onBind()将返回一个供客户端与服务进行交互的通讯渠道。如果有新的客户端连接至服务则onUnbind()方法可以要求调用onRebind() 。          下图描绘了服务的回调方法。尽管图中对由startService 和startService方法启动的服务做了区分但要记住不论一个服务是怎么启动的它都可能允许客户端的连接所以任何服务都可以接受onBind()和onUnbind()调用。            广播接收器生命周期(Broadcast receiver lifecycle)          广播接收器只有一个回调方法                    void onReceive(Context curContext, Intent broadcastMsg)          当广播消息抵达接收器时Android调用它的onReceive() 方法并将包含消息的Intent对象传递给它。广播接收器仅在它执行这个方法时处于活跃状态。当onReceive()返回后它即为失活状态。          拥有一个活跃状态的广播接收器的进程被保护起来而不会被杀死。但仅拥有失活状态组件的进程则会在其它进程需要它所占有的内存的时候随时被杀掉。          这种方式引出了一个问题如果响应一个广播信息需要很长的一段时间我们一般会将其纳入一个衍生的线程中去完成而不是在主线程内完成它从而保证用户交互过程的流畅。如果onReceive()衍生了一个线程并且返回则包涵新线程在内的整个进程都被会判为失活状态除非进程内的其它应用程序组件仍处于活跃状态于是它就有可能被杀掉。这个问题的解决方法是令onReceive()启动一个新服务并用其完成任务于是系统就会知道进程中仍然在处理着工作。          下一节中我们会讨论更多进程易误杀的问题。   进程与生命周期(Processes and lifecycles)          Android系统会尽可能长的延续一个应用程序进程但在内存过低的时候仍然会不可避免需要移除旧的进程。为决定保留或移除一个进程Android 将每个进程都放入一个“重要性层次”中依据则是它其中运行着的组件及其状态。重要性最低的进程首先被消灭然后是较低的依此类推。重要性共分五层依 据重要性列表如下 1.         前台进程是用户操作所必须的。当满足如下任一条件时进程被认为是处于前台的 l  它运行着正在与用户交互的activityActivity对象的 onResume() 方法已被调用。 l  一个正在与用户交互的activity使用着它提供的一个服务。 l  它包含着一个正在执行生命周期回调方法onCreate()、onStart()或onDestroy()的Service对象。 l  它包含着一个正在执行 onReceive() 方法的BroadcastReceiver对象。 任一时间下仅有少数进程会处于前台仅当内存实在无法供给它们维持同时运行时才会被杀死。一般来说在这种情况下设备已然处于使用虚拟内存的状态必须要杀死一些前台进程以用户界面保持响应。 2.         可视进程没有前台组件但仍可被用户在屏幕上所见。当满足如下任一条件时进程被认为是可视的 l  它包含着一个不在前台但仍然为用户可见的activity它的onPause()方法被调用。这种情况可能出现在以下情况比如说前台activity是一个对话框而之前的activity位于其下并可以看到。 l  它包含了一个绑定至一个可视的activity的服务。 可视进程依然被视为是很重要的非到不杀死它们便无法维持前台进程运行时才会被杀死。 3.         服务进程是由 startService() 方法启动的服务它不会变成上述两类。尽管服务进程不会直接为用户所见但它们一般都在做着用户所关心的事情比如在后台播放mp3或者从网上下载东西。所以系统会尽量维持它们的运行除非系统内存不足以维持前台进程和可视进程的运行需要。 4.         背景进程包含目前不为用户所见的activityActivity对象的 onStop() 方法已被调用。这些进程与用户体验没有直接的联系可以在任意时间被杀死以回收内存供前台进程、可视进程以及服务进程使用。一般来说会有很多背景进程 运行所以它们一般存放于一个LRU最后使用列表中以确保最后被用户使用的activity最后被杀死。如果一个activity正确的实现了生命周 期方法并捕获了正确的状态则杀死它的进程对用户体验不会有任何不良影响。 5.         空进程不包含任何活动应用程序组件。这种进程存在的唯一原因是做为缓存以改善组件再次于其中运行时的启动时间。系统经常会杀死这种进程以保持进程缓存和系统内核缓存之间的平衡。 Android会依据进程中当前活跃组件的重要程度来尽可能高的估量一个进程的级别。比如说如果一个进程中同时有一个服务和一个可视的activity则进程会被判定为可视进程而不是服务进程。 此外一个进程的级别可能会由于其它进程依赖于它而升高。一个为其它进程提供服务的进程级别永远高于使用它服务的进程。比如说如果A进程中的内容提供者 为进程B中的客户端提供服务或进程A中的服务为进程B中的组件所绑定则A进程最低也会被视为与进程B拥有同样的重要性。 为运行着一个服务的进程重要级别总高于一个背景activity。所以一个activity以启动一个服务的方式启动一个长时间运行过程比简单的衍生一个 线程来进行处理要好。尤其是当处理过程比activity本身存在时间要长的情况之下。我们以背景音乐播放和上传一个相机拍摄的图片至网站上为例。使用服 务则不论activity发生何事都至少可以保证操作拥有“服务进程”的权限。如上一节广播接收器生命周期 所提到的这也正是广播接收器使用服务而不是使用线程来处理耗时任务的原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专业旅游网站开发系统网站子域名查询

1、打开开发的基本配置,成为开发者 2、启用开发者密码 3、看一下自己的公众号id 4、记录自己的AppID、AppSecret

深圳建网站兴田德润实惠西安网站设计建设公司 交通

转载自 干货:排名前 16 的 Java 工具类!在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类。以下工具类、方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目…

四川建设工程网上合同备案网站国外wordpress cms主题

在当今的软件开发领域中,高性能和并发性是很重要的。开发人员需要编写能够有效利用多核处理器的程序,以提高应用程序的性能和响应能力。Go语言(Golang)就是一种在这方面非常强大的编程语言,它提供了一种称为协程&#…

长春吉林建设信息网站现在网站开发用什么环境

AI驱动的市场调研革命:从数据采集到竞品策略生成的闭环实践指南 引言:智能时代的高效市场洞察 Forrester研究显示,使用AI辅助市场调研可使数据采集效率提升8倍,策略生成速度加快4倍。本文以GitHub Sentinel、LanguageMentor为案例,揭示如何构建AI增强型市场分析体系,实现…

快三网站开发中国建材网官方网站

2014秋学期南开大学《Java语言程序设计》在线作业附答案1.下列代码中,将引起一个编译错误的行是(D)。1)public class Test{ 2) int m,n; 3) public Test(){} 4) public Test(inta){ma;} 5) public static void main(String args[]){ 6) Test t1,t2; 7) int j,k;8) j…

网站标题栏怎么修改电子商务网站平台建设前景展望

又和同学肝了半个上午(主要是一二节有课),完成了天气图像识别的第二期练习 一开始几个题不难,挺简单的,到后面出现HOG特征拟合svm模型,HOG提取特征,又是现学内容 HOG特征的维数用cv2.HOGDescrip…

建设官方企业网站汽车之家网页版电脑版

Android 实现圆角图片的简单实例实现效果图:本来想在网上找个圆角的例子看一看,不尽人意啊,基本都是官方的Demo的那张原理图,稍后会贴出。于是自己自定义了个View,实现图片的圆角以及圆形效果。效果图:Andr…

福州网站建设方案服务道客网站建设推广

刚看了法国传奇女钢琴家埃莱娜格里莫的自传《野变奏》(上海教育出版社出版),很精彩。我有幸收藏到她几张原版的唱片,经常会拿出来听听。她是我喜欢的哈斯基尔、阿格里奇和皮雷斯等女钢琴家之后,我所知道的最年轻的女钢…

企业为什么做网站优化推广哪个网站做加盟

写这个程序的时候,我已学习Python将近有一百个小时,在CSDN上看到有人求助使用Python如何写一个自动售饮料的程序,我一想,试试写一个实用的售货程序。当然,只是实现基本功能,欢迎高手指点,新手学…

旅游网站的建设开题报告wordpress所有函数

JavaScript中的数组创建 本文转载自:众成翻译 译者:loveky 链接:http://www.zcfy.cc/article/713 原文:http://rainsoft.io/power-up-the-array-creation-in-javascript/ 数组是一个包含了对象或原始类型的有序集合。很难想象一个…

如何做自己的淘宝优惠券网站网站代运营合同

项目介绍 一款由jspssmmysql实现的图书馆预约占座管理系统,前端采用的是当下最流行的easyui框架,后台用的ssm(spring、springMVC、mybaits)框架.添加学生和教师时会自动在用户表中注册,定时任务会定时生成座位信息&am…

效果营销型网站建设长沙建网站速成班

Fireworks 题意: 你每做一个烟花要n分钟,释放已做好的所有烟花需要m分钟,每只烟花成功释放的概率为p。问你在采取最优策略的前提下,直到成功释放第一个烟花时最小的期望时间花费。 题解: 最佳策略是:每…

网站建设工作室 怎么样产品关键词怎么找

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

php网站开发与设计域名 删除 wordpress

桥接模式:连接抽象与实现的设计艺术 在软件开发中,设计模式是帮助我们以优雅的方式解决问题的模板。桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目标是将抽象部分与实现部分分离,这样两者可以…

国外设计网站网站会员权限

计算属性 Computed 一般是对某个响应式数据进行加工处理获得新数据 侦听器 watch 监视某个响应式数据,如果它发生变化,就自动调用某个函数

百度移动网站检测柚皮子wordpress主题

目录 netstat pidof UDP协议 TCP协议 TCP协议段格式 TCP协议的相关机制 确认应答(ACK)机制 超时重传机制 连接管理机制 服务端状态转换 客户端状态转化 流量控制 流量控制常见问题: 滑动窗口 拥塞控制 延迟应答 面向字节流…

php网站搬家软件网站建设专业书入门

1.概述 Android 应用程序包含了工程文件、代码和各种资源,主要由 Java 语言编写,每一个应用程序将被编译成Android 的一个 Java 应用程序包(*.apk)。 由于 Android 系统本身是基于 Linux 操作系统运行的,因此 …

深圳网站建设哪家强建设网站是不是要买服务器

使用的环境条件不当可能会损坏设备。 保护设备,防止灰尘、湿气和热量进入。 使用注意事项: 空气流通不畅 设备安装不正确会阻碍设备内的空气流通,从而导致过热和功能受损。 只能按所示方向将设备安装在相应的壁上。 该设备设计用于安装在…

那种自行提取卡密的网站怎么做济南品牌网站建设介绍

一年之计在于春,每年的三、四月,都是个人创业最佳的起步阶段,也是企业采购最火热的时期。为了降低用户的上云成本,让大家能无门槛享受到优质高性能的云服务,比格云从3月16日起,将上线“充值30天内&#xff…

网站开发涉及技术张梅 合肥网站建设

【背景】 flink有几种聚合,使用上是有一些不同,需要加以区分: 分组聚合:group agg over聚合:over agg 窗口聚合:window agg 省流版: 触发计算时机 结果流类型 状态大小 分组聚合group ag…