如果您对PHP:应用程序框架问题(待讨论)感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于PHP:应用程序框架问题(待讨论)的详细内容,我们还将为您解答php应用程序的相关问
如果您对PHP:应用程序框架问题(待讨论)感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于PHP:应用程序框架问题(待讨论)的详细内容,我们还将为您解答php 应用程序的相关问题,并且为您提供关于#HarmonyOS小课堂# 速览
- PHP:应用程序框架问题(待讨论)(php 应用程序)
- #HarmonyOS小课堂# 速览
课程精华第二期:应用程序框架 - android – PhoneGap:应用程序崩溃拍摄肖像照片
- Android 应用程序框架之无边界设计意图
- Android 应用程序模型:应用程序,任务,进程,线程
PHP:应用程序框架问题(待讨论)(php 应用程序)
问题是,我越是深入了解它就越不明白我为什么要使用这个框架.所以,那里的核心开发人员,与我讨论,或帮助我理解以下内容:
我确实理解,从长远来看,应用程序框架可以帮助更快地部署代码,或者更快地编写代码.但是,可以理解的是,这些框架的局限性在于您必须根据框架的标准进行编码吗?我越来越多地尝试使用CakePHP,这几乎就像我必须在实际的编程语言之上学习框架语言/标准.例如,我必须学习CakePHP的标准和实现“更快”部署和解释的方法,但我也尝试编写PHP标准(这有点内置于CakePHP中),但总的来说,这就是我的意思.我看到了.对我来说这有点开销,但如果你知道CakePHP或你选择的框架,这没什么,因为你可能知道如何编写你的框架代码?
另一个问题或讨论是,作为一方的开发人员和喜欢MVC方法的人,但实际上并不知道如何使用框架实现它,最好的方法是以同样的方式编写代码(通过函数)文件),制作我自己的功能等,还要使用MVC技术?我的意思是,不是学习应用程序框架,而是应该将内容样式与函数等分开,比如MVC工作,但是使用我自己的函数,或者我应该学习应用程序框架.
注意:我可能会错误地使用应用程序框架,但我不确定.此外,这本来是一个讨论而不是咆哮;我不知道我不知道的是什么,所以我实际上正在寻求一些澄清.
谢谢!
解决方法
就像框架一样 – 汽车就是框架.
通过整个框架,它们可用于简化和加快开发过程.要应用DRY原则,为您提供强大的基本工具(文本处理,输入管理,表单验证,电子邮件和会话处理等),以便您可以立即处理它们,阻止您重新发明轮子.我很乐意使用框架,但是一旦我掌握了它,根据我的经验,这是我无法放弃的.
我不认为这是一个限制(因为它们是可扩展的),我认为它更像是一种“个人标准” – 这种应用程序的编写方式就像你在创建自己的库时所做的那样.一旦你了解并喜欢你的框架,这种开销就会神奇地消失.
关于MVC,我不会使用“应该”这个词,但它绝对是一个不错的选择,无论你做什么 – 如果你使用框架,很棒,如果你不使用,但你将业务逻辑与内容,太棒了!这一切都是为了让你感觉舒服. Grid Frameworks,CSS Resets,库使用等等都会发生同样的事情 – 这是一个选择问题.我的是什么?使用这些工具是因为它们可供您使用并制作健壮的应用程序和网站.他们经过一遍又一遍的测试,他们工作,他们帮助你不重复自己或重新发明轮子(这已经做了一千次). MVC对于可扩展性和维护也很有用.
我的建议是学习框架.有一个原因你选择Cake over Codeigniter(不知道为什么,虽然 – Codeigniter用户在这里!),所以坚持下去,并使用它一段时间.它们都很强大,但是从开始就不能完全看到它们的全部潜力.
此外,最后一件事:由于所有应用程序都有准时用途,因此无论如何都会创建您的库,而这些框架使得创建,使用和保存它们变得非常容易.因此,您可以使用框架的所有后端功能混合所有这些功能.
继续努力 – 你不会后悔的!
不过我的两分钱.
#HarmonyOS小课堂# 速览 课程精华第二期:应用程序框架
#HarmonyOS小课堂# 从“0”开始走进HarmonyOS应用开发
了解3.1版本 #HarmonyOS第一课# 第二期精彩内容
应用程序入口和系统调度单元Ability
回顾了解3.1版本 #HarmonyOS第一课# 第一期精彩内容
继续了解3.1版本 #HarmonyOS第一课# 第三期精彩内容
点击学习#HarmonyOS第一课# 完整版课程
与华为开发者联盟学堂携手筑建鸿蒙世界,从“0”开始走进HarmonyOS应用开发
android – PhoneGap:应用程序崩溃拍摄肖像照片
如果我在横向模式下拍摄照片,但在拍摄人像照片时会崩溃应用程序,这种效果很好.正如您从下面的代码片段中看到的那样,我使用了correctOrientation参数来尝试在拍摄照片后定位照片.如果没有此参数,应用程序不会崩溃,但是在显示时照片的方向错误.
现在我正在索尼XPERIA安卓手机上测试这个.
这是负责这项工作的代码.
function onPhotoFail(message) { alert(''Failed because: '' + message); } function onPhotoSuccess(imageURI) { var $image = $("img#upload-image"); $image.attr("src",imageURI); } function capturePhoto() { navigator.camera.getPicture(onPhotoSuccess,onPhotoFail,{ quality: 50,destinationType: Camera.DestinationType.FILE_URI,correctOrientation: true }); }
这是堆栈跟踪:
E/AndroidRuntime(31760): FATAL EXCEPTION: main E/AndroidRuntime(31760): java.lang.OutOfMemoryError: bitmap size exceeds VM budget E/AndroidRuntime(31760): at android.graphics.Bitmap.nativeCreate(Native Method) E/AndroidRuntime(31760): at android.graphics.Bitmap.createBitmap(Bitmap.java:477) E/AndroidRuntime(31760): at android.graphics.Bitmap.createBitmap(Bitmap.java:444) E/AndroidRuntime(31760): at org.apache.cordova.CameraLauncher.getRotatedBitmap(CameraLauncher.java:483) E/AndroidRuntime(31760): at org.apache.cordova.CameraLauncher.onActivityResult(CameraLauncher.java:326) E/AndroidRuntime(31760): at org.apache.cordova.DroidGap.onActivityResult(DroidGap.java:823) E/AndroidRuntime(31760): at android.app.Activity.dispatchActivityResult(Activity.java:3908) E/AndroidRuntime(31760): at android.app.ActivityThread.deliverResults(ActivityThread.java:2549) E/AndroidRuntime(31760): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2595) E/AndroidRuntime(31760): at android.app.ActivityThread.access$2000(ActivityThread.java:121) E/AndroidRuntime(31760): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:973) E/AndroidRuntime(31760): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(31760): at android.os.Looper.loop(Looper.java:130) E/AndroidRuntime(31760): at android.app.ActivityThread.main(ActivityThread.java:3701) E/AndroidRuntime(31760): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(31760): at java.lang.reflect.Method.invoke(Method.java:507) E/AndroidRuntime(31760): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) E/AndroidRuntime(31760): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) E/AndroidRuntime(31760): at dalvik.system.NativeStart.main(Native Method)
我做了一些搜索,我没有看到任何人有这个问题.任何帮助表示赞赏
解决方法
我现在唯一的建议是尝试将质量切换为100.我知道这听起来有点反直觉,但它可以防止在后台进行同样多的处理.
您可以阅读我的博客文章,谈论相机的一些问题:
http://simonmacdonald.blogspot.ca/2012/07/change-to-camera-code-in-phonegap-190.html
此外,如果我能看到堆栈跟踪,它会有所帮助.
Android 应用程序框架之无边界设计意图
Android 的应用框架的外特性空间的描述在 SDK 文档有十分清楚的描述,Android 应用的基本概念,组件生命周期等等有详细的描述。在外特性空间中,Android 提供了 Activity,Service,Broadcast receivers,Content Provider,Intent,task 等概念,我在这里不讨论这些概念定义,因为 SDK 文档已经讲得够详细。
在阅读 SDK 文档和研究 Activity 这个概念时,我感觉到了在 Android 中若隐若现的 Android 自由无边界这个设计意图。Android 的应用只是一个虚的概念,并没有实际的入口,这个不像 Window 平台上的应用程序的概念,Android 更多的是提供组件(Components)的概念。为什么要虚化应用的概念?我想这个虚化就是自由无边界设计意图的直接体现。突出请求和服务,突出组件个体,弱化边界,系统的各个组件可以自由的无边界的交流,服务请求者直接发出请求,不论这个对象在何处和属于谁的,组件是自由独立的个体,一个应用程序可以直接请求使用其他的应用的的组件,这个是 Android 应用框架设计的核心理念,其他的一切都是在为这个核心理念服务。
让程序员忽略应用的概念,甚至彻底的抛弃进程这样的概念,程序员看到的就是一个一个的组件,应用程序员利用这些组件来架构成一个所谓的应用,那么设计者首先要考虑的是什么呢?我想应该是一个抽象的应用模型,在这个模型下产生概念和接口。
我们知道 MicroSoft 提出了 Application,Windows 的概念,有前景应用(Foreground Application)概念,MicroSoft 的应用模型中用户交互则完全交给了 Window,各种界面的呈现都是属于这个应用的是孤立的,应用程序之间的各个构成对象不能相互访问,最多提供一个进程间通讯机制,那个也是应用程序层面的。虽然 Microsoft 后来也提出了组件,分布式组件等概念,但是这些不是根植在 Windows 系统中,而 Android 则是彻底的组件化思想构建,一开始的应用程序概念就是 Activity,Service,Broadcast receivers,Content Provider,Intent,Task。这些概念体现了一个人机交互的模型本质:
- 界面呈现
- 发起请求,响应请求
- 内容交互
- 消息接收处理
Activity 是 Android 应用的核心概念,简而言之 Activity 为用户交互管理者,有一个可视界面呈现,而 Service 跟 Activity 的区别是他在后台运行,没有界面呈现。而 Intent 的意义是意图,他在 Android 的概念空间中,代表消息,这个消息代表了请求的意图。
Activity 可以到处存在,提供服务,消除空间差别,Activity 是一个独立的个体,更能表现面向对象的实质。这个个体需要接受另外的个体的消息,可以随时发起对另外一个个体的请求。个体是自由的,Android 中你可以开始一个 Activity,但是没有权利消灭一个 Activity,这是个体权利的体现,个体的消灭是由系统决定的,这个就是 Android 中 Activity 蕴含的人文意义。
原文来自 http://blog.csdn.net/maxleng/article/details/5618698
Android 应用程序模型:应用程序,任务,进程,线程
Android 应用程序模型:应用程序,任务,进程和线程
大多数操作系统,在应用程序所寄存的可执行程序映像(如 Windows 系统里的.exe)、它所运行的进程以及和用户交互的图标和应用之间有一种严格的 1 对 1 关系。在 Android 系统里,这些关联要松散得多。并且重要的是要理解各种概念怎么样组成整体。
由于 Android 应用固有的灵活性,当实现这些不同方面的时候有一些基本术语需要加以理解:
一个 Android 包 (.apk)文件,其中包含一个应用程序的代码和资源。这是应用程序分发和下载的文件,用户用来安装该应用程序在他们的设备上。
一个任务一般而言是指用户视为的一个可启动应用程序:通常任务在桌面(home screen)有一个可访问的图标,且可以被切换到前台。
一个进程是一个运行着应用程序代码的底层核心过程。通常所有.apk 里的代码运行在一个专有的进程里。不过,进程标记也可以用来限定代码运行位置,或者为整个.apk 或者为个别的活动 activity,接收者 receiver,服务或提供者 provider,组件。
任务
这里的一个关键点是:当用户看到一个 “应用” 时,他们实际上在和任务打交道。如果您刚刚创建一个包含若干活动的.apk,其中之一是顶层入口点(通过动作 android.intent.action.MAIN 的意图过滤器 intent-filter 和类别 android.intent.category.LAUNCHER),那么这事实上将为您的.apk 创建一个任务,并且您从那儿起动的任何活动都将作为那个任务的一部分运行。
一个任务,那么,从用户的角度来看是您的应用程序;而从应用程序开发者的角度来看,它是一个或多个用户在那个任务中已经经历过且未关闭的活动,或者说是一个活动栈。一个新的任务通过以 Intent.FLAG_ACTIVITY_NEW_TASK 标志起动一个活动意图来创建;这一意图将被用来作为任务的根意图,定义任务是什么。任何不以这个标志起动的活动将和起动它的活动在相同的任务中运行(除非该活动已请求特别启动模式,稍后会讨论)。任务可以被重新安排:如果您使用 FLAG_ACTIVITY_NEW_TASK 标志但已经有一个任务以这个意图运行,则当前任务的活动栈将被切换到前台而不是开始一个新的任务。
FLAG_ACTIVITY_NEW_TASK 必须谨慎使用:使用它意味着,在用户看来,一个新的应用程序由此起动。如果这不是你所期望的行为,你就不该去创建一个新的任务。另外,仅在用户可以从桌面返回到他原来的地方和以一个新任务启动相同意图的情况下,你才应该使用新的任务标记。否则,如果用户在你已经启动的任务里按桌面(HOME)键,而不是返回(BACK)键,你的任务及其活动将被放置到桌面后面,没有办法再切换回去。
任务共用性 Affinity
在某些情况下,Android 需要知道一个活动属于哪个任务即使它没有被启动到一个具体的任务里。这是通过任务共用性(Affinities)完成的。任务共用性(Affinities)为这个运行一个或多个活动的任务提供了一个独特的静态名称,默认的一个活动的任务共用性(Affinity)是实现了该活动的.apk 包的名字。这提供了预期的标准特性,即所有在一个特定的.apk 包里的活动是单个用户应用程序的一部分。
当开始一个没有 Intent.FLAG_ACTIVITY_NEW_TASK 标志的活动时,任务共用性 affinities 不会影响将会运行该新活动的任务:它总是运行在启动它的任务里。但是,如果使用了 NEW_TASK 标志,那么共用性(affinity)将被用来判断是否已经存在一个有相同共用性(affinity)的任务。如果是这样,这项任务将被切换到前面而新的活动会启动于这个任务的顶层。
这种特性在您必须使用 NEW_TASK 标志的情况下最有用,尤其是从状态栏通知或桌面快捷方式启动活动时。结果是,当用户用这种方式启动您的应用程序时,它的当前任务将被切换到前台,而且想要查看的活动被放在最上面。
你可以在程序清单(Manifest)文件的应用程序 application 标签中为.apk 包中所有的活动分配你自己的任务共用性 Affinites,或者在活动标记中为各个活动进行分配。一些说明其如何使用的例子如下:
如果您的.apk 包含多个用户可以启动的高层应用程序,那么您可能需要对用户看到的每个活动指定不同的 affinities。一个不错的命名惯例是以附加一个以冒号分隔的字符串来扩展您的.apk 包名。例如,“com.android.contacts”.apk 可以有 affinities:“com.android.contacts:Dialer” 和 “ com.android.contacts:ContactsList”。
如果您正在替换一个通知,快捷方式,或其他可以从外部发起的应用程序的 “内部” 活动,你可能需要明确设定您替代活动的 taskAffinity 和您准备替代的应用程序一样。例如,如果您想替换 contacts 详细信息视图(用户可以创建并调用快捷方式),你得把 taskAffinity 设置成 “com.android.contacts”。
启动模式和启动标志
您控制活动和任务交互的主要途径是通过活动的 launchMode 属性和意图相关的标志 flags。这两个参数可以以各种方式合作来控制活动启动的结果,正如它们相关文档中描述的那样。在这里,我们将看看一些常见的用例和参数组合。
你将使用的最常见的启动模式(除了默认的 standard 模式)是 singleTop。这并不影响任务;它只是避免多次在一个堆栈顶部起动同一活动。
singleTask 启动模式对任务有重大的影响:它使活动始终是开始于一项新的任务(或其现有的任务被带到前台) 。使用这种模式需要谨慎对待你如何与系统其他部分进行交互,因为这影响到这个活动中的每一个路径。它应当仅在活动处于应用程序前台时使用(也就是支持 MAIN 动作和 LAUNCHER 类别)。
singleInstance 启动模式更是专业,并应仅用于整个就是被实现为一个活动的应用程序中。
有一种你会经常遇到的情况是当另一个实体(如 SearchManager 或 NotificationManager)开始您的一个活动。在这种情况下,必须使用 Intent.FLAG_ACTIVITY_NEW_TASK 标签,因为该项活动是在任务之外起动的(而且应用 / 任务可能根本不存在)。正如前面所述,这种情况下的标准行为是把匹配新活动 affinity 的任务带到前台和在此之上起动新的活动。不过,也有其他您可以实施的行为类型。
其中一种常见的做法是,还可以使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 国旗与 NEW_TASK 。通过这样做,如果你的任务已经运行,那么将提请前景,所有的活动,其堆栈清除除根系活力和根系活力的 onNewIntent (意图) 所谓的意图正在开始。请注意,该活动还常常使用 singleTop 或 singleTask 发射模式时,使用这种方法,因此,目前的情况是由于新的意图而不需要将它摧毁,一个新的实例开始。
一种通常的办法是和 NEW_TASK 联合起来使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 标志。这样,如果您的任务已经运行,那么它将会被带到前台,除根活动外其它所有堆栈中的活动都被清除,而且这个根活动的方法 onNewIntent (Intent) 会在该意图起动时被调用。注意这个活动使用这个方法时经常使用 singleTop 或者 singleTask 起动模式,这样当前实例被赋予新的意图而不是需要销毁它然后重新起动一个新的实例。
您能采取的另外的方法是设置通知活动的任务 affinity 为空字符串 “”(表示没有 affinity),并设置 finishOnBackground 属性。这种方法是有用的如果你希望这个通知把用户带到一个单独的描述它的活动中,而不是返回到应用程序的任务。通过指定这个属性,该活动将被结束不管用户通过 BACK 还是 HOME 离开它;如果这个属性没有指定,按首页将导致这个活动及其任务仍保留在系统里,且可能没有办法返回它。
请务必阅读关于 launchMode 属性和 Intent 标志的文档以获取这些选项的详细说明。
进程
在 Android 里,进程完全是应用的实现细节,而不是用户通常了解的那样。其主要用途就是:
通过安置不受信任的或不稳定的代码到另一个进程来提高稳定性或安全性。
通过在同一进程里运行多个.apks 的代码来减少开销。
通过把重量级代码放在单独的进程中来帮助系统管理资源,该进程可以在不影响应用程序其他部分的情况下被终止。
正如前面所述,这个进程属性用来控制运行着特定应用程序组件的进程,注意,此属性不能用于违反系统安全性:如果有两个不共享相同用户 ID 的.apks 尝试运行在同一进程中,这将不会被允许,相反会为它们每一个创建不同的进程。
参见安全 文档以获取更多关于安全限制方面的信息。
线程
每个进程包含一个或多个线程。多数情况下,Android 避免在进程里创建额外的线程,以保持应用程序单线程,除非它创建自己的线程。一个重要的结果就是所有对活动 Activity,广播接收器 BroadcastReceiver 以及服务 Service 实例的调用都是由这个进程的主线程创建的。
注意新的线程并不会为每个活动,广播接收器,服务或者内容提供器(ContentProvider)实例而创建:这些应用程序的组件在进程里被实例化(除非另有说明,都在同一个进程处理),实际上是进程的主线程。这说明当被系统调用时没有哪个组件(包括服务)会进行远程或者阻塞操作(就像网络调用或者计算循环),因为这将阻止进程中的所有其他组件。你可以使用标准的线程类 Thread 或者 Android 的 HandlerThread 便捷类去对其它线程执行远程操作。
这里有一些关于这个线程规则的重要的例外:
・ 对 IBinder 或者 IBinder 实现的接口的调用由调用线程或本地进程的线程池(如果该呼叫来自其他进程)分发,而不是它们的进程的主线程。特殊情况下,一个服务的 IBinder 可以这样调用。(尽管调用服务里的方法已经在主线程里完成。)这意味着 IBinder 接口的实现必须要有一种线程安全的方法,这样任意线程才能同时访问它。
・ 对 ContentProvider 主要方法的调用由调用线程或者主线程分发,如同 IBinder 一样。被指定的方法在内容提供器的类里有记录。这意味着实现这些方法必须要有一种线程安全的模式,这样任意其它线程可以同时访问它。
・ 视图及其子类中的调用由正在运行着视图的线程产生。通常情况下,这会被作为进程的主线程,如果你创建一个线程并显示一个窗口,那么继承的窗口视图将从那个线程里启动。
本文来自 CSDN 博客,转载请标明出处:http://blog.csdn.net/iefreer/archive/2009/08/18/4460196.aspx
关于PHP:应用程序框架问题(待讨论)和php 应用程序的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于#HarmonyOS小课堂# 速览
本文标签: