iOS 安卓的SDK是用什么封装的?一般人是如何开发SDK的

iOS 安卓的SDK是用什么封装的?一般人是如何开发SDK的,第1张

具体来说,可以举个有使用SDK的例子

一、基于Android系统的例子

1、准备工作:

使用Eclipse新建一个Android项目,根据要求提示填写相关信息,然后构建APP框架

2、这里使用的是一个比分SDK,要了解所用的SDK,可获取整个示例工程以及对应的APK安装包进行运行。运行工程可以通过以镇禅坦下两种方式进行运行:

a. 直接安装比分SDK Demo.apk至手机进行运行

b. 在Eclipse中导入并运行比分SDKDemo工程

3、提供应用程序包名和签名,到http://sportsdt.com留言申请应用程序的APP_KEY,得到开放接口。完成后在应用中添加SDK所需要的权限,打开AndroidManifest.xml文件,将SDK需要的权限添加到该文件中即可:

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

4、用一个简单的APP框架,内嵌进去一个御桐现成的比分SDK,就可以达成以下效果:

二、基于IOS系统的例子

1、准备工作:

同上,还是要先创建一个IOS项目,这回使用的是xcode,详细图文可以继续问度娘。

2、引入SMSDK.framework

将所需的SMSDK.framework拷贝到工程所在文件夹下。

在 TARGETS->Build Phases->Link Binary With Libaries中点击“+”按钮,在d出的窗口中点击“Add Other”按钮,选择SMSDK.framework文件添加到工程中。

2、引入所需的第三方库(7M SDK需要在XCode工程引入以下的第三方类库以确保项目能袭闷够正确运行)

通过CocoaPods安装,将以下语句添加进工程的Podfile,然后打开终端在工程目录执行pod install命令,运行[工程名称].xcworkspace,开始工作!

pod 'Reachability'

pod 'Masonry'

pod 'ReactiveCocoa'

pod 'AFNetworking'

pod 'CocoaLumberjack'

pod 'Nimbus/Core', '1.0.0'

pod 'Nimbus/AttributedLabel', '1.0.0'

3、引入资源bundle

需要在Xcode工程中引入SMSDK.bundle,确保SMSDK图片能正常显示

4、环境配置

在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC。

效果如图:

第一次这么认真地回答一个问题,恰好用到了这个SDK,如有做体育项目的朋友也有需要,可自行搜索sportsdt,其他就不多说了。

方法一

使用eclipse导出jar包:我们知道一个java项目是可以用eclipse导出jar包的,安卓工程也一样,只要按普通的方法export就可以了。不过,export出来的包是没大者有混淆过的,如果你要混淆,还需要单独对你的jar包执行一次proguard程序,可参考proguard使用指南。

方法二

使用脚本打包:我个人比较喜欢该方法,因为android工程项目并不是只有JAVA代含裤码,有的资源也需要提供出来,而使脚本可以更加定制化一些。

android的SDK默认提供了一个ant打包的脚本,具体使用方法,可参考之前的BLOG,使用ant打包APK及依赖包最佳解决办法

我们可以看出,打包,最终调用的其谈仿简实是android sdk下的ant脚本,既然安卓已经帮我们写好了ant脚本,我们就好好利用。

使用上面的BLOG中介绍的方法,先在工程目录中生成你的build.xml,然后自己写一个target

<target name="sdk"

depends="-set-release-mode, -release-obfuscation-check, -compile, -post-compile, -obfuscate">

</target>

这段target代码,就是只执行到了混淆的脚本。然后我们在build.xml中选择右键,run as, 第二个ant Build,然后选择要执行的target为我们加上的sdk。

等执行完成后,就会在project/bin/proguard/obfuscated.jar找到你所要的jar包。

什么语句的作用是暂时停止VB程序的运行,将控制权转交给 *** 作系统

doevents

-------------------

在程序中 有一部分代码 需要处理较长的一段时间(不在循环中),使得程序不能做别的 *** 作。请问怎么样使程序交出控制权,进行别的 *** 作?(C# WinForm

线程

-------------------

VC消息

消息的概念可以这样说“在WINDOWS环境派档和中,消息是指从WINDOWS调用的函数传递给应用程序出口函数的固定不变的数据集。”(见书《Microsoft Windows 3 Developer''s Workshop》,Microsoft press,Richard Wilton)。学过SDK编程的人,看到这些话会很清楚的就知道了消息的概念。

如果这个概念看不懂的话,我们可以从另外一个角度来说,先说一点有关与消息的知识,这个很重要,WINDOWS系统中有一个消息系统,有且只有一个,还有很多个消息队列,消息系统能接受到所有的消息,并且它还能够把这个消息发给任何应用程序,应用程序一旦接收到消息(当然应用程序之间也能互相发送消息),如果要对这个消息处理的话,就要对这个消息进行处理,不同的消息会有不同的处理,比如,WM_PAINT消息会通知应用程序要在显示器上输出东西。有些消息,你需要添加另外的程序代码来处理,有些消息,你在VC编程的时候,所产生的程序框架就已经能对它进行处理了,你没必要去写了。

比如,我们用VC建立了一个基本对话框的应用程序,上面有2个按钮,分别是BUTTONA和BUTTONB,点击BUTTONA后,BUTTONB就会隐藏掉。在编程的过程中,你就会对BUTTONA的BN_CLICKED事件进行编程,让BUTTONB隐藏掉,隐藏后上面就没有BUTTONB了,这儿会有一个WM_PAINT消息通知应用程序要重画应用程序的界面,以显示应用程序上面已经没有BUTTIONB按钮了,那个BN_CLICKED事件中就需要我们要添加另外的程序代码,这就是说尘盯,如果我们点击了BUTTONA按钮,消息系统就会接收到BN_CLICKED的消息,并且把它发送给我们建立的程序框架,然后执行我们添加的代码,而那个WM_PAINT事件就不用了,程序的框架会自动进行处理的,我们就不必去多费心了。

相信现在你应该对消息的概念有所了解了,如果还不了解的话,你可以到互联网上查找一些更好的文章,那对你会更有帮助的。

一、引言

随着Windows *** 作系统的不断推广,众多软件开发包都提供有开发基于Windows平台应用软件的功能。虽然这些开发包不尽相同,流行的有Visual C++、Visual Basic、Delphi、C++ Builder 等多种,但由这些不同语言开发的软件有一点却是相同的--都是运行于Windows *** 作平台,都必须接受Windows 的运行机制。作为Windows *** 作系统灵魂的消息机制也就必然为众多用不同语言开发的Windows *** 作系统下运行的应用程序所接受。因此,要编写深入的Windows程序,就必须对Windows的运行机制有很好的认识和理解。本文下面将对Windows *** 作系统下的消息运行机制做较为深入的剖析。

二、Windows事件驱动机制

我们当中不少使用VC、Delphi等作为开发语言的程序员是一步步从DOS下的Basic、C++中走过来的,而且大多在刚开始学习编程时也是先从DOS下的编程环境入手的,因此在习惯了DOS下的过程驱动形式的顺序程序设计方法后,往往在向Windows下的开发环境转型的过程中会对Windows所采取的事件驱动方式感到无法适应。因为DOS和Windows这两种 *** 作系统的运行机制是截然不同的,DOS下的任何程序都是使用顺序的、过程驱动的程序设计方法。这种程序都有一个明显的开始、明显的过程以及一个明显的结束,因此通过程序就能直接控制程序事件或过程的全部顺序。即使是在处理异常时,处理过程也仍然是顺序的、过程驱动的结构。而Windows的驱动方式则是事件驱动的,即程序的流程不是由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,所为一个程序员,在编写程序时,并不知道用户会先按下哪个按纽,也蠢局就不知道程序先触发哪个消息。因此我们的主要任务就是对正在开发的应用程序要发出的或要接收的消息进行排序和管理。事件驱动程序设计是密切围绕消息的产生与处理而展开的,一条消息是关于发生的事件的消息。

三、Windows的消息循环

Windows *** 作系统为每一个正在运行的应用程序保持有一个消息队列。当有事件发生后,Windows并不是将这个激发事件直接送给应用程序,而是先将其翻译成一个Windows消息,然后再把这个消息加入到这个应用程序的消息队列中去。应用程序需要通过消息循环来接收这些消息。在MFC中使用了对WinAPI进行了很好封装的类库,虽然可以为编程提供一个面向对象的界面,使Windows程序员能够以面象对象的方式进行编程,把那些进行SDK编程时最繁琐的部分提供给程序员,使之专注于功能的实现,但是由于引入了很好的封装特性,使我们不能直接 *** 纵部分核心代码。对于消息的循环和接收也只是通过类似于下面的消息映射予以很简单的表示:

BEGIN_MESSAGE_MAP(CTEMMSView, CFormView)

//{{AFX_MSG_MAP(CTEMMSView)

ON_WM_LBUTTONDOWN()

ON_COMMAND(ID_OPENDATA, OnOpenData)

ON_WM_TIMER()

ON_WM_PAINT()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

虽然上述消息映射在编程过程中处理消息非常简练方便,但显然是难于理解消息是如何参与循环和分发的。因此有必要通过SDK(Software Developers Kit,软件开发工具箱)代码深入到被MFC封装的Windows编程的核心中来研究其具体是如何工作的。在SDK编程中,一般是在Windows应用程序的入口点WinMain函数中添加处理消息循环的代码以检索Windows送来的消息,然后WinMain再把这些消息分配给相应的窗口函数并处理它们:

……

MSG msg//定义消息名

while (GetMessage (&msg, NULL, 0, 0))

{

TranslateMessage (&msg) //翻译消息

DispatchMessage (&msg) //撤去消息

}

return msg.wParam

上述几句虽然简单但却是所有Windows程序的关键代码,担负着获取、解释和分发消息的任务,下面就重点对其功能和作用进行分析:

MSG结构在头文件中定义如下:

typedef struct tagMSG

{

HWND hwnd

UINT message

WPARAM wParam

LPARAM lParam

DWORD time

POINT pt

} MSG, *PMSG

其数据成员的具体意义如下:

hwnd:消息将要发送到的那个窗口的句柄,用这个参数可以决定让哪个窗口接收消息。

message:消息号,它唯一标识了一种消息类型。每种消息类型都在Windows文件进行了预定义。

wParam:一个32位的消息参数,这个值的确切意义取决于消息本身。

lParam:同上。

time:消息放入消息队列中的时间,在这个域中写入的并非当时日期,而是从Windows启动后所测量的时间值。Windows用

这个域来使用消息保持正确的顺序。

pt:消息放入消息队列时的鼠标坐标。

消息循环以GetMessage调用开始,它从消息队列中取出一个消息。该函数的四个参数可以有控制地获取消息,第一个参数指定要接收消息的MSG结构的地址,第二个参数表示窗口句柄,一般将其设置为空,表示要获取该应用程序创建的所有窗口的消息;第三、四参数用于指定消息范围。后面三个参数被设置为默认值,用于接收发送到属于这个应用程序的任何一个窗口的所有消息。在接收到除WM_QUIT之外的任何一个消息后,GetMessage()返回TRUE;如果GetMessage收到一个WM_QUIT消息,则返回FALSE以退出消息循环,终止程序运行。因此,在接收到WM_QUIT之前,带有GetMessage()的消息循环可以一直循环下去。当除WM_QUIT的消息用GetMessage读入后,首先要经过函数TranslateMessage()对其进行解释,但对大多数消息来说并不起什么作用。这里起关键作用的是DispatchMessage()函数,把由GetMessage获取的Windows消息传送给在MSG结构中为窗口所指定的窗口过程。在消息处理函数处理完消息之后,代码又循环到开始去接收另一个消息,这样就完成了一个完整的消息循环。

由于Windows *** 作系统是一种非剥夺式多任务 *** 作系统。只有在应用程序主动交出CPU控制权后,Windows才能把控制权交给其他应用程序。在消息循环中,一定要有能交出控制的系统函数才能实现协同式多任务 *** 作。能完成该功能的只有GetMessage、PeekMessage和WaitMessage这三个函数,如果在应用程序中长期不去调用这三个函数之一其他任务则无法执行。GetMessage函数在找不到等待应用程序处理的消息时,会自动交出控制权,由Windows把CPU的控制权交给其他等待获取控制权的应用程序。由于任何Windows应用程序都含有一个消息循环,这种隐式交出控制权的方式可以保证合并各个应用程序共享控制权。一旦发往该应用程序的消息到达应用程序队列,即开始执行GetMessage语句的下一条语句。使用GetMessage函数的消息循环在消息队列中没有消息时将等待,如果需要,可以利用这段时间进行I/O端口 *** 作等耗时 *** 作,不过需要在消息循环中使用PeekMessage函数来代替GetMessage。使用PeekMessage的方法同GetMessage类似,下面是一段使用PeekMessage函数的消息循环的典型例子:

MSG msg

BOOL bDone=FALSE

do{

if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){

if(msg.message==WM_QUIT)

bDone=TRUE

else{

TranslateMessage(&msg)

DispatchMessage(&msg)

}

}

//无消息处理,进行长时间 *** 作

else{

……//长时间 *** 作

}

}while(!bDone)

……

无论应用程序消息队列中是否有消息,PeekMessage函数都立即返回,如果希望等待新消息入队,可以利用无返回值的函数WaitMessage配合PeekMessage进行消息循环。

四、对Windowds消息的处理

窗口过程处理消息通常以switch语句开始,对于它要处理的每一条消息ID都跟有一条case语句,这在功能上同MFC的消息映射有些类似:

switch(uMsgId)

{

case WM_TIMER:

//对WM_TIMER定时器消息的处理过程

return 0

case WM_LBUTTONDOWN:

//对WM_ LBUTTONDOWN鼠标左键单击消息的处理过程

ruturn 0

……

default:

//其他消息由这个默认处理函数来处理

return DefWindowProc(hwnd,uMsgId,wParam,lParam)

}

在处理完消息后必须返回0,这很重要,否则Windows将要不停地重试下去。对于那些在程序中不准备处理的消息,窗口过程会把它们都扔给DefWindowProc进行缺省处理,而且还要返回那个函数的返回值。在消息传递层次中,可以认为DefWindowProc函数是最顶层的函数。该函数发出WM_SYSCOMMAND消息,由系统执行Windows环境中多数窗口所公用的各种通用 *** 作,如更新窗口的正文标题等等。 在MFC下可以用下述部分代码实现与上述SDK代码相同的功能:

BEGIN_MESSAGE_MAP(CTEMMSView, CFormView)

//{{AFX_MSG_MAP(CTEMMSView)

ON_WM_LBUTTONDOWN()

ON_WM_TIMER()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

小结:Windows环境提供有非常丰富的系统资源,在这个基础上可以编制出能满足各种各样目标功能的应用系统。要深入Windows编程就必须首先对Windows系统的运行机理有很好的认识,本文仅针对Windows的一种重要运行机制--消息机制作了较深入的剖析和阐述。对培养在Windows下的编程思想有一定的帮助。对某些相关问题的详细论述可以参考MSDN在线帮助的"SDK Reference"部分。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12500674.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存