为什么要学bada:
现在的移动市场,纷争四起,各大厂商齐发力。目前笑的最从容的当属iPhone和Android。
在移动开发领域混了几年,感觉开发者是最苦的。要学的东西太多了,这么多手机系统,要全掌握并精通,
那简直是不可能的。聪明些的,就会做出选择,也就是所谓的抱大腿,只要你抱对了,日子过得会有滋有味;抱错了,
面临了继续重新做选择。举个现在大家都知道的例子,07年iPhone一出,好多人去学,结果那第一批人成功了;紧接着,
android也在酝酿着,好多人去学,09年android大爆发,这批人也牛了;symbian的无力,现在好多symbian开发者面临
着选择,投入到android还是iPhone,这是个问题。
其实,学习bada有几点好处:
1、这是个抱大腿的机会,如果bada修成正果,这宝也就压对了。
2、学习人家的架构,对自己还是有益的。
3、多交朋友。每个领域都有朋友,积累人脉,日后用得着。
bada简介:
sumsang的智能手机系统,开放而不开源的,用C++作开发语言,IDE是基于Eclipse的。
第一个bada程序,hello bada
开发程序,首先要搭建环境。
去sumsang官网下载吧,http://developer.bada.com/devtools/sdk
8月25日,也就是周五那一天,bada2.0放出来了。我是昨晚知道的,当然是要下载来看看了。
比之前的下载,这次有所不同。之前的版本都是下载安装包,本地安装,而这次是下载个exe,
在线安装。这可苦了我,晚上安装了近7个小时,中途出现各种断网问题,郁闷之极啊。
安装完毕后,一切就齐活了。这让我想起3年前搭symbian程序,那时才叫痛苦呢。
打开ide,如果你熟悉eclipse,一切都是那么熟悉。
下面,是看帮助文档。好东西全在这里面呢。
#ifndef _HELLOWORLD_H_ #define _HELLOWORLD_H_ #include <FApp.h> #include <FBase.h> #include <FSystem.h> #include <FUi.h> /** * [Helloworld] application must inherit from Application class * which provides basic features necessary to define an application. */ class Helloworld : public Osp::App::Application, public Osp::System::IScreenEventListener { public: /** * [Helloworld] application must have a factory method that creates an instance of itself. */ static Osp::App::Application* CreateInstance(void); public: Helloworld(); ~Helloworld(); public: // Called when the application is initializing. bool OnAppInitializing(Osp::App::AppRegistry& appRegistry); // Called when the application is terminating. bool OnAppTerminating(Osp::App::AppRegistry& appRegistry, bool forcedTermination = false); // Called when the application's frame moves to the top of the screen. void OnForeground(void); // Called when this application's frame is moved from top of the screen to the background. void OnBackground(void); // Called when the system memory is not sufficient to run the application any further. void OnLowMemory(void); // Called when the battery level changes. void OnBatteryLevelChanged(Osp::System::BatteryLevel batteryLevel); // Called when the screen turns on. void OnScreenOn (void); // Called when the screen turns off. void OnScreenOff (void); }; #endifHelloworld.cpp
/** * Name : Helloworld * Version : * Vendor : linc * Description : */ #include "Helloworld.h" #include "HelloworldForm.h" using namespace Osp::App; using namespace Osp::Base; using namespace Osp::System; using namespace Osp::Ui; using namespace Osp::Ui::Controls; Helloworld::Helloworld() { } Helloworld::~Helloworld() { } Application* Helloworld::CreateInstance(void) { // Create the instance through the constructor. return new Helloworld(); } bool Helloworld::OnAppInitializing(AppRegistry& appRegistry) { // TODO: // Initialize UI resources and application specific data. // The application's permanent data and context can be obtained from the appRegistry. // // If this method is successful, return true; otherwise, return false. // If this method returns false, the application will be terminated. // Uncomment the following statement to listen to the screen on/off events. //PowerManager::SetScreenEventListener(*this); // Create a form HelloworldForm *pHelloworldForm = new HelloworldForm(); pHelloworldForm->Initialize(); // Add the form to the frame Frame *pFrame = GetAppFrame()->GetFrame(); pFrame->AddControl(*pHelloworldForm); // Set the current form pFrame->SetCurrentForm(*pHelloworldForm); // Draw and Show the form pHelloworldForm->Draw(); pHelloworldForm->Show(); return true; } bool Helloworld::OnAppTerminating(AppRegistry& appRegistry, bool forcedTermination) { // TODO: // Deallocate resources allocated by this application for termination. // The application's permanent data and context can be saved via appRegistry. return true; } void Helloworld::OnForeground(void) { // TODO: // Start or resume drawing when the application is moved to the foreground. } void Helloworld::OnBackground(void) { // TODO: // Stop drawing when the application is moved to the background. } void Helloworld::OnLowMemory(void) { // TODO: // Free unused resources or close the application. } void Helloworld::OnBatteryLevelChanged(BatteryLevel batteryLevel) { // TODO: // Handle any changes in battery level here. // Stop using multimedia features(camera, mp3 etc.) if the battery level is CRITICAL. } void Helloworld::OnScreenOn (void) { // TODO: // Get the released resources or resume the operations that were paused or stopped in OnScreenOff(). } void Helloworld::OnScreenOff (void) { // TODO: // Unless there is a strong reason to do otherwise, release resources (such as 3D, media, and sensors) to allow the device to enter the sleep mode to save the battery. // Invoking a lengthy asynchronous method within this listener method can be risky, because it is not guaranteed to invoke a callback before the device enters the sleep mode. // Similarly, do not perform lengthy operations in this listener method. Any operation must be a quick one. }这里你会初步了解bada程序的生命周期,想必你已经和Android的生命周期作对比了吧?
/** * This file contains the bada application entry point. */ #include "Helloworld.h" using namespace Osp::Base; using namespace Osp::Base::Collection; #ifdef __cplusplus extern "C" { #endif // __cplusplus _EXPORT_ int OspMain(int argc, char *pArgv[]); /** * The entry function of bada application called by the operating system. */ int OspMain(int argc, char *pArgv[]) { result r = E_SUCCESS; AppLog("Application started."); ArrayList* pArgs = new ArrayList(); pArgs->Construct(); for (int i = 0; i < argc; i++) pArgs->Add(*(new String(pArgv[i]))); r = Osp::App::Application::Execute(Helloworld::CreateInstance, pArgs); if (IsFailed(r)) { AppLogException("Application execution failed-[%s].", GetErrorMessage(r)); r &= 0x0000FFFF; } pArgs->RemoveAll(true); delete pArgs; AppLog("Application finished."); return static_cast<int>(r); } #ifdef __cplusplus } #endif // __cplusplus紧接着就是Form相关的了,这个做windows的又会很熟悉。
#ifndef _HELLOWORLDFORM_H_ #define _HELLOWORLDFORM_H_ #include <FBase.h> #include <FUi.h> class HelloworldForm : public Osp::Ui::Controls::Form, public Osp::Ui::IActionEventListener, public Osp::Ui::ITouchEventListener { // Construction public: HelloworldForm(void); virtual ~HelloworldForm(void); bool Initialize(void); // Implementation protected: static const int ID_BUTTON_OK = 101; Osp::Ui::Controls::Button *__pButtonOk; Osp::Ui::Controls::Label *__pLabel; public: virtual result OnInitializing(void); virtual result OnTerminating(void); virtual void OnActionPerformed(const Osp::Ui::Control& source, int actionId); virtual void OnTouchDoublePressed(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo); virtual void OnTouchFocusIn(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo); virtual void OnTouchFocusOut(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo); virtual void OnTouchLongPressed(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo); virtual void OnTouchMoved(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo); virtual void OnTouchPressed(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo); virtual void OnTouchReleased(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo); }; #endif //_HELLOWORLDFORM_H_HelloworldForm.cpp
#include "HelloworldForm.h" using namespace Osp::Base; using namespace Osp::Ui; using namespace Osp::Ui::Controls; HelloworldForm::HelloworldForm(void) { } HelloworldForm::~HelloworldForm(void) { } bool HelloworldForm::Initialize() { // Construct an XML form Construct(L"IDF_HELLOWORLDFORM"); return true; } result HelloworldForm::OnInitializing(void) { result r = E_SUCCESS; // TODO: Add your initialization code here // Get a button via resource ID __pButtonOk = static_cast<Button *>(GetControl(L"IDC_BUTTON_OK")); if (__pButtonOk != null) { __pButtonOk->AddTouchEventListener(*this); __pButtonOk->SetActionId(ID_BUTTON_OK); __pButtonOk->AddActionEventListener(*this); } //Get a label __pLabel = static_cast<Label *>(GetControl(L"IDC_LABEL1")); return r; } result HelloworldForm::OnTerminating(void) { result r = E_SUCCESS; // TODO: Add your termination code here return r; } void HelloworldForm::OnActionPerformed(const Osp::Ui::Control& source, int actionId) { switch(actionId) { case ID_BUTTON_OK: { AppLog("OK Button is clicked! \n"); __pLabel->SetText(L"Hello Bada!"); __pLabel->Draw(); MessageBox messageBox; messageBox.Construct(L"LINC", L"Hello Bada.", MSGBOX_STYLE_NONE, 3000); // Call ShowAndWait - draw, show itself and process events int modalResult = 0; messageBox.ShowAndWait(modalResult); switch(modalResult) { case MSGBOX_RESULT_OK: // Todo: break; default: break; } } break; default: break; } } void HelloworldForm::OnTouchDoublePressed(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo) { // TODO: Add your implementation codes here } void HelloworldForm::OnTouchFocusIn(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo) { // TODO: Add your implementation codes here } void HelloworldForm::OnTouchFocusOut(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo) { // TODO: Add your implementation codes here } void HelloworldForm::OnTouchLongPressed(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo) { // TODO: Add your implementation codes here } void HelloworldForm::OnTouchMoved(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo) { // TODO: Add your implementation codes here } void HelloworldForm::OnTouchPressed(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo) { // TODO: Add your implementation codes here AppLog("OK Button is OnTouchPressed! \n"); __pLabel->SetText("Hello Bada!"); } void HelloworldForm::OnTouchReleased(const Osp::Ui::Control &source, const Osp::Graphics::Point ¤tPosition, const Osp::Ui::TouchEventInfo &touchInfo) { // TODO: Add your implementation codes here }