为什么要学bada:
现在的移动市场,纷争四起,各大厂商齐发力。目前笑的最从容的当属iPhone和Android。
在移动开发领域混了几年,感觉开发者是最苦的。要学的东西太多了,这么多手机系统,要全掌握并精通,
那简直是不可能的。聪明些的,就会做出选择,也就是所谓的抱大腿,只要你抱对了,日子过得会有滋有味;抱错了,
面临了继续重新做选择。举个现在大家都知道的例子,07年iPhone一出,好多人去学,结果那第一批人成功了;紧接着,
android也在酝酿着,好多人去学,09年android大爆发,这批人也牛了;symbian的无力,现在好多symbian开发者面临
着选择,投入到android还是iPhone,这是个问题。
其实,学习bada有几点好处:
1、这是个抱大腿的机会,如果bada修成正果,这宝也就压对了。
2、学习人家的架构,对自己还是有益的。
3、多交朋友。每个领域都有朋友,积累人脉,日后用得着。
bada简介:
sumsang的智能手机系统,开放而不开源的,用C++作开发语言,IDE是基于Eclipse的。
Bada系统的架构
先来简单分析一下这四层架构。
最底层是Kernel层,Bada同Android等一样,也是基于linux系统的,所以它的系统kernel就是linux 的kernel。官网上强调它是实时的系统。
底层的上一层是Device层,负责内存、IO管理,安全管理,图形窗口和事件管理,数据协议、移动通信,音频视频等多媒体管理。这是很重要的一层。
再上一层是Service层,主要是应用程序引擎,比如联系人和信息组件,与bada服务交互组件。
最上层为Franmework层,我们应用开发都要在此层做了。它提供基础api,UI和图形api等。
第一个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);
- };
- #endif
#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);
};
#endif
Helloworld.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.
- }
/**
* 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
/**
* 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_
#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
- }
#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
}