逻辑广场安卓android点赞和取消逻辑如何充值

Android Setting显示开发者选项的逻辑
时间: 11:57:23
&&&& 阅读:531
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&默认User版本没有“开发者选项”,我们可以通过点击版本号7次来显示开发者模式,今天来看下代码中是如何处理的:
首先是packages/apps/Settings/src/com/android/settings/Settings.java的初始化处理:
布尔值showDev是否默认显示“开发者选项”:
final boolean showDev = mDevelopmentPreferences.getBoolean(
DevelopmentSettings.PREF_SHOW,
android.os.Build.TYPE.equals(&eng&));
如果想让开发者选项默认显示,不需要点击7次版本号,可直接将showDev置为true即可:
final boolean showDev =
如果showDev为false,则在如下代码中隐藏“开发者选项”:
if (id == R.id.development_settings) {
if (!showDev) {
target.remove(i);
下面看一下点击版本号显示开发者选项的部分:
代码路径:packages/apps/Settings/src/com/android/settings/DeviceInfoSettings.java
首先是定义点击次数:
static final int TAPS_TO_BE_A_DEVELOPER = 7;
点击版本号的处理逻辑,若mDevHitCountdown小于0,则表示”开发者选项“已经显示,参考Resume函数的处理:
if (preference.getKey().equals(KEY_BUILD_NUMBER)) {
// Don't enable developer options for secondary users.
if (UserHandle.myUserId() != UserHandle.USER_OWNER)
if (mDevHitCountdown & 0) {
if (mDevHitCountdown == 1) {
if (super.ensurePinRestrictedPreference(preference)) {
mDevHitCountdown--;
if (mDevHitCountdown == 0) {
getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE,
Context.MODE_PRIVATE).edit().putBoolean(
DevelopmentSettings.PREF_SHOW, true).apply();
if (mDevHitToast != null) {
mDevHitToast.cancel();
mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_on,
Toast.LENGTH_LONG);
mDevHitToast.show();
} else if (mDevHitCountdown & 0
&& mDevHitCountdown & (TAPS_TO_BE_A_DEVELOPER-2)) {
if (mDevHitToast != null) {
mDevHitToast.cancel();
mDevHitToast = Toast.makeText(getActivity(), getResources().getQuantityString(
R.plurals.show_dev_countdown, mDevHitCountdown, mDevHitCountdown),
Toast.LENGTH_SHORT);
mDevHitToast.show();
} else if (mDevHitCountdown & 0) {
if (mDevHitToast != null) {
mDevHitToast.cancel();
mDevHitToast = Toast.makeText(getActivity(), R.string.show_dev_already,
Toast.LENGTH_LONG);
mDevHitToast.show();
Resume函数:
public void onResume() {
super.onResume();
PreferenceGroup parentPreference = getPreferenceScreen();
mDevHitCountdown = getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE,
Context.MODE_PRIVATE).getBoolean(DevelopmentSettings.PREF_SHOW,
android.os.Build.TYPE.equals(&eng&)) ? -1 : TAPS_TO_BE_A_DEVELOPER;
mDevHitToast =
转载请注明出处:&http://blog.csdn.net/zhoumushui
我的GitHub:&https://github.com/zhoumushui
标签:&&&&&&&&&&&&原文地址:http://blog.csdn.net/zhoumushui/article/details/
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!Android技巧2:登录注册模块解决方案
几乎每个app都会有登录注册的功能,可以看看笔者开发的『南方周末新闻器』,登录、手机注册、忘记密码这些入口,这些功能在app中要如何来实现呢?这个模块看似很简单,但要做好就需要考虑很多细节,比如对用户的输入的容错,操作的提示文案的设定,登录成功保存用户信息等等。
业务流程图
业务逻辑描述
上一节的流程图已经很清晰的展现了登录注册的流程,这里继续用文字说明一下:
1. 点击进入个人中心或者需要用户登录状态的操作,先判断用户是否已经登录。
2. 如果已经登录,则继续后面的业务,否则,跳转到登录页面进行登录。
3. 如果已经有账号,则可以直接登录,或者可以直接选择第三方平台授权登录。
4. 如果未注册账号,则需要先进行账号注册,注册成功后再登录;也可以不注册账号,通过第三方平台授权进行登录。
5. 如果有账号,但忘记密码,则需要进行重置密码,否则直接登录。
登录可以使用账号登录,现在的app基本上都是手机号码登录,注册的时候也是一个手机对应一个账号,通过发送验证码进行验证;用户也可以选择第三方平台进行登录,一般会提供微信、QQ、新浪微博这样的主流社交平台进行授权登录,这里笔者使用了友盟的SDK进行实现。
示例代码:LoginActivity.java
package com.devilwwj.
import android.app.A
import android.content.I
import android.os.B
import android.text.TextU
import android.text.method.HideReturnsTransformationM
import android.text.method.PasswordTransformationM
import android.view.KeyE
import android.view.V
import android.view.inputmethod.EditorI
import android.widget.TextV
import android.widget.T
import com.devilwwj.loginandregister.global.AppC
import com.devilwwj.loginandregister.utils.LogU
import com.devilwwj.loginandregister.utils.ProgressDialogU
import com.devilwwj.loginandregister.utils.RegexU
import com.devilwwj.loginandregister.utils.ShareU
import com.devilwwj.loginandregister.utils.SpU
import com.devilwwj.loginandregister.utils.ToastU
import com.devilwwj.loginandregister.utils.U
import com.devilwwj.loginandregister.views.CleanEditT
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.controller.UMServiceF
import com.umeng.socialize.controller.UMSocialS
import com.umeng.socialize.controller.listener.SocializeListeners.UMAuthL
import com.umeng.socialize.controller.listener.SocializeListeners.UMDataL
import com.umeng.socialize.exception.SocializeE
import java.util.M
import static android.view.View.OnClickL
* @desc 登录界面
* Created by devilwwj on 16/1/24.
public class LoginActivity extends Activity implements OnClickListener {
private static final String TAG = &loginActivity&;
private static final int REQUEST_CODE_TO_REGISTER = 0x001;
// 界面控件
private CleanEditText accountE
private CleanEditText passwordE
// 第三方平台获取的访问token,有效时间,uid
private String accessT
private String expires_
// 整个平台的Controller,负责管理整个SDK的配置、操作等处理
private UMSocialService mController = UMServiceFactory
.getUMSocialService(AppConstants.DESCRIPTOR);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initViews();
// 配置分享平台
ShareUtils.configPlatforms(this);
* 初始化视图
private void initViews() {
accountEdit = (CleanEditText) this.findViewById(R.id.et_email_phone);
accountEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);
accountEdit.setTransformationMethod(HideReturnsTransformationMethod
.getInstance());
passwordEdit = (CleanEditText) this.findViewById(R.id.et_password);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_DONE);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_GO);
passwordEdit.setTransformationMethod(PasswordTransformationMethod
.getInstance());
passwordEdit.setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE
|| actionId == EditorInfo.IME_ACTION_GO) {
clickLogin();
private void clickLogin() {
String account = accountEdit.getText().toString();
String password = passwordEdit.getText().toString();
if (checkInput(account, password)) {
// TODO: 请求服务器登录账号
* 检查输入
* @param account
* @param password
public boolean checkInput(String account, String password) {
// 账号为空时提示
if (account == null || account.trim().equals(&&)) {
Toast.makeText(this, R.string.tip_account_empty, Toast.LENGTH_LONG)
// 账号不匹配手机号格式(11位数字且以1开头)
if ( !RegexUtils.checkMobile(account)) {
Toast.makeText(this, R.string.tip_account_regex_not_right,
Toast.LENGTH_LONG).show();
} else if (password == null || password.trim().equals(&&)) {
Toast.makeText(this, R.string.tip_password_can_not_be_empty,
Toast.LENGTH_LONG).show();
public void onClick(View v) {
Intent intent =
switch (v.getId()) {
case R.id.iv_cancel:
case R.id.btn_login:
clickLogin();
case R.id.iv_wechat:
clickLoginWexin();
case R.id.iv_qq:
clickLoginQQ();
case R.id.iv_sina:
loginThirdPlatform(SHARE_MEDIA.SINA);
case R.id.tv_create_account:
enterRegister();
case R.id.tv_forget_password:
enterForgetPwd();
* 点击使用QQ快速登录
private void clickLoginQQ() {
if (!Utils.isQQClientAvailable(this)) {
ToastUtils.showShort(LoginActivity.this,
getString(R.string.no_install_qq));
loginThirdPlatform(SHARE_MEDIA.QZONE);
* 点击使用微信登录
private void clickLoginWexin() {
if (!Utils.isWeixinAvilible(this)) {
ToastUtils.showShort(LoginActivity.this,
getString(R.string.no_install_wechat));
loginThirdPlatform(SHARE_MEDIA.WEIXIN);
* 跳转到忘记密码
private void enterForgetPwd() {
Intent intent = new Intent(this, ForgetPasswordActivity.class);
startActivity(intent);
* 跳转到注册页面
private void enterRegister() {
Intent intent = new Intent(this, SignUpActivity.class);
startActivityForResult(intent, REQUEST_CODE_TO_REGISTER);
* 授权。如果授权成功,则获取用户信息
* @param platform
private void loginThirdPlatform(final SHARE_MEDIA platform) {
mController.doOauthVerify(LoginActivity.this, platform,
new UMAuthListener() {
public void onStart(SHARE_MEDIA platform) {
LogUtils.i(TAG, &onStart------&
+ Thread.currentThread().getId());
ProgressDialogUtils.getInstance().show(
LoginActivity.this,
getString(R.string.tip_begin_oauth));
public void onError(SocializeException e,
SHARE_MEDIA platform) {
LogUtils.i(TAG, &onError------&
+ Thread.currentThread().getId());
ToastUtils.showShort(LoginActivity.this,
getString(R.string.oauth_fail));
ProgressDialogUtils.getInstance().dismiss();
public void onComplete(Bundle value, SHARE_MEDIA platform) {
LogUtils.i(TAG, &onComplete------& + value.toString());
if (platform == SHARE_MEDIA.SINA) {
accessToken = value.getString(&access_key&);
accessToken = value.getString(&access_token&);
expires_in = value.getString(&expires_in&);
// 获取uid
uid = value.getString(AppConstants.UID);
if (value != null && !TextUtils.isEmpty(uid)) {
// uid不为空,获取用户信息
getUserInfo(platform);
ToastUtils.showShort(LoginActivity.this,
getString(R.string.oauth_fail));
public void onCancel(SHARE_MEDIA platform) {
LogUtils.i(TAG, &onCancel------&
+ Thread.currentThread().getId());
ToastUtils.showShort(LoginActivity.this,
getString(R.string.oauth_cancle));
ProgressDialogUtils.getInstance().dismiss();
* 获取用户信息
* @param platform
private void getUserInfo(final SHARE_MEDIA platform) {
mController.getPlatformInfo(LoginActivity.this, platform,
new UMDataListener() {
public void onStart() {
// 开始获取
LogUtils.i(&getUserInfo&, &onStart------&);
ProgressDialogUtils.getInstance().dismiss();
ProgressDialogUtils.getInstance().show(
LoginActivity.this, &正在请求...&);
public void onComplete(int status, Map info) {
String sns_id = &&;
String sns_avatar = &&;
String sns_loginname = &&;
if (info != null && info.size() != 0) {
LogUtils.i(&third login&, info.toString());
if (platform == SHARE_MEDIA.SINA) { // 新浪微博
sns = AppConstants.SINA;
if (info.get(AppConstants.UID) != null) {
sns_id = info.get(AppConstants.UID)
.toString();
if (info.get(AppConstants.PROFILE_IMAGE_URL) != null) {
sns_avatar = info
.get(AppConstants.PROFILE_IMAGE_URL)
.toString();
if (info.get(AppConstants.SCREEN_NAME) != null) {
sns_loginname = info.get(
AppConstants.SCREEN_NAME)
.toString();
} else if (platform == SHARE_MEDIA.QZONE) { // QQ
sns = AppConstants.QQ;
if (info.get(AppConstants.UID) == null) {
ToastUtils
.showShort(
LoginActivity.this,
getString(R.string.oauth_fail));
sns_id = info.get(AppConstants.UID)
.toString();
sns_avatar = info.get(
AppConstants.PROFILE_IMAGE_URL)
.toString();
sns_loginname = info.get(
AppConstants.SCREEN_NAME)
.toString();
} else if (platform == SHARE_MEDIA.WEIXIN) { // 微信
sns = AppConstants.WECHAT;
sns_id = info.get(AppConstants.OPENID)
.toString();
sns_avatar = info.get(
AppConstants.HEADIMG_URL)
.toString();
sns_loginname = info.get(
AppConstants.NICKNAME).toString();
// 这里直接保存第三方返回来的用户信息
SpUtils.putBoolean(LoginActivity.this,
AppConstants.THIRD_LOGIN, true);
LogUtils.e(&info&, sns + &,& + sns_id + &,&
+ sns_loginname);
// TODO: 这里执行第三方连接(绑定服务器账号)
} catch (Exception e) {
e.printStackTrace();
示例代码:SignUpActivity.java
package com.devilwwj.
import android.app.A
import android.os.B
import android.text.TextU
import android.util.L
import android.view.KeyE
import android.view.V
import android.view.View.OnClickL
import android.view.inputmethod.EditorI
import android.widget.B
import android.widget.TextV
import android.widget.TextView.OnEditorActionL
import com.devilwwj.loginandregister.utils.RegexU
import com.devilwwj.loginandregister.utils.ToastU
import com.devilwwj.loginandregister.utils.VerifyCodeM
import com.devilwwj.loginandregister.views.CleanEditT
* @desc 注册界面
* 功能描述:一般会使用手机登录,通过获取手机验证码,跟服务器交互完成注册
* Created by devilwwj on 16/1/24.
public class SignUpActivity extends Activity implements OnClickListener{
private static final String TAG = &SignupActivity&;
// 界面控件
private CleanEditText phoneE
private CleanEditText passwordE
private CleanEditText verifyCodeE
private Button getVerifiCodeB
private VerifyCodeManager codeM
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);
initViews();
codeManager = new VerifyCodeManager(this, phoneEdit, getVerifiCodeButton);
* 通用findViewById,减少重复的类型转换
* @param id
@SuppressWarnings(&unchecked&)
public final
E getView(int id) {
return (E) findViewById(id);
} catch (ClassCastException ex) {
Log.e(TAG, &Could not cast View to concrete class.&, ex);
private void initViews() {
getVerifiCodeButton = getView(R.id.btn_send_verifi_code);
getVerifiCodeButton.setOnClickListener(this);
phoneEdit = getView(R.id.et_phone);
phoneEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);// 下一步
verifyCodeEdit = getView(R.id.et_verifiCode);
verifyCodeEdit.setImeOptions(EditorInfo.IME_ACTION_NEXT);// 下一步
passwordEdit = getView(R.id.et_password);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_DONE);
passwordEdit.setImeOptions(EditorInfo.IME_ACTION_GO);
passwordEdit.setOnEditorActionListener(new OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
// 点击虚拟键盘的done
if (actionId == EditorInfo.IME_ACTION_DONE
|| actionId == EditorInfo.IME_ACTION_GO) {
private void commit() {
String phone = phoneEdit.getText().toString().trim();
String password = passwordEdit.getText().toString().trim();
String code = verifyCodeEdit.getText().toString().trim();
if (checkInput(phone, password, code)) {
// TODO:请求服务端注册账号
private boolean checkInput(String phone, String password, String code) {
if (TextUtils.isEmpty(phone)) { // 电话号码为空
ToastUtils.showShort(this, R.string.tip_phone_can_not_be_empty);
if (!RegexUtils.checkMobile(phone)) { // 电话号码格式有误
ToastUtils.showShort(this, R.string.tip_phone_regex_not_right);
} else if (TextUtils.isEmpty(code)) { // 验证码不正确
ToastUtils.showShort(this, R.string.tip_please_input_code);
} else if (password.length() & 6 || password.length() & 32
|| TextUtils.isEmpty(password)) { // 密码格式
ToastUtils.showShort(this,
R.string.tip_please_input_6_32_password);
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send_verifi_code:
// TODO 请求接口发送验证码
codeManager.getVerifyCode(VerifyCodeManager.REGISTER);
登录注册的解决方案,笔者已经做成一个Demo放到github了,大家在实际开发的时候可以参考着根据自身的业务进行调整,但基本上不会差太多,第三方登录、验证码这个都可以选用第三方服务来实现,github地址如下:您的位置: →
→ 逻辑路径手游 v0.32 安卓版
逻辑路径手游 v0.32 安卓版逻辑路径游戏安卓版下载|
网友评分:8
软件大小:40.3M
软件语言:中文
软件类型:国产软件
软件类别:免费软件 / 休闲益智
更新时间:
软件等级:
官方网站:暂无
运行环境:Android
软件厂商:
顶好评:50%
同类相关手游
48.8M/中文/10.032.8M/中文/10.01.5M/中文/10.020.6M/中文/10.058M/中文/10.0
逻辑路径安卓版手游是一款类似于以及迷宫的,游戏总体设计为关卡模式,每一关看似简单,但其中的设计也极为巧妙,细心观察即可发现破绽,喜欢就来绿色资源网下载吧!逻辑路径游戏简介:逻辑路径是一款休闲。这款手游非常烧脑,其要求玩家具备一定程度的立体几何思维;游戏多达百关的挑战,足以让任何玩家沉溺其中无法自拔;玩法初看上去可能会摸不清头脑,但玩过几关之后,你就会清楚怎么操作!逻辑路径手游特色:1、创新、基于视角的游戏设置;2、抚慰人心、休闲的氛围;3、要解决100个不断让人惊讶的关卡;4、简约、但唤起独特情感的图形设计;5、可很容易的学会有多层深度的力学构造。游戏亮点:-Logic Path 是一款创新、很容易学会、但同时又提供很多深度和挑战的益智游戏。-其可到达性通过自行解释的游戏设置以及无游戏内文字得以强化。这一简便性与抚慰人心的背景音乐相结合,-使得玩这款游戏成为一种平和、休闲的体验、同时又保持新奇与让人兴奋。在这段有 100 个关卡的旅程中,Logic Path 提出各种难度不断增加的题目,-以便您在自己空闲时可以完成。游戏没有高分、没有挑战、也没有时间限制。您可尽可能按自己喜欢进行试验、-得出解决方案。游戏提供很多脑筋急转弯、变化和惊喜,让您始终充满兴趣。
其他版本下载
逻辑路径手游 v0.32 安卓版
软件无法下载或下载后无法使用,请点击报错,谢谢!
请描述您所遇到的错误,我们将尽快予以修正,谢谢!
*必填项,请输入内容
本类下载排行
7.51 10.02 7.53 10.04 5.05 7.56 10.07 10.08 10.09 8.310 10.011 10.012 8.013 10.014 10.015
本类精品手游
2.6M/中文/6.680.1M/多国语言[中文]/6.4171M/中文/10.048.7M/中文/5.026.7M/中文/10.043.6M/英文/7.534.5M/中文/6.6
装机必备软件
本类集合手游&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Android app自动更新逻辑与实现(真实项目的自动更新业务逻辑
摘要:androidapp在用户安装到手机后版本需要升级,一般可以采取到应用商店或者官网下载最新版本,但这种方式会给用户带来多余的操作,同时不方便我们控制用户的版本。所以一般我们会在app内部集成自动更新功能注:以下逻辑需要服务器支持(当然如果服务器不支持也就做不了自动更新)一、检测新版本更新升级第一步肯定是检测用户当前安装的app版本下面是获取当前版本代码/***获取版本名称*@paramcontext上下文*@return版本名称*/publicstaticStringgetV
android app在用户安装到手机后版本需要升级,一般可以采取到应用商店或者官网下载最新版本,但这种方式会给用户带来多余的操作,同时不方便我们控制用户的版本。所以一般我们会在app内部集成自动更新功能
注:以下逻辑需要服务器支持(当然如果服务器不支持也就做不了自动更新)
一、检测新版本 更新升级第一步肯定是检测用户当前安装的app版本
下面是获取当前版本代码
* 获取版本名称 * @param context 上下文 * @return 版本名称
public static String getVersionName(Context context) {
//获取包管理器
PackageManager pm = context.getPackageManager();
//获取包信息
PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
//返回版本号
return packageInfo.versionN
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
* 获取版本号 * @param context 上下文 * @return 版本号
public static String getVersionCode(Context context) {
//获取包管理器
PackageManager pm = context.getPackageManager();
// 获取包信息
PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
//返回版本号
return packageInfo.versionN
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return &&;
获取到版本名称和版本号后(比对时根据需要比对一个即可),进行联网请求接口(这里需要服务器支持),将获取到的版本号发给后台服务器,服务器比对当前最新版本的版本号,如果是最新版返回数据告知app端不需要更新,如果不是返回最新版本相关信息,包括版本号、下载地址、此次更新内容、是否强制更新等等 二、检测到新版本后
又分为新版本强制更新、新版本用户选择更新。新版本强制更新时用户如果选择不更新则直接退出应用,如果选择更新后台直接下载新版本,同时当前app不再响应用户操作。新版本用户选择更新则比较简单,根据用户选择做出相应操作即可
根据项目当前的联网框架,用服务器返回的URL下载相应apk文件即可,这里不同联网框架下载代码不同,大家可以自行搜索下自己用的联网框架怎么下载文件,这里不再举例
下载的同时最好弹出一个通知栏实时更新下载进度,给用户提示下面是创建通知
private NotificationM
private NotificationCompat.B
manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
builder = new NotificationCompat.Builder(context);
builder.setProgress(100, 0, false);
builder.setContentTitle(&开始下载&);
builder.setSmallIcon(R.mipmap.app_ico);
builder.setColor(context.getResources().getColor(R.color.title_blue));
builder.setTicker(&已开始下载&);
builder.setAutoCancel(true);
build = builder.build();
manager.notify(1, build);
在联网下载过程中进度回调将进度更新到通知栏(这里采用了handler更新进度),当进度达到100%时,说明apk文件下载完成,则点击通知栏时需要调用系统安装软件界面。具体代码如下:
private Handler updateProgressHandle = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case DOWNLOADING:
//更新进度
if (progress != xprogress) {
builder.setContentTitle(&已下载& + progress + &%&);
builder.setProgress(100, progress, false);
builder.setAutoCancel(true);
build = builder.build();
manager.notify(1, build);
xprogress =
case DOWNLOAD_FINISH:
//下载完成,点击可安装。
File apkFile = new File(savePath + versionName+&.apk&);
if (!apkFile.exists())
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse(&file://& + apkFile.toString());
intent.setDataAndType(uri, &application/vnd.android.package-archive&);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
builder.setTicker(&下载已完成&);
builder.setContentTitle(&下载已完成&);
builder.setProgress(100, progress, false);
build = builder.build();
manager.notify(1, build);
以上业务逻辑是从之前项目中抽取出来的,当然软件版本升级还需要根据具体项目考虑一些别的需求,如在打开应用时自动检测更新和手动检测更新、用户选择更新时用户可以选择忽略此版本。(忽略此版本,可以在sp中或是其他地方存下当前忽略的最新版本的版本号,再向服务器获取当前最新版本版本号时,查找是否已经忽略,忽略则不做处理。注意:不能简单只存一个是否忽略的标记,我之前接收别的项目的时候就见过点击忽略此版本就只存了一个忽略标记,这样会使下次有别的版本更新,软件依然会认为用户已经忽略了)
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
新用户大礼包!
现在注册,免费体验40+云产品,及域名优惠!
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Android app自动更新逻辑与实现(真实项目的自动更新业务逻辑相关信息,包括
的信息,所有Android app自动更新逻辑与实现(真实项目的自动更新业务逻辑相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International}

我要回帖

更多关于 android购物车逻辑 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信