Android移动后端服务(BAAS)快速搭建后台服务器之Bmob-android学习之旅(75)
个人移动开发者的最头疼的问题,就是App的网络后台,包含数据库等,国外目前有比较成熟的解决方案,但是限制于墙的问题,推荐国内的解决方案,比较出名的是Bmob和AVOS cloud和Atom等,这一次我们重点介绍Bmob
使用步骤
1.下载android SDK,里卖包括一个简单的demo和Bmob的两个jar包,可能还有一些Okhttp这类的Jar包,只需要把和Bmob相关的jar包复制到app底下的libs下
2.android studio下需要邮件app项目,打开module setting,选中dependency,电击右上角的加号,选择从文件添加,找到libs下面的jar包,依次加入
3.打开快速开发文档,在manifest里面导入需要的权限,注意javaBean需要继承BmobObjext,这个类封装了网络操作像在本地一样执行存贮然后,在activity里面初始化
4.还有不懂的看demo和开发文档,左边栏是导航很清楚
Bmob的数据库和后台推送,以及短信和app网页这些技术很好,我仅仅使用了数据库的功能
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
下面简要介绍我的demo,是一个和手台数据库交互的登陆系统,包括注册和登陆界面,会有各种的输入检查,包括手机号是否重复,密码和再次输入的密码是否一致,是否为空等,注册后的信息存放在数据库,登陆成功后进入一个空的Activity,显示Toast登陆成功
废话不多说,代码如下
登陆类代码
package com.example.euler_kalvinhe.bmobtest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.List;
import cn.bmob.v3.Bmob;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.listener.FindListener;
/**
* Created by Euler-KalvinHe on 2015/8/24.
*/
public class LoginActivity extends Activity {
private EditText userName,password;
private Button login,regeter;
String username,pass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
initViews();
Toast.makeText(LoginActivity.this,username+pass,Toast.LENGTH_LONG).show();
Bmob.initialize(this, "79bda8edfbabc323575348b6d50508e6");
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
username = userName.getText().toString();
pass = password.getText().toString();
BmobQuery<User> query = new BmobQuery<User>();
query.addWhereEqualTo("userName",username);
query.findObjects(LoginActivity.this,new FindListener<User>() {
@Override
public void onSuccess(List<User> users) {
String str = null;
str = users.get(0).getPassword();
if (str.equals(pass)){
Intent intent = new Intent(LoginActivity.this,OutActivity.class);
startActivity(intent);
}else{
Toast.makeText(LoginActivity.this,"用户名或者密码不正确",Toast.LENGTH_LONG).show();
}
// Toast.makeText(LoginActivity.this,str,Toast.LENGTH_LONG).show();
}
@Override
public void onError(int i, String s) {
Toast.makeText(LoginActivity.this,"登录失败",Toast.LENGTH_LONG).show();
}
});
}
});
regeter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(LoginActivity.this,RegesterActivity.class);
startActivity(intent);
finish();
}
});
}
private void initViews(){
userName = (EditText) findViewById(R.id.userName);
login = (Button) findViewById(R.id.log);
password = (EditText) findViewById(R.id.password);
regeter = (Button) findViewById(R.id.regester);
}
private void logIn(){
username = userName.getText().toString();
pass = password.getText().toString();
}
private String queryPass(String username){
final String[] passTwo = {null};
if (username == null){
return null;
}
BmobQuery<User> query = new BmobQuery<User>();
query.addWhereEqualTo("userName",username);
query.findObjects(LoginActivity.this,new FindListener<User>() {
@Override
public void onSuccess(List<User> users) {
passTwo[0] = users.get(0).getPassword();
Toast.makeText(LoginActivity.this,passTwo[0],Toast.LENGTH_LONG).show();
}
@Override
public void onError(int i, String s) {
Toast.makeText(LoginActivity.this,"登录失败",Toast.LENGTH_LONG).show();
}
});
return passTwo[0];
}
}
注册类代码
package com.example.euler_kalvinhe.bmobtest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.List;
import cn.bmob.v3.Bmob;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.SaveListener;
public class RegesterActivity extends Activity{
private EditText userName, phoneNumber, password, passwordAgain;
private Button regester,login;
private String username,pass,passAgain;
private String phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.regester);
initViews();
Bmob.initialize(this, "79bda8edfbabc323575348b6d50508e6");
regester.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
regesterUser();
}
});
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(RegesterActivity.this,LoginActivity.class);
startActivity(intent);
finish();
}
});
}
private void initViews() {
regester = (Button) findViewById(R.id.regester);
passwordAgain = (EditText) findViewById(R.id.passwordAgain);
password = (EditText) findViewById(R.id.password);
phoneNumber = (EditText) findViewById(R.id.phoneNumber);
userName = (EditText) findViewById(R.id.userName);
login = (Button) findViewById(R.id.login);
}
private void regesterUser(){
username = userName.getText().toString();
pass = password.getText().toString();
passAgain = passwordAgain.getText().toString();
phone = phoneNumber.getText().toString();
if (username != null && pass != null && password != null && phone != null ){
if ( pass.equals(passAgain)){
BmobQuery<User> query = new BmobQuery<User>();
query.findObjects(RegesterActivity.this,new FindListener<User>() {
@Override
public void onSuccess(List<User> users) {
boolean flag = false;
for (User u:users){
if (phone.equals(u.getPhoneNumber())){
flag = true;
break;
}
}
if (flag){
phoneNumber.setText("");
Toast.makeText(RegesterActivity.this, "手机号已经被注册,请重试", Toast.LENGTH_LONG).show();
}else{
User user = new User();
user.setUserName(username);
user.setPassword(pass);
user.setPhoneNumber(phone);
user.save(RegesterActivity.this,new SaveListener() {
@Override
public void onSuccess() {
Toast.makeText(RegesterActivity.this,"注册成功",Toast.LENGTH_LONG).show();
Intent intent = new Intent(RegesterActivity.this,LoginActivity.class);
startActivity(intent);
finish();
}
@Override
public void onFailure(int i, String s) {
Toast.makeText(RegesterActivity.this,"注册失败",Toast.LENGTH_LONG).show();
}
});
}
}
@Override
public void onError(int i, String s) {
Toast.makeText(RegesterActivity.this,"请检查网络重试",Toast.LENGTH_LONG).show();
}
});}else{
password.setText("");
passwordAgain.setText("");
Toast.makeText(RegesterActivity.this,"密码不一致,请重试",Toast.LENGTH_LONG).show();
}
}else {
userName.setText("");
password.setText("");
passwordAgain.setText("");
phoneNumber.setText("");
Toast.makeText(RegesterActivity.this,"不能为空",Toast.LENGTH_LONG).show();
}
}
}
javaBmob代码
package com.example.euler_kalvinhe.bmobtest;
import cn.bmob.v3.BmobObject;
/**
* Created by Euler-KalvinHe on 2015/8/24.
*/
public class User extends BmobObject{
private String userName;
private String phoneNumber;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
主类代码
package com.example.euler_kalvinhe.bmobtest;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
/**
* Created by Euler-KalvinHe on 2015/8/24.
*/
public class OutActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this,"登陆成功",Toast.LENGTH_LONG).show();
}
}
布局代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/userName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用户名"/>
<EditText
android:id="@+id/phoneNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="电话号码"/>
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码"/>
<EditText
android:id="@+id/passwordAgain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="确认密码"/>
<Button
android:id="@+id/regester"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="注册"
/>
<Button
android:id="@+id/login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="返回登录"
/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/userName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用户名"/>
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码"/>
<Button
android:id="@+id/log"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登陆"
/>
<Button
android:id="@+id/regester"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="注册"
/>
</LinearLayout>
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
github项目地址,大家可以去下载项目源码
https://github.com/fengsehng/BmobTest
Android移动后端服务(BAAS)快速搭建后台服务器之Bmob-android学习之旅(75)的更多相关文章
- Azure 中快速搭建 FTPS 服务
FTP,FTPS 与 SFTP 的区别 FTP (File Transfer Protocol)是一种常用的文件传输协议,在日常工作中被广泛应用.不过,FTP 协议使用明文传输.如果文件传输发生在公网 ...
- 快速搭建FTP服务
Linux下ftp服务可以通过搭建vsftpd服务来实现,以CentOS为例,首先查看系统中是否安装了vsftpd,可以通过执行命令 rpm -qa | grep vsftpd 来查看是否安装相应的包 ...
- Windows服务的快速搭建与调试(C#图解)
Windows服务的快速搭建与调试(C#图解) 目录 一.什么是Windows 服务? 二.创建Windows 服务与安装/卸载批处理. 三.调试Windows 服务. 正文 一.什么是Windo ...
- 快速搭建Kerberos服务端及入门使用
快速搭建Kerberos服务端及入门使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Kerberos是一种网络身份验证协议.它旨在通过使用秘密密钥加密为客户端/服务器应用程序提 ...
- Go语言micro之快速搭建微服务
背景 go-micro给我们提供了一个非常便捷的方式来快速搭建微服务,而且并不需要提前系统了解micro,下面用一个简单的示例来快速实现一个服务. 创建Proto文件 因为我们要做微服务,那么就一定有 ...
- 使用 python -m SimpleHTTPServer 快速搭建http服务
摘要: 在 Linux 服务器上或安装了 Python 的机器上,可以使用 nohup python -m SimpleHTTPServer [port] & 快速搭建一个http服务. 在 ...
- 快速搭建http服务:共享文件--Java的我,不知Python你的好
在 Linux 服务器上或安装了 Python 的机器上, 我们可以在指定的文件目录下,使用 python -m SimpleHTTPServer 快速搭建一个http服务,提供一个文件浏览的web ...
- 使用 python快速搭建http服务
在 Linux 服务器上或安装了 Python 的机器上,Python自带了一个WEB服务器 SimpleHTTPServer. 我们可以很简单的使用 python -m SimpleHTTPSer ...
- python快速搭建http服务
在Windows 7/10或Ubuntu上可以通过python2.x或python3.x来快速搭建一个简单的HTTP服务器. 如果python为2.x,则可执行:$ python -m SimpleH ...
随机推荐
- JAVA反射之Class类的练习
package zhang; /** * JAVA反射之CLass类的练习 * * 在面向对象的语言里,万事万物皆对象,那么类是谁的对象呢? * 类的类型是CLass * * */ class Tes ...
- c++ 隐藏
子类中写了一个与从父类中继承下来的方法名同名的方法 子类对象.方法(); //调用子类中定义的方法 父类对象.方法(); / ...
- Spring-cloud(六) Hystrix入门
前提 一个可用的Eureka注册中心(文中以之前博客中双节点注册中心,不重要) 一个连接到这个注册中心的服务提供者 快速入门 项目搭建 搭建一个新maven项目,artifactid为Ribbon-c ...
- C语言完美体系
**第 1 篇 C 语言第一阶段 13 1.1C 语言第一阶段--语言课程概述 13 1.1.1 什么是语言,什么是 C 语言 13 1.1.2 基本常识 14 1.1.3 人与计算机之间的更好的交互 ...
- Xcode 8新功能介绍
概述 Xcode 8正式版在9月13日已经推送给开发者下载,下载之后就出现了很多编译错误,之前的插件也不能用了,但是发现Xcode8把好多不错的插件功能整合到自身了,感觉这点也挺不错. 结合自己遇到的 ...
- JVM内存区域划分(JDK6/7/8中的变化)
前言 Java程序的运行是通过Java虚拟机来实现的.通过类加载器将class字节码文件加载进JVM,然后根据预定的规则执行.Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同 ...
- AP模块NOTE修改API
--创建 AP_NOTES_PUB.Create_Note ( p_api_version IN NUMBER , p_init_msg_list IN VARCHAR2 := FND_API.G_F ...
- [Python] 图像简单处理(PIL or Pillow)
前几天弄了下django的图片上传,上传之后还需要做些简单的处理,python中PIL模块就是专门用来做这个事情的. 于是照葫芦画瓢做了几个常用图片操作,在这里记录下,以便备用. 这里有个字体文件,大 ...
- [python]mysql数据缓存到redis中 取出时候编码问题
描述: 一个web服务,原先的业务逻辑是把mysql查询的结果缓存在redis中一个小时,加快请求的响应. 现在有个问题就是根据请求的指定的编码返回对应编码的response. 首先是要修改响应的bo ...
- Java线程状态
线程跟人类一样拥有自己的生命周期,一条线程从创建到执行完毕的过程即是线程的生命周期,此过程可能在不同时刻处于不同的状态,线程状态正是这小节的主题,线程到底有多少种状态?不同状态之间是如何转化的? 对于 ...