有没有人告诉我 对唱,我之前用的Android是内测版,更新之后变成公测版!为什么我就不能使用稳定版的呢?

相关文章推荐
自动更新,其实说白了,就是下载apk,安装apk。
代码下载地址:Android自动更新的demo
实现自动更新的路径两种:
第一种:(可以参考http://blog.csdn.net/furon...
1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。
2.从服务器获取版本号(版本号存在于xml文件中)并与当前...
1.检测当前版本的信息AndroidManifest.xml–>manifest–>[Android]
2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹...
现在很多的App中都会有一个检查版本的功能。例如斗鱼TV App的设置界面下:
当我们点击检查更新的时候,就会向服务器发起版本检测的请求。一般的处理方式是:服务器返...
项目中基本都离不开版本更新,于是自己也写了一个.如有不足之处,请帮忙指出,谢谢!import android.app.A
import android.app.AlertD...
问题:在Android7.0的手机上,自动更新的时候出现包解析异常,在其他的手机上没有这个问题。
Android7.0引入私有目录被限制访问和StrictMode API 。私有目...
AutoUpdateProject最新版本已经到1.1.4最新版本及说明请关注GitHub,欢迎Star。github地址:/MZCretin/AutoUpdate...
这是一个比较简单的程序,但网上还是有很多人问起这个问题,并且回答的人,也没有完全回答正确,然后又有很多人去转载非正确的答案,使别人用了之后还是有问题。
如何下载新版本的文件,这里就不赘述了,这...
实现简单安卓app自动更新:
1.服务端提供接口
2.客户端获取接口数据,解析,获取最新版本信息
3.安装最新版本...
先来看看要实现的效果图:
对于安卓用户来说,手机应用市场说满天飞可是一点都不夸张,比如小米,魅族,百度,360,机锋,应用宝等等,当我们想上线一款新版本APP时,先不说渠道打包的...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)手机签到经验翻倍!快来扫一扫!
玩Android手机的,其实我们不要太在意运行内存、现在来告诉你,运行内存不代表一切!
2730浏览 / 35回复
现在告诉你,运行不代表一切,我们为什么不需要手动关闭程序,看下下面就知道了:
提前学习点安卓知识不用在意剩余内存的大小,其实很多人都是把使用其他系统的习惯带过来来了。android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系。如果你知道java,就能更清楚这机制了。其实和java的垃圾回收机制类似,系统有一个规则来回收内存。进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊。但事实上他并不影响速度。相反加快了下次启动应用的速度。这本来就是android标榜的优势之一,如果人为去关闭进程,没有太大必要。特别是使用自动关进程的软件。(这里解决了大家非要关进程的误区!)到这里有人会说了,那为什么内存少的时候运行大型程序会慢呢?其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。所以,论坛上有个更改内存阀值的程序可以有一定改善。但改动也可能带来一些问题,取决于值的设定。那么,进程管理软件有无必要呢?有的。就是在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显著的提高运行速度。但一些小程序,完全可交由系统自己管理。谈到这里,可能有的朋友会问,如果不关程序是不是会更耗电。我就说说android后台的原理,你就明白了。android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。所以为什么有的程序切出去重进会到主界面。但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务。服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了。这个在进程管理软件里能看到,标签是service。至于广播什么的我就不涉及了。所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个android的优点呢?(告诉我们如何合理使用进程管理软件)还有一个,为什么android一个应用看起来那么耗内存。大家知道,android上的应用是java,当然需要虚拟机,而android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机。这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存。(跟塞班也不一样,案桌不容易死机重启)以上这些设计确保了android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现。大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,很没必要。大家不妨按我说的习惯来用用这个系统
对 楼主 幻觉Oo 说:=========================支持
对 楼主 幻觉Oo 说:=========================真的很实用,学习了,多谢。我就可能是被windows毒害得太深了,每天清理内存 杀进程不下几十次。现在习惯了,还不知一时还能不能戒掉呢。呵呵。
很实用 不用再看手机运行内存了
安卓不容易死机?
说法是不错,问题是耗资源啊。512RAM不太够用,低端机的运行内存才200多更别谈了,机器越用越卡:平时还只是浏览网页,开个QQ,然后就打电话也会卡的不行
对 楼主 幻觉Oo 说:=========================受教了,一直以为要结束那些后台进程来着
吸收了……
吸收了……
支持键盘翻页 ( 左右 )&
可能感兴趣的板块:
用户名/注册邮箱/注册手机号
其他第三方号登录请输入正确的邮箱
已有帐号请点击
帐号创建成功!
我们刚刚给你发送了一封验证邮件
请在48小时内查收邮件,并按照提示验证邮箱
感谢你对微口网的信任与支持
如果你没有收到邮件,请留意垃圾箱 或 重新发送
你输入的邮箱还未注册
还没有帐号请点击
你输入的邮箱还未注册
又想起来了?
邮件发送成功!
我们刚刚给你发送了一封邮件
请在5分钟内查收邮件,并按照提示重置密码
感谢你对微口网的信任与支持
如果你没有收到邮件,请留意垃圾箱 或 重新发送
对不起,你的帐号尚未验证
如果你没有收到邮件,请留意垃圾箱 或
意见与建议
请留下您的联系方式
* 留下您正确的联系方式,以便工作人员尽快与你取得联系
转藏至我的藏点博客分类:
1、之前写过一篇说版本升级的,用到广播。感觉乱用,搞的有点复杂,且混乱。现在又用到了版本升级功能,然后梳理下思路,使用回调接口重新写了个。
2、需求同,部分源码已上传。
3、增加了点小功能:
1&、可以手动检查升级;
2&、显示升级日志;
3&、修改上篇博客潜在问题:
问题:后台查询到更新,提示更新的AlertDialog只能在启动更新的页面弹出;如果离开此页面,抛异常。
解决:在app的所有页面顶层弹出,参考代码:
//设置dialog
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
//加入权限
&uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /&
4、截图如下:
5、上代码(代码才能说明一切):
(1)、DownloadCallback.java
* 下载数据接口
* @author: aokunsang
public interface DownloadCallback {
* 下载前准备
public void onDownloadPreare();
* 下载进度更新
* @param progress 进度值
public void onChangeProgress(int progress);
* 下载完成
* @param success
下载成功标示
* @param errorMsg 下载失败显示内容
public void onCompleted(boolean success,String errorMsg);
* 取消下载
public boolean onCancel();
(2)、DownloadInstall.java
* @author: aokunsang
public class DownloadInstall implements DownloadCallback {
private Context mC
private String apkPath,apkV
private int apkC
private LayoutI
private TextView textV
private ProgressBar progressV
private AlertDialog downloadD
//下载弹出框
private boolean interceptFlag =
//是否取消下载
public DownloadInstall(Context mContext,String apkPath,String apkVersion,int apkCode) {
this.mContext = mC
this.apkCode = apkC
this.apkPath = apkP
this.apkVersion = apkV
inflater = LayoutInflater.from(mContext);
public boolean onCancel() {
return interceptF
public void onChangeProgress(int progress) {
progressView.setProgress(progress);
//设置下载进度
textView.setText("进度:"+progress+"%");
public void onCompleted(boolean success, String errorMsg) {
if(downloadDialog!=null){
downloadDialog.dismiss();
if(success){
//更新成功
alearyUpdateSuccess();
installApk();
Toast.makeText(mContext, errorMsg, Toast.LENGTH_SHORT).show();
public void onDownloadPreare() {
if(IntentUtil.checkSoftStage(mContext)){
File file = new File(Const.apkSavepath);
if(!file.exists()){
file.mkdir();
Builder builder = new AlertDialog.Builder(mContext);
builder.setIcon(R.drawable.upgrade).setTitle("正在更新版本");
//---------------------------- 设置在对话框中显示进度条 --------------------
View view = inflater.inflate(R.layout.upgrade_apk, null);
textView = (TextView)view.findViewById(R.id.progressCount_text);
textView.setText("进度:0");
progressView = (ProgressBar)view.findViewById(R.id.progressbar);
builder.setView(view);
builder.setNegativeButton("取消", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
interceptFlag =
downloadDialog = builder.create();
downloadDialog.show();
* 升级成功,更新升级日期和版本号,和版本code
private void alearyUpdateSuccess(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SharedPreferences sharedPreference = mContext.getSharedPreferences(UpdateShared.SETTING_UPDATE_APK_INFO, 0);
sharedPreference.edit().putString(UpdateShared.UPDATE_DATE, sdf.format(new Date()))
.putString(UpdateShared.APK_VERSION, apkVersion).putInt(UpdateShared.APK_VERCODE, apkCode).commit();
private void installApk(){
File file = new File(apkPath);
if(!file.exists()){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
mContext.startActivity(intent);
(3)、DownloadAsyncTask.java
* 异步下载数据
* @author: aokunsang
public class DownloadAsyncTask extends AsyncTask&String, Integer, String& {
private DownloadCallback downCallB
private HttpURLConnection urlC
public DownloadAsyncTask(DownloadCallback downloadCallback){
this.downCallBack = downloadC
protected void onPreExecute() {
downCallBack.onDownloadPreare();
super.onPreExecute();
protected String doInBackground(String... args) {
String apkDownloadUrl = args[0]; //apk下载地址
String apkPath = args[1];
//apk在sd卡中的安装位置
String result = "";
if(!IntentUtil.checkURL(apkDownloadUrl)){
result = "netfail";
InputStream is =
FileOutputStream fos =
URL url = new URL(apkDownloadUrl);
urlConn = (HttpURLConnection)url.openConnection();
is = urlConn.getInputStream();
int length = urlConn.getContentLength();
//文件大小
fos = new FileOutputStream(apkPath);
int count = 0,numread = 0;
byte buf[] = new byte[1024];
while(!downCallBack.onCancel()&& (numread = is.read(buf))!=-1){
int progressCount =(int)(((float)count / length) * 100);
publishProgress(progressCount);
fos.write(buf, 0, numread);
fos.flush();
result = "success";
} catch (Exception e) {
e.printStackTrace();
result = "fail";
if(fos!=null)
fos.close();
if(is!=null)
is.close();
} catch (IOException e) {
e.printStackTrace();
result = "fail";
protected void onProgressUpdate(Integer... values) {
downCallBack.onChangeProgress(values[0]);
super.onProgressUpdate(values);
protected void onPostExecute(String result) {
if(downCallBack.onCancel()){
downCallBack.onCompleted(false, "版本更新下载已取消。");
}else if("success".equals(result)){
downCallBack.onCompleted(true, null);
}else if("netfail".equals(result)){
downCallBack.onCompleted(false, "连接服务器失败,请稍后重试。");
downCallBack.onCompleted(false, "版本更新失败,请稍后重试。");
super.onPostExecute(result);
protected void onCancelled() {
if(urlConn!=null){
urlConn.disconnect();
super.onCancelled();
(4)、DownloadManager.java
* 下载管理
* @author: aokunsang
public class DownloadManager{
private Context mC
final static int CHECK_FAIL = 0;
final static int CHECK_SUCCESS = 1;
final static int CHECK_NOUPGRADE = 2;
final static int CHECK_NETFAIL = 3;
private ApkI
private AlertDialog noticeD
//提示弹出框
private ProgressDialog progressD
private boolean isA
//是否主动检查软件升级
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public DownloadManager(Context mContext,boolean isAccord){
this.mContext = mC
this.isAccord = isA
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
if(progressDialog!=null){
progressDialog.dismiss();
switch(msg.what){
case CHECK_SUCCESS:{
showNoticeDialog();
case CHECK_NOUPGRADE:{
//不需要更新
if(isAccord) Toast.makeText(mContext, "当前版本是最新版。", Toast.LENGTH_SHORT).show();
case CHECK_NETFAIL:{
if(isAccord) Toast.makeText(mContext, "网络连接不正常。", Toast.LENGTH_SHORT).show();
case CHECK_FAIL:{
if(isAccord) Toast.makeText(mContext, "从服务器获取更新数据失败。", Toast.LENGTH_SHORT).show();
/* 检查下载更新 [apk下载入口] */
public void checkDownload(){
if(isAccord) progressDialog = ProgressDialog.show(mContext, "", "请稍后,正在检查更新...");
new Thread() {
public void run() {
if(!IntentUtil.isConnect(mContext)){ //检查网络连接是否正常
handler.sendEmptyMessage(CHECK_NETFAIL);
}else if(checkTodayUpdate() || isAccord){//判断今天是否已自动检查过更新 ;如果手动检查更新,直接进入
String result = HttpRequestUtil.getSourceResult(Const.apkCheckUpdateUrl, null, mContext);
//从服务器下载数据有中文,所以服务器对数据进行了编码;在这里需要解码
result = Escape.unescape(result);
JSONObject obj = new JSONObject(result);
String apkVersion = obj.getString("apkVersion");
int apkCode = obj.getInt("apkVerCode");
String apkSize = obj.getString("apkSize");
String apkName = obj.getString("apkName");
String downloadUrl = obj.getString("apkDownloadUrl");
String apkLog = obj.getString("apklog");
apkinfo = new ApkInfo(downloadUrl, apkVersion, apkSize, apkCode, apkName, apkLog);
if(apkinfo!=null && checkApkVercode()){
//检查版本号
alreayCheckTodayUpdate();
//设置今天已经检查过更新
handler.sendEmptyMessage(CHECK_SUCCESS);
handler.sendEmptyMessage(CHECK_NOUPGRADE);
} catch (Exception e) {
e.printStackTrace();
handler.sendEmptyMessage(CHECK_FAIL);
}.start();
/* 弹出软件更新提示对话框*/
private void showNoticeDialog(){
StringBuffer sb = new StringBuffer();
sb.append("版本号:"+apkinfo.getApkVersion()+"\n")
.append("文件大小:"+apkinfo.getApkSize()+"\n")
.append("更新日志:\n"+apkinfo.getApkLog());
Builder builder = new AlertDialog.Builder(mContext);
builder.setIcon(R.drawable.upgrade).setTitle("版本更新").setMessage(sb.toString());
builder.setPositiveButton("下载", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
String apkPath = Const.apkSavepath + apkinfo.getApkName();
DownloadCallback downCallback = new DownloadInstall(mContext, apkPath, apkinfo.getApkVersion(), apkinfo.getApkCode());
DownloadAsyncTask request = new DownloadAsyncTask(downCallback);
request.execute(apkinfo.getDownloadUrl(),apkPath);
dialog.dismiss();
builder.setNegativeButton("以后再说", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
noticeDialog = builder.create();
noticeDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
//设置最顶层Alertdialog
noticeDialog.show();
* 根据日期检查是否需要进行软件升级
* @throws Exception
private boolean checkTodayUpdate() {
SharedPreferences sharedPreference = mContext.getSharedPreferences(UpdateShared.SETTING_UPDATE_APK_INFO, 0);
String checkDate = sharedPreference.getString(UpdateShared.CHECK_DATE, "");
String updateDate = sharedPreference.getString(UpdateShared.UPDATE_DATE, "");
if("".equals(checkDate) && "".equals(updateDate)){
//刚安装的新版本,设置详细信息
int verCode = IntentUtil.getCurrentVersionCode(mContext);
String versionName = IntentUtil.getCurrentVersionName(mContext);
String dateStr = sdf.format(new Date());
sharedPreference.edit().putString(UpdateShared.CHECK_DATE, dateStr)
.putString(UpdateShared.UPDATE_DATE, dateStr)
.putString(UpdateShared.APK_VERSION, versionName)
.putInt(UpdateShared.APK_VERCODE, verCode).commit();
//判断defaultMinUpdateDay天内不检查升级
if((new Date().getTime()-sdf.parse(updateDate).getTime())/&Const.defaultMinUpdateDay){
}else if(checkDate.equalsIgnoreCase(sdf.format(new Date()))){//判断今天是否检查过升级
} catch (Exception e) {
e.printStackTrace();
* 设置今天已经检查过升级
private void alreayCheckTodayUpdate(){
String date = sdf.format(new Date());
SharedPreferences sharedPreference = mContext.getSharedPreferences(UpdateShared.SETTING_UPDATE_APK_INFO, 0);
sharedPreference.edit().putString(UpdateShared.CHECK_DATE, date).commit();
* 检查版本是否需要更新
private boolean checkApkVercode(){
SharedPreferences sharedPreference = mContext.getSharedPreferences(UpdateShared.SETTING_UPDATE_APK_INFO, 0);
int verCode = sharedPreference.getInt(UpdateShared.APK_VERCODE, 0);
if(apkinfo.getApkCode()&verCode){
static interface UpdateShared{
String SETTING_UPDATE_APK_INFO = "cbt_upgrade_setting";
String UPDATE_DATE = "updatedate";
String APK_VERSION = "apkversion";
String APK_VERCODE = "apkvercode";
String CHECK_DATE = "checkdate";
代码内容我不讲解,使用的是回调接口。里面的各种检查是否升级,参考上一篇软件更新博客。
(5)、其他操作类:
a、Const.java是一个常量存储类,保存检查更新地址等;
b、Escape.java是个URL解码编码类;
c、HttpRequestUtil.java获取远程数据类;
d、IntentUtil.java工具类,如:检查网络连接状态等。
(以上类参考附件源码)
* apk更新信息
* @author: aokunsang
public class ApkInfo implements Serializable {
private static final long serialVersionUID = 1L;
private String downloadU
//下载地址
private String apkV
private String apkS
//apk文件大小
private int apkC
//apk版本号(更新必备)
private String apkN
private String apkL
//apk更新日志
setter and getter...
(6)、服务器代码(这里的apklog可以是个txt文档,在UI上下载展示,我做的比较简单):
获取apk更新信息
* {apkVersion:'1.10',apkSize:'36K',apkVerCode:2,apkName:'1.1.apk',apkDownloadUrl:'http://localhost:8080/myapp/1.1.apk',apklog:'1、修改页面;\n2、修改字体'}
@Action(value="checkUpdateApk")
public String updateApk(){
ResourceLoader loader = new DefaultResourceLoader();
Properties pp =
InputStream is = loader.getResource("classpath:config/sysconf.properties").getInputStream();
pp = new Properties();
pp.load(new InputStreamReader(is, "utf-8"));
} catch (Exception e) {
e.printStackTrace();
if(pp!=null){
String apkVersion = pp.getProperty("apkVersion");
String apkDownloadUrl = pp.getProperty("apkDownloadUrl");
String apkName = pp.getProperty("apkName");
int apkVerCode = NumberUtils.toInt(pp.getProperty("apkVerCode"),0);
String apklog = pp.getProperty("apkLog");
String apkSize = pp.getProperty("apkSize");
Httptear.ResponseResultByEscape("{apkVersion:'"+apkVersion+"',apkSize:'"+apkSize+"',apkVerCode:"+apkVerCode+",apkName:'"+apkName+"',apkDownloadUrl:'"+apkDownloadUrl+"',apklog:'"+apklog+"'}");
Httptear.ResponseResultByEscape("{}");
return NONE;
6、upgrade_apk.xml
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/progressCount_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="14dip"
&ProgressBar
android:id="@+id/progressbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
&/LinearLayout&
7、需要加入以下权限:
&!-- 在SD卡中创建和删除文件权限 --&
&uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /&
&!-- 向SD卡中写入东西权限 --&
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&
&uses-permission android:name="android.permission.INTERNET"/&
&uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/&
&uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/&
8、启动更新检查代码:
/* 升级程序[主动] (因为会弹出一个ProgressDialog窗口,不能使用getApplicationContext())*/
DownloadManager downManger = new DownloadManager(this,true);
downManger.checkDownload();
/* 升级程序启动[被动](使用this引用会导致:如在1页面启动升级,当前页面为2页面,此时弹出Dialog抛异常)*/
DownloadManager downManger = new DownloadManager(getApplicationContext(),false);
downManger.checkDownload();
下载次数: 641
浏览 12211
博主,,,为什么我下载的源码,,是一个& login.html& 文件?表示不理解。。。。。这个不科学,重新下载试试。
live_family 写道博主 我得手机系统升级到5.0.2 后 。测试程序得时候 用这种方法& 就不会弹窗更新提示了& 貌似是设置在app最顶层显示 失效了& 博主有好的方法没?这是很久以前做android项目时候的blog,现在已不做android很多年。哦 谢谢
博主 我得手机系统升级到5.0.2 后 。测试程序得时候 用这种方法& 就不会弹窗更新提示了& 貌似是设置在app最顶层显示 失效了& 博主有好的方法没?这是很久以前做android项目时候的blog,现在已不做android很多年。
敢不敢把工程共享出来 。这样是不是太装x了啊 。项目工程没法公开,只能根据该文章结合理解实现。如有问题,可发出来共同解决。
我想问,能给一个工程不 亲,你下载下来放项目中不能使用么。& 这就好比一个可插拔的控件,放项目中都能用的啊。
浏览: 635140 次
来自: 北京
不错,谢谢分享!推荐个参考视频内容:http://www.ro ...
完全正确,补充一下&beans:bean id=&quo ...
longToip直接用ipToLong反过来就好了 publi ...
[size=x-small]jatoolsPrinter还有破 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 有没有人告诉我吉他谱 的文章

 

随机推荐