本项目展示的是 DroiBaaS 相关功能
- 建立用户系统
- 提供注册/登录功能
- 修改密码
- 上传头像/显示头像
在首页展示一些banner信息用于活动推广等作用
效果图如下:
在不同的界面展示不同的app list
用关键字对应用进行简单的筛选
其他功能主要放在我的页面中:登录功能入口、版本更新、用户反馈等。
我的页面效果图如下:
传统方案需要服务端与客户端开发人员进行沟通,确定交互数据的协议格式。
服务端负责:搭建业务服务器,进行服务端逻辑代码的编写,提供数据api接口给客户端调用。
客户端负责:编写界面,使用api接口从服务端读取数据进行数据交互。
-
DroiBaaS
提供了DroiUser
类来帮助开发者建立用户系统 在这里介绍通过继承的方式使用DroiUser
,这里我创建了一个类MyUser
继承于DroiUser
,在这个类中添加一些我们需要的属性,比如:address、headIcon等public class MyUser extends DroiUser { @DroiExpose private String address; @DroiExpose private DroiFile headIcon; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public DroiFile getHeadIcon() { return headIcon; } public void setHeadIcon(DroiFile headIcon) { this.headIcon = headIcon; } }
-
注册用户
DroiUser user = new DroiUser(); user.setUserId(email); user.setPassword(password); user.signUpInBackground(new DroiCallback<Boolean>() { @Override public void result(Boolean aBoolean, DroiError droiError) { showProgress(false); if (droiError.isOk()) { // 注册成功 } else { // 注册失败,可以通过 droiError.getCode 获取错误码 } } });
-
登录
DroiUser.loginInBackground(email, password, MyUser.class, new DroiCallback<DroiUser>() { @Override public void result(DroiUser droiUser, DroiError droiError) { showProgress(false); if (droiError.isOk()) { // 登录成功 } else { // 登录失败,可以通过 droiError.getCode 获取错误码 } } });
-
修改密码
String oldPassword = "oldPassword"; String newPassword = "newPassword"; // 一般从EditText获得 DroiUser myUser = DroiUser.getCurrentUser(); if (myUser != null && myUser.isAuthorized() && !myUser.isAnonymous()) { myUser.changePasswordInBackground(oldPassword, newPassword, new DroiCallback<Boolean>() { @Override public void result(Boolean aBoolean, DroiError droiError) { if (aBoolean) { // 修改成功 } else { // 修改失败 } } }); }
-
上传头像
DroiFile headIcon = new DroiFile(new File(path)); //path 是图片路径 MyUser user = DroiUser.getCurrentUser(MyUser.class); user.setHeadIcon(headIcon); user.saveInBackground(new DroiCallback<Boolean>() { @Override public void result(Boolean aBoolean, DroiError droiError) { if (aBoolean) { // 上传成功 } else { // 上传失败 } } });
-
显示头像
MyUser user = DroiUser.getCurrentUser(MyUser.class); if (user != null && user.isAuthorized() && !user.isAnonymous()) { if (user.getHeadIcon() != null) { user.getHeadIcon().getUriInBackground(new DroiCallback<Uri>() { @Override public void result(Uri uri, DroiError droiError) { if (droiError.isOk()){ // 加载头像 } } }); } }
通过DroiBaaS
的web控制台可以创建Banner
类,并且可以通过增加列的方式增加属性。
可以通过增加行的方式来添加一条数据。
然后需要在客户端创建一个类来对应于DroiBaaS
云端的数据,如下:
public class Banner extends DroiObject {
@DroiExpose
private String appId;
@DroiExpose
private String imgUrl;
public void setAppId(String appId) {
this.appId = appId;
}
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
}
public String getImgUrl() {
return imgUrl;
}
public String getAppId() {
return appId;
}
}
在客户端可以通过DroiQuery
来查询保存在云端的数据,并且进行展示:
DroiQuery query = DroiQuery.Builder.newBuilder().limit(4).query(Banner.class).build();
query.runQueryInBackground(new DroiQueryCallback<Banner>() {
@Override
public void result(List<Banner> list, DroiError droiError) {
if (droiError.isOk() && list.size() >0) {
// 通知 view 更新
} else {
// 做请求失败处理
}
}
});
和Banner
一样也需要通过DroiBaaS
的web控制台可以创建AppInfo
类,并且可以通过增加列的方式增加属性。
可以通过增加行的方式来添加一条数据。
然后需要在客户端创建一个类来对应于DroiBaaS
云端的数据,如下:
public class AppInfo extends DroiObject {
@DroiExpose
private String appId;
@DroiExpose
private String icon;
@DroiExpose
private String name;
@DroiExpose
private int count;
@DroiExpose
private int rating;
@DroiExpose
private int size;
@DroiExpose
private String intro;
@DroiExpose
private String brief;
@DroiExpose
private String version;
@DroiExpose
private String apkUrl;
@DroiExpose
private String type;
@DroiExpose
private String mainType;
@DroiExpose
private String imageUrl;
// setter/getter方法不列出
}
接下来在客户端可以通过DroiQuery
来查询保存在云端的数据,并且进行展示:
DroiQuery query = DroiQuery.Builder.newBuilder().limit(10).offset(indexNum * 10).query(AppInfo.class).build();
/* 可以给查询设置不同的查询条件,查询不同类别的app等。
DroiCondition cond = DroiCondition.cond("mainType", DroiCondition.Type.EQ, "app");
DroiQuery query = DroiQuery.Builder.newBuilder().limit(10).offset(indexNum * 10).query(AppInfo.class).where(cond).build();
*/
query.runQueryInBackground(new DroiQueryCallback<AppInfo>() {
@Override
public void result(List<AppInfo> list, DroiError droiError) {
refreshing = false;
if (droiError.isOk() && list.size() >0) {
// 通知 view 更新
} else {
// 做请求失败处理
}
}
});
这个功能用来根据关键字进行一些简单的筛选,同样是通过DroiQuery
来查询。
// 通过Condition对字段的字符串进行一些筛选
DroiCondition cond = DroiCondition.cond("name", DroiCondition.Type.CONTAINS, appName);
DroiCondition cond1 = DroiCondition.cond("brief", DroiCondition.Type.CONTAINS, appName);
DroiQuery = DroiQuery.Builder.newBuilder().limit(10).offset(indexNum * 10).query(AppInfo.class).where(cond.or(cond1)).build();
query.runQueryInBackground(new DroiQueryCallback<AppInfo>() {
@Override
public void result(List<AppInfo> list, DroiError droiError) {
refreshing = false;
if (droiError.isOk() && list.size() >0) {
// 通知 view 更新
} else {
// 做请求失败处理
}
}
});
其他一些功能可以通过在我的页面点击按钮来调用,也有一些功能可以在初始化时添加。
-
版本更新 在此工程中,总共在两处添加版本更新sdk。 一次是在应用进入时,在入口activity的onCreate中,添加了如下代码:
DroiUpdate.update(this);
还有一次是在我的页面中,通过手动点击的方式调用:
@Override public void onClick(View v) { switch (v.getId()) { // 其他case case R.id.mine_frag_update: //手动更新 DroiUpdate.manualUpdate(mContext); break; } }
-
意见反馈 我们需要通过意见反馈来知道用户对应用的评价,通过点击进入反馈sdk的界面:
@Override public void onClick(View v) { switch (v.getId()) { // 其他case case R.id.mine_frag_update: //手动更新 DroiFeedback.callFeedback(mContext); break; } }
-
消息推送 通过消息推送增加应用的日活,方便活动的推广等。只需在Application中添加一行代码即可实现:
DroiPush.initialize(this);