Baas:Backend asaService它的主要特征是将云的某些能力封装起来,做成适合移动或web应用的功能,做成打包销售提供给用户;也就是将移动或web所需要的功能放在云上面以云软件的形式提供给使用者。
云后端服务(云存储)的优势:容易扩充、让移动开发者可以不去理会服务器性能优化和服务器代码编写
服务包括:账户的管理、消息推送、社交网络整合、异地信息服务、广告推广、应用推广
|
移动后端服务Baas提供商:
国外的有Stackmob、kinvey、amazon等
国内的有:bmob、avos cloud、atom
|
Bmob 的理念:Bmob解决了后端逻辑重复开发和维护的问题,无需后端编程和租用服务器 让移动开发更简单
使用Bmob无需再造应用后端,便能轻松拥有应用开发的各种后端能力支持,减少了开发者将应用从idea到产品(成品)的时间,我们提供了大量标准的API接口,根据需要接入相关服务,开发者可以更加专注于应用的开发,让产品交付更快速。
Bmob官网地址:http://www.bmob.cn
|
|
Bmob账户:younghare
通过快速入门,你将学会如何使用bmob;如果你想提高使用bmob的功能可以跟技术大牛一起学习:视频教程;更详细的解释请查看Android开发文档)
|
第一步:Bmob创建“czg学习演示”应用
|
|
先上个图
|
|
鉴于目前Google官方推荐使用 AndroidStudio 进行Android项目开发,自 V3.4.2 开始,BmobAndroidSDK 可以使用Gradle来进行包依赖管理,如果你使用Android Studio来进行基于BmobSDK的项目开发,建议你按照如下两个步骤进行:
一、 在Project的build.gradle文件中添加Bmob的maven仓库地址,示例如下:(注意文字说明部分):
代码如下:
|
//Top-levelbuildfilewhereyoucanaddconfigurationoptionscommontoallsub-projects/modules.
buildscript{
repositories{
jcenter()
}
dependencies{
classpath'com.android.tools.build:gradle:2.0.0'
//NOTE:Donotplaceyourapplicationdependencieshere;theybelong
//intheindividualmodulebuild.gradlefiles
}
}
allprojects{
repositories{
jcenter()
//Bmob的maven仓库地址,必须填写
maven{url"https://raw.github.com/bmob/bmob-android-sdk/master"}
}
}
taskclean(type:Delete){
deleterootProject.buildDir
}
|
二、在app的build.gradle文件中添加compile依赖文件,示例如下:(注意文字说明部分):
|
applyplugin:'com.android.application'
android{
compileSdkVersion23
buildToolsVersion"23.0.3"
//**bmob-sdk:3.4.6版本依赖包,用于兼容Android6.0系统**
useLibrary'org.apache.http.legacy'
defaultConfig{
applicationId"czg.czgbmob"
minSdkVersion15
targetSdkVersion23
versionCode1
versionName"1.0"
}
buildTypes{
release{
minifyEnabledfalse
proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
}
}
dependencies{
compilefileTree(dir:'libs',include:['*.jar'])
testCompile'junit:junit:4.12'
compile'com.android.support:appcompat-v7:23.3.0'
//以下SDK开发者请根据需要自行选择
//bmob-sdk:Bmob的androidsdk包,包含了Bmob的数据存储、文件等服务,以下是最新的bmob-sdk:
compile'cn.bmob.android:bmob-sdk:3.4.6'
compile'com.squareup.okhttp:okhttp:2.4.0'//自`V3.4.3版本`开始,使用`okhttp`优化SDK的网络框架
compile'com.squareup.okio:okio:1.4.0'
compile'com.android.support:support-v4:23.2.1'
//注:bmob-sdk:3.4.6需要依赖okhttp(2.4.0)、okio(2.4.0),如果需要兼容Android6.0系统,则还需要添加support-v4(23.2.1)及org.apache.http.legacy包,具体可查看下面注释[1]的解释
}
|
在AndroidManifest.xml中增加权限代码
|
<!--BmobSDK权限-->
<!--允许联网-->
<uses-permissionandroid:name="android.permission.INTERNET"/>
<!--获取GSM(2g)、WCDMA(联通3g)等网络状态的信息-->
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--获取wifi网络状态的信息-->
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
<!--保持CPU运转,屏幕和键盘灯有可能是关闭的,用于文件上传和下载-->
<uses-permissionandroid:name="android.permission.WAKE_LOCK"/>
<!--获取sd卡写的权限,用于文件上传和下载-->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--推送权限-->
<!--允许读取手机状态-->
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<!--允许接收屏幕解锁广播-->
<uses-permissionandroid:name="android.permission.RECEIVE_USER_PRESENT"/>
<!--允许接收开机广播-->
<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!--其他权限-->
<uses-permissionandroid:name="android.permission.VIBRATE"/>
|
创建一个activity名为BmobFeedbackActivity.java
|
packageczg.czgbmob;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.EditText;
importandroid.widget.TextView;
importandroid.widget.Toast;
importjava.util.List;
importcn.bmob.v3.Bmob;
importcn.bmob.v3.BmobQuery;
importcn.bmob.v3.listener.FindListener;
importcn.bmob.v3.listener.SaveListener;
publicclassBmobFeedbackActivityextendsAppCompatActivity{
privateEditTextet_username,et_feedback,et_usernameQry;
privateTextViewtv_feedbackAll,tv_feedbackQry;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bmob_feedback);
Bmob.initialize(this,"e7e000e141cac6a4c46e95117af566cc");//appkey就是Bmob应用后台设置中的ApplicationID
et_username=(EditText)findViewById(R.id.et_username);
et_feedback=(EditText)findViewById(R.id.et_feedback);
tv_feedbackAll=(TextView)findViewById(R.id.tv_feedbackAll);
et_usernameQry=(EditText)findViewById(R.id.et_usernameQry);
tv_feedbackQry=(TextView)findViewById(R.id.tv_feedbackQry);
}
publicvoidsubmitOnclick(Viewview){
StringsUsername=et_username.getText().toString();
StringsFeedback=et_feedback.getText().toString();
if(sUsername.equals("")||(sFeedback.equals(""))){
Toast.makeText(BmobFeedbackActivity.this,"用户名不能为空,反馈信息不能为空",Toast.LENGTH_LONG).show();
}else{
JavaBean_feebackjavaBean_feeback=newJavaBean_feeback();
javaBean_feeback.setUsername(sUsername);
javaBean_feeback.setFeedback(sFeedback);
//调用Bmob的sdk保存数据提交给“云服务器”通过回调方法处理成功与失败的情况
javaBean_feeback.save(BmobFeedbackActivity.this,newSaveListener(){
@Override
publicvoidonSuccess(){
Toast.makeText(BmobFeedbackActivity.this,"反馈信息成功!",Toast.LENGTH_LONG).show();
}
@Override
publicvoidonFailure(inti,Strings){
Toast.makeText(BmobFeedbackActivity.this,"反馈信息失败",Toast.LENGTH_LONG).show();
}
});
}
}
publicvoidqueryAllOnclick(Viewview){
BmobQuery<JavaBean_feeback>javaBean_feebackBmobQuerys=newBmobQuery<JavaBean_feeback>();
javaBean_feebackBmobQuerys.findObjects(BmobFeedbackActivity.this,newFindListener<JavaBean_feeback>(){
@Override
publicvoidonSuccess(List<JavaBean_feeback>list){
//遍历查询结果
tv_feedbackAll.setText("========查询结果======");
for(JavaBean_feebackjavaBean_feeback:list){
tv_feedbackAll.append("\n"+"用户名:"+javaBean_feeback.getUsername()+"反馈信息:"+javaBean_feeback.getFeedback());
}
}
@Override
publicvoidonError(inti,Strings){
Toast.makeText(BmobFeedbackActivity.this,"查询失败",Toast.LENGTH_LONG).show();
}
});
}
publicvoidqueryOnclick(Viewview){
StringsUsernameQry=et_usernameQry.getText().toString();
if(sUsernameQry.equals("")){
Toast.makeText(BmobFeedbackActivity.this,"请输入用户名",Toast.LENGTH_LONG).show();
return;
}
BmobQuery<JavaBean_feeback>javaBean_feebackBmobQuerys=newBmobQuery<JavaBean_feeback>();
//设置查询条件,可以设置多个条件查询,类似sql语句的where条件
javaBean_feebackBmobQuerys.addWhereEqualTo("username",sUsernameQry);
javaBean_feebackBmobQuerys.findObjects(BmobFeedbackActivity.this,newFindListener<JavaBean_feeback>(){
@Override
publicvoidonSuccess(List<JavaBean_feeback>list){
//遍历查询结果
tv_feedbackQry.setText("========按用户名查询结果======");
for(JavaBean_feebackjavaBean_feeback:list){
tv_feedbackQry.append("\n"+"用户名:"+javaBean_feeback.getUsername()+"反馈信息:"+javaBean_feeback.getFeedback());
}
}
@Override
publicvoidonError(inti,Strings){
Toast.makeText(BmobFeedbackActivity.this,"查询失败",Toast.LENGTH_LONG).show();
}
});
}
}
|
Activity的布局代码activity_bmob_feedback.xml
|
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".BmobFeedbackActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_username"
android:hint="请输入用户名"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_feedback"
android:hint="输入反馈的问题"
android:lines="2"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提交"
android:id="@+id/btn_submit"
android:layout_gravity="center_horizontal"
android:onClick="submitOnclick"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询所有的反馈信息"
android:id="@+id/btn_QueryAll"
android:onClick="queryAllOnclick"
android:layout_gravity="center_horizontal"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="114dp"
android:id="@+id/scrollView">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="------显示所有查询到的记录-----"
android:id="@+id/tv_feedbackAll"/>
</ScrollView>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/et_usernameQry"
android:layout_weight="1"
android:hint="要查询的用户名"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询"
android:id="@+id/btn_query"
android:onClick="queryOnclick"
android:layout_weight="1"/>
</LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/scrollView2"
android:layout_gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="------显示按用户名查询的反馈记录-----"
android:id="@+id/tv_feedbackQry"/>
</ScrollView>
</LinearLayout>
|
创建一个javaBean类javaBean_feeback.java
|
packageczg.czgbmob;
importcn.bmob.v3.BmobObject;
/**
*CreatedbyAdministratoron2016/5/12.
*在使用Bmob的sdk去存储一行数据的时候,我们需要javaBean继承至BmobObject这个类
*javaBean_feeback实际上是对应数据库上的一张表,属性名就对于表中的字段名,一个javaBean_feeback对象就是对于表中的一条记录
*当用户提交到云数据库,程序调用的时javaBean_feeback.save方法。它会自动判断后台有没有创建国与javaBean_feeback同名的表,
*如果没有则会创建对于的javaBean_feeback表。表的结构有objectid,javaBean_feeback各个属性字段,createAtdate,UpdateAtdate,ACLAcl字段
*/
publicclassJavaBean_feebackextendsBmobObject{
privateStringusername;
privateStringfeedback;
publicStringgetFeedback(){
returnfeedback;
}
publicvoidsetFeedback(Stringfeedback){
this.feedback=feedback;
}
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
}
|
源码下载:https://yunpan.cn/cP7X8WsBCMm9t访问密码466e
|