概要 运行期类型信息(RTTI)是一种语言特征,能使应用程序在运行时得到关于对象的信息。 RTTI是Delphi的组件能够融合到IDE中的关键。它在IDE中不仅仅是一个纯学术的过程。...假定把AnObject看成是一个TEdit派生类型,并想要改变它所包含的文本,用下列代码: (AnObject as Tedit).text := 'wudi_1982'; 能用比较运算符来判断两个对象是否是相兼容的类型...第一个地方是DELPHI的IDE,这在前面已提到过。通过RTTI,IDE就会知道你正在使用的对象和组件的任何事情。实际上,不只是RTTI,但为了这个讨论,我们只谈RTTI方面。...窗体文件如下:代码如下: object Form1: TForm1 Left = 150 Top = 161 Width = 639 Height = 372 Caption = '...= -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch
2.2 编写MyService代码覆写 onCreate()、onStartCommand()、onDestroy() 函数,这里我们对这些函数分别加上日志;函数 onBind() 暂时不做处理。...3.2 编写 MainActivity,注册监听事件打开MainActivity,为刚才增加的按钮注册点击事件监听,Java 代码 protected void onCreate(Bundle savedInstanceState...运行项目4.1 点击运行项目:4.2 点击“start”按钮,启动Service,查看日志:可以看到点击启动按钮后,MyService被启动,onCreate()、onStartCommand() 函数被调用...4.4 接着点击“start”按钮,多次启动Service看到日志:每点击一次“start”按钮,就会调用一次 Activity的 startService()函数,同时会调用一次MyService的...Service只在第一次创建启动的时候调用onCreate()函数,只要该Service还在运行,就不会再次触发onCreate()函数;onStartCommand()函数则在每次启动Service的时候都会调用
:二者的作用都是让业务代码在主线程中执行,差别: Synchronize是阻塞,Queue是非阻塞 代码上 两个方法最终都是调用的 class procedure TThread.Synchronize...则是使用了Thread对象中的FSynchronize对象变量,然后QueueEvent为False来调用TThread.Synchronize类方法, 内部在执行FSynchronize时,创建了事件对象...----------------------------------------------------- Delphi中多线程用Synchronize实现VCL数据同步显示,Delphi中多线程用Synchronize...在类的Execute中只须调用Synchronize就可以了。 实现: 关键在于对Synchronize参数的定义。...主程的设计与《Delphi中多线程用消息实现VCL数据同步显示》基本一致,但为了与其显示相同结果,在生成子线程中语句顺序作了一下调整。以下代码仅显示与上一篇不同的一个过程,其它代码不再赘述。
6.事件(Event):在Windows系统中,事件就是消息。...主要包含8个部分:菜单栏、工具栏、组件面板、窗体设计器、代码编辑器、对象查看器、对象树形查看器、代码浏览器 2.2菜单栏(Main Menu) 菜单栏提供了Delphi6集成开发环境的所有功能。...菜单栏除包含标准Windows程序通常所具有的[File]、[Edit]、[Help]菜单外,还有一些与Delphi6项目、运行、辅助工具和环境配置等相关的菜单。 1....Form/Unit】:切换窗体窗口和单元文件窗口 【Units】:用于打开项目中所用到的单元文件 【Forms】:用于打开项目中所用到的窗体 【Toolbars】:调整主窗口下的工具栏 5....【Run】菜单 主要完成程序的运行、调试有关功能 【Run】:编译并运行当前的项目 【Program Pause】:程序暂停执行 【Programe Reset】:结束当前程序的执行,返回Delphi6
每一次转化都会触发以上方法处理程序。 · 完整生存期:对onCreate()的第一次调用和对onDestroy()的最后一次调用之间的时间范围。...使用onCreate方法初始化Activity,如果Activity意外终止,onCreate方法接受一个包含UI状态的Bundle对象,该对象是在最后一次调用onSaveInstanceState时保存的...应该使用这个Bundle将UI恢复为上一次的状态,既可以通过onCreate方法也可以重写onRestoreInstanceState。 ...如果Activity是有规律的创建相同的对象集,可以考虑在onCreate创建,因为onCreate只在Activity生存期调用一次。 · 可见生存期:onStart和onStop之见的时间。...onRestart在除了对onStart方法的第一次调用之外的所有方法之前被立即调用。可以用它完程只有当Activity在它的完整生存期之内重启时才能完成的特殊处理。
默认情况下,每个apk运行在它自己的Linux进程中。当需要执行应用程序中的代码时,Android会启动一个jvm,即一个新的进程来执行,因此不同的apk运行在相互隔离的环境中。...android.process.acore(Home) … … kthreadd进程(2号进程),父进程为0号进程,是内核进程,其他内核进程都是直接或者间接以它为父进程 Android的单线程模型 当一个程序第一次启动时...,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。...Android在第一次启动程序时会默认会为UI thread创建一个关联的消息队列,可以通过Looper.myQueue()得到当前线程的消息队列,用来管理程序的一些上层组件,activities,broadcast...使用时需要遵循以下规则: 1)Task的实例必须在UI thread中创建 2)execute方法必须在UI thread中调用 3)不要手动的调用这些方法,只调用execute即可 4)该task只能被执行一次
onCreate只运行一次,应该在onCreate中初始化用户界面相关的内容 一个正在运行的应用遇到如下情况时将会暂停(执行onPause),当一个半透明的Activity打开时,比如,某个后台服务弹出了一个对话框...onDestroy可能不会执行 虽然在此之前,onPause会执行,但是耗时的操作还是应该写在这里 当Activity再次启动时 虽然onRestart会执行,但是恢复资源的操作应该写在onStart里面 因为第一次启动...都会得到这些信息 •onCreate在第一次创建时也会执行 •数据的恢复任务应该在onCreate写更好 有时候,系统为了获得足够的内存会销毁后台的Activity 比如横竖屏切换时 销毁时...都会得到这些信息 lonCreate在第一次创建时也会执行 所以数据的恢复任务应该在onCreate写更好 ListActivity是一个默认包含一个ListView的Activity 写一个类继承ListActivity...getListView可以获得ListView的对象 调用其中的setEmptyView的方法可以设置ListView为空时的显示视图 ListActivity默认注册了OnItemClickListener 需要处理事件时只需要覆盖
onCreate只运行一次,应该在onCreate中初始化用户界面相关的内容 一个正在运行的应用遇到如下情况时将会暂停(执行onPause),当一个半透明的Activity打开时,比如,某个后台服务弹出了一个对话框...虽然在此之前,onPause会执行,但是耗时的操作还是应该写在这里 当Activity再次启动时 虽然onRestart会执行,但是恢复资源的操作应该写在onStart里面 因为第一次启动...都会得到这些信息 •onCreate在第一次创建时也会执行 •数据的恢复任务应该在onCreate写更好...都会得到这些信息 lonCreate在第一次创建时也会执行 所以数据的恢复任务应该在onCreate写更好 ListActivity是一个默认包含一个ListView的Activity...ListView的对象 调用其中的setEmptyView的方法可以设置ListView为空时的显示视图 ListActivity默认注册了OnItemClickListener 需要处理事件时只需要覆盖
System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中 的Timer控件,内部使用API SetTimer实现的...它要求用户代码提供 UI 消息泵, 并且始终从同一线程操作, 或将调用封送到 其他线程。...事件; t.Start(); //启动定时器 //上面初始化代码可以写到构造函数中 public void Execute(object source, System.Timers.ElapsedEventArgs...System.Threading.Timer 线程计时器也不依赖窗体,是一种简单的、轻量级计时器,它使用回调方法而不是使用事件,并由线程池线程提供支持,先看下面代码 class Program {...string)state, ++TimesCalled); } static void Main(string[] args) { Program p = new Program(); //2秒后第一次调用
TODO Auto-generated method stub super.onDestroy(); System.out.println("onDestroy"); } } 运行部署下代码到模拟器上...1.void onCreate(Bundle savedInstanceState) 当activity被第一次加载时执行onCreate()事件,当启动一个程序的时候,其主窗体的onCreate事件就会被执行...这个时候logcat只打印了一行,执行了onStop()事件 接下来我们再返回这个应用程序: ? 如上操作,我们可以看到这样的结果: ?...下次进入该应用程序的时候onCreate()事件不会再被执行,也就是说在一个activity完整事件中,onCreate()事件只会被执行一次。...,什么时候结束执行, 接下来还有一个函数的执行没有看到,那就是onPause()事件 看了下源代码,原来我没有把这个函数重载,哈哈哈,我说怎么没有找到这个函数呢 这里就不再重做了, onPause()事件是当窗体被交换到后台时执行
()不会执行onCreate()方法,只执行onStartCommand()方法。...也就是说,onCreate()只会在第一次创建service时候调用,多次执行startService()不会重复调用onCreate(),此方法适合完成一些初始化工作。...,那么第一次点击的时候回执行其中的 onCreate()跟 onStartCommand()方法,但是当我们第二次点击的时候就只会执行 onStartCommand()方法。...这是由于 onCreate()方法只会在 Service第一次被创建的时候调用,如果当前 Service已经被创建过了(第一次点击创建了 MyService),不管怎样调用 startService()...当然,现在 Activity和 Service其实还没关联起来了呢,这个功能是在Bind Service按钮的点击事件里完成的。
前言 现在第三方支付的接口签名机制都是模仿微信签名方式,把参数按ascii码进行排序后再加上key进行md5的加密,前两天因为做Delphi的接口,所以写了一篇《Delphi对TStrings进行排序》...核心代码 ---- /// /// 获取签名 /// /// 代码里的实现步骤: 定义生成的List(new List()) 把传入进来的泛型类的属性生数组,然后再插入到我们的List里面(List.add(...然后我们在Form窗体里面加入左边加入一个TextBox,起名为tbShow用于显示生成的结果,再设置商品资料和用户信息对应的输入文本框,加上两个生成的签名按钮 ?...在Form1.cs里面先把我们转换的核心代码写进去 ? ? 然后Button1事件写商品资料生成的方法 ? ? Button2写用户信息生成的方法 ? 运行结果 ?
tips: action = 0 为 DOWN 事件 action = 1 为 UP 事件 action = 2 为 MOVE 事件 运行程序,我们执行一次单击,一次长按单击,然后双击一次,发下打印日志如下...: //第一次单击 TestGestureDetector: onDown: action = 0 TestGestureDetector: onShowPress: TestGestureDetector...修改上述代码如下,只贴出修改的部分, public class TestGestureDetector extends View implements GestureDetector.OnGestureListener...,在执行一次单击,一次长按单击和一次双击,日志如下: //第一次单击 TestGestureDetector: onDown: action = 0 TestGestureDetector: onSingleTapUp...: 1 TestGestureDetector: onSingleTapConfirmed: action = 0 //第一次长按单击 TestGestureDetector: onDown: action
下面要进行的就是实际的程序编写了,请打开Borland Delphi 5。 在缺省的Form1上放置这样一些控件(控件的位置就不用俺再罗嗦了吧?)...点击run按钮之后,这个简单的程序就运行了。 ...在Form增加如下控件:一个Tquery、一个Tbutton、4个Tlabel、2个Tedit。...最后将DataSourse1的DataSet属性改为query1(此时Table1控件可以从Form上去掉了)。 ...一般来讲,在一个MIS系统分析、设计、测试和试运行阶段,因为数据量较小,设计人员和测试人员往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力
冷启动 冷启动是指应用从头开始:冷启动发生在设备启动后第一次启动应用程序 (Zygote>fork>app) ,或系统关闭应用程序后。 在冷启动开始时,系统有三个任务。...注意:onCreate() 方法对加载时间的影响最大,因为它执行开销最高的工作:加载UI的布局和渲染,以及初始化Activity运行所需的对象。...进程可能还没有被杀死,但应用必须通过调用onCreate()重新创建 Activity。 系统回收了应用的内存,然后用户重新运行应用。应用进程和Activity都需要重新启动。...经过的时间包含以下事件序列: 启动进程。 初始化对象。 创建并初始化Activity。 加载布局。 第一次绘制你的应用程序。...换句话说,你应该只初始化立即需要的对象。不要创建全局静态对象,而是转向单例模式,应用程序只在第一次需要时初始化对象。
卡片常用于嵌入到其他应用(当前被嵌入方即卡片使用方只支持系统应用,例如桌面)中作为其界面显示的一部分,并支持拉起页面、发送消息等基础的交互能力。...src 表示卡片对应的UI代码的完整路径。当为ArkTS卡片时,完整路径需要包含卡片文件的后缀,如:"./ets/widget/pages/WidgetCard.ets"。...postCardAction支持三种事件类型 事件类型 描述 router 会拉起应用,前台会展示页面,会触发应用的onCreate和onNewWant生命周期 call 会拉起应用,但是会在后台的形式运行...当触发router事件时, 如果应用没有在运行,便触发 onCreate事件 如果应用正在运行,便触发onNewWant事件 卡片组件 提前新建好两个页面 pageA和pageB 卡片组件新建两个按钮...,参数中必须携带method属性,用来区分不同的方法 应用EntryAbility在onCreate中,通过 callee来监听不同的method事件 卡片组件 卡片组件触发call事件,参数中必须携带
//处理按键按下事件 } 如果一个活动被暂停或停止,系统可以将它从内存移除,通过要求它结束(通过调用它的finish()方法),或简单地杀掉它的进程。...所有的活动必须要实现onCreate()去做一些初始化的设置,当对象第一次实例化的时候。很多活动也会实现onPause()去提交数据修改或准备停止与用户交互。...有三个嵌套的循环,你可以通过这七个方法监视: 活动的整个生命时间,从第一次调用onCreate()开始直到调用onDestroy()结束。...举例来说,有一个线程运行在后台从网络上下载数据,它可能会在onCreate()中创建线程,在onDestroy()中结束线程。...Service是在后台运行的,没有交互的界面 使用Service的好处是可以同时运行多个任务,而Activity只能运行一个可交互的界面。
前言 在网上百度就可以看到关于FormCreate,FormShow,FormActivate的讲解和介绍,一般来说执行的顺序为: 1、form1.Create 2、from1.Show 3、form1...我们运行TestDemo.exe程序后 ? 左边是我们要传入的流水格式,其中payamt是我们的付款金额,通过调用动态库后显示出支付界面 ?...代码演示 项目还是我们前章用到的项目《Delphi调用动态链接库》,看一下我们的Trade单元 Trade.dfm界面 ? Trade.pas ?...,如果我们把GetBarCode放在FormShow里面最下面写是不是也可以呢,我们修改一下代码,把FormActivate里的事件都屏蔽 ?...然后在FormShow的事件最后加上GetBarCode函数 ? 然后我们运行程序 ? 可以看到,我们的应付的Trade的交易界面没有显示出来 当我们关闭这个扫描界面后 ?
普通Service特性 1.startService方法启动,不关闭,则一直运行,即使退出了当前Activity 2.基于此可以实现音乐播放器的后台播放 3.基于此结合广播接收者可以实现开屏跳转到指定...onBind(Intent intent) { Log.i(TAG, "onBind"); return null; } @Override//当服务第一次启动的时候调用...IntentFilter(); //[2]创建IntentFilter对象 filter.addAction("android.intent.action.SCREEN_OFF");//[3]添加注册的事件...filter.addAction("android.intent.action.SCREEN_ON"); registerReceiver(receiver, filter);//[4]通过代码的方式注册...ScreenReceiver"; @Override public void onReceive(Context context, Intent intent) { //[1]获取到当前广播的事件类型
参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。...返回值:该方法的返回值机理与键盘响应事件的相同,同样是当已经完整地处理了该事件且不希望其他回调方法再次处理时返回true,否则返回false。...在同一时间,只存在一个Activity实例。...Activity第一启动的时候执行onCreate()---->onStart()---->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(...1.当用户按下HOME键时; 2.长按HOME键,选择运行其他的程序时; 3.按下电源按键(关闭屏幕显示)时; 4.从activity A中启动一个新的activity时; 5.屏幕方向切换时,例如从竖屏切换到横屏时
领取专属 10元无门槛券
手把手带您无忧上云