apk版本升级提示 的问题,一直提示更新是怎么回

14:40 提问
Android 覆盖更新APK更新后怎样自动删除APK包?都会闪退,接收不到广播
查过好多资料,差不多安装完成时程序会闪退,注册的监听安装广播收不到,无法监听安装过程,有什么好的方法可以在安装完成后删除APK包 =-=
按赞数排序
一般从应用市场安装的话会自动删除,还有一种就是自己app下载,可以在下次启动的时候检查,如果有安装包就删除,没有就不处理
可以用android系统的广播,就比如qq,微信类的通知,把app关掉也能收到
在下次启动的时候删除好了
可以试试放私有目录,启动删除(不知道方私有目录安装器能否访问到)
看看这个有没有帮助
先安裝 ASTRO 檔案助手, 啟用進入
儲存位置 && 內存位置
在這邊會看到所有 app 安裝後開啟目錄. 看你要刪哪個 apk, 直接進該 app 產生目錄
直接刪除內容
你可以先记录APK保存的地址,当新APK启动后去删除已安装的APK,覆盖安装会终止掉之前运行的app的
你的需求是:更新原有的apk,安装完成后弹出是否删除apk的弹出框,点击确定后删除apk,还是安装完成后自动删除apk?
一般我们自己的apk都会写一个setup.apk的应用来负责安装自己的apk,而不是直接丢到系统的system目录下自动安装。
如果有自己的setup.apk的话删除就不用说了。
如果直接安装想删除应该是系统来控制的,你自己的apk貌似无法发送广播出来,系统才知道安装完成没有,发广播告诉用户是否删除apk
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐46被浏览43,123分享邀请回答183 条评论分享收藏感谢收起6添加评论分享收藏感谢收起还没有帐号? 赶紧
用户版块帖子
请问如何禁止手机软件有更新时会自动下载APK包
UID:1064697
在线时间2683小时
M币2451专家7
比如手机淘宝类怎么禁止自动下载APK包呢?启动的服务太多实在试不出来该关掉那个?下面这个就是有更新时自动下载的(如果不更新删掉这个打开淘宝马上会自动又有这个APK的)进程信息淘宝的启用项目太多实在试不出来那个改关那个应该保留进度条才拉到一半已经有200个了(截图进度条会消失,所以把图拍下来了)进度条最后部分日志也很多看不懂其中一段保存下来的日志也不知道有没有人看得懂这个也把他贴上来吧本来想贴上来提交不了帖子了说内容大于5万个字当附件传上来把会看的帮忙看看把网盘链接站内很多软件都是这样当有更新时就会自动下载新的apk更新包 。淘宝的服务项目太多实在试不出来该禁止哪些?服务项目不多的可以自己试的出来需要禁止的的服务,比如“爱读阅读”有更新一样会下载apk更新包,但把它该禁止的服务禁掉就不会在要更新跟自动下载apk更新包了下面打钩的都是必须的 (第一个不勾运行无如何反应,第2个第4个第5个对应功能的忘了反正都是需要的其中一不勾会打不开本地文件,还有个不勾会打不开网络书,还有个不勾会运行就会出现“已停止”)其他的全部把勾去掉
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
可告知楼主的手机截图软件吗?
UID:1156928
在线时间1603小时
M币4557专家1
可告知楼主的手机截图软件吗?
UID:789849
在线时间6792小时
M币9174专家11
不能关闭自动更新的都是流氓软件就像QQ&&QQ输入法 等等各种国产输入法
UID:1588123
在线时间1347小时
M币1076专家3
我手机里软件比较多..发现流氓通常直接卸载.手机X宝就删除了.留下了旺信..不过碰到自动下载也可以限制的.不用自己研究.装个LBE大师..设置一下软件权限...查看到偷跑流量的你可以禁它, 或是删它..这个可以看看楼主留言:没用的。。。 LBE安全以前就用过 后来删了&&现在改用超级管理,其他功能比较不知道但我主要用来禁止开机启动项的, LBE的开机启管理没有超级管理强。偷跑流量超级管理也能禁它的,但是禁了它这个软件就没用网络功能了。所以LBE也一样拿它没辙
UID:1588123
在线时间1347小时
M币1076专家3
或是找个类似的 流量监控软件..楼主留言:我另外有个超级管理能监控功能,但是它之告诉你什么软件用了多少流量。但不知道是哪个行为是淘宝的自动下载功能
UID:1840430
在线时间4059小时
M币1785专家4
就是安装不自动更新的软件楼主留言:除非有人破解淘宝这个软件,就算有但是别人破解的淘宝也不敢用啊~
UID:1270182
在线时间436小时
M币7683专家1
LBE安全大师,这个不错
UID:1064697
在线时间2683小时
M币2451专家7
回 q8155128 的帖子
:可告知楼主的手机截图软件吗? ( 12:23) N7100手机自带的截图功能,原图400多K放不上来
UID:1064697
在线时间2683小时
M币2451专家7
回 wc5095928 的帖子
:不能关闭自动更新的都是流氓软件就像QQ  QQ输入法 等等各种国产输入法 ( 12:31) 恩&&特别是手机上的流氓太可恶,电脑上的流氓还可以自己搞定
UID:1064697
在线时间2683小时
M币2451专家7
回 恒鑫电子 的帖子
:LBE安全大师,这个不错 ( 12:56) 没用的。。。 LBE安全以前就用过 后来删了&&现在改用超级管理,其他功能比较不知道但我主要用来禁止开机启动项的, LBE的开机启管理没有超级管理强。
访问内容超出本站范围,不能确定是否安全
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:03-14 20:50, Total 0.175925(s) query 7,
Gzip enabled&android apk版本自动检测升级,安装
网上看了好多自动升级安装的例子.可能是我没配置好.做起来各种的不爽 虽然代码都大同小异 还是自己做的比较满意
先说下主要的实现逻辑:在测试服务器上放一个xml,用来说明服务器的版本,和新apk的下载地址,运行本地apk的时间.去检测服务器xml里的服务器的版本信息,本地apk的版本信息可以在AndroidManifest.xml中的versionCode拿到.代码是context.getPackageManager().getPackageInfo("com.example.updateversion",
0).0;如果他的版本号比本地的版本号高的话就下载更新服务器上的apk,完了后安装新的apk,这样就实现了自动更新apk的目的,记得发布新的apk的时候一定要修改AndroidManifest.xml中的versionCode,只能搞不能低,然的话就这次可以更新.下次再比对的时候就没法更新了
本例共有3个类文件.一个activity 一个下载的主工具类 一个解析xml的工具类
还有2个布局文件.主布局文件和一个progressbar
1.主要的业务类:注释都在代理里了
package com.example.
import java.io.F
import java.io.FileOutputS
import java.io.IOE
import java.io.InputS
import java.net.HttpURLC
import java.net.MalformedURLE
import java.net.URL;
import java.util.HashM
import android.app.AlertD
import android.app.AlertDialog.B
import android.app.D
import android.content.C
import android.content.DialogI
import android.content.DialogInterface.OnClickL
import android.content.I
import android.content.pm.PackageManager.NameNotFoundE
import android.net.U
import android.os.E
import android.os.H
import android.os.M
import android.view.LayoutI
import android.view.V
import android.widget.ProgressB
import android.widget.T
* 检测安装更新文件的助手类
* @author Administrator
public class UpdateVersionService {
private static final int DOWN = 1;// 用于区分正在下载
private static final int DOWN_FINISH = 0;// 用于区分下载完成
private HashMap&String, String& hashM// 存储跟心版本的xml信息
private String fileSaveP// 下载新apk的厨房地点
private String updateVersionXMLP// 检测更新的xml文件
// 获取新apk的下载数据量,更新下载滚动条
private boolean cancelUpdate =// 是否取消下载
private ProgressBar progressB
private Dialog downLoadD
private Handler handler = new Handler() {// 跟心ui
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch ((Integer) msg.obj) {
case DOWN:
progressBar.setProgress(progress);
case DOWN_FINISH:
Toast.makeText(context, "文件下载完成,正在安装更新", Toast.LENGTH_SHORT).show();
installAPK();
* 构造方法
* @param updateVersionXMLPath
比较版本的xml文件地址(服务器上的)
* @param context
public UpdateVersionService(String updateVersionXMLPath, Context context) {
this.updateVersionXMLPath = updateVersionXMLP
this.context =
* 检测是否可更新
public void checkUpdate() {
if (isUpdate()) {
showUpdateVersionDialog();// 显示提示对话框
Toast.makeText(context, "已经是新版本", Toast.LENGTH_SHORT).show();
* 更新提示框
private void showUpdateVersionDialog() {
// 构造对话框
AlertDialog.Builder builder = new Builder(context);
builder.setTitle("软件更新");
builder.setMessage("检测到新版本,是否下载更新");
builder.setPositiveButton("更新", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
// 显示下载对话框
showDownloadDialog();
// 稍后更新
builder.setNegativeButton("稍后更新", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Dialog noticeDialog = builder.create();
noticeDialog.show();
* 下载的提示框
protected void showDownloadDialog() {
// 构造软件下载对话框
AlertDialog.Builder builder = new Builder(context);
builder.setTitle("正在更新");
// 给下载对话框增加进度条
final LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.downloaddialog, null);
progressBar = (ProgressBar) v.findViewById(R.id.updateProgress);
builder.setView(v);
// 取消更新
builder.setNegativeButton("取消", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
// 设置取消状态
cancelUpdate =
downLoadDialog = builder.create();
downLoadDialog.show();
// 现在文件
downloadApk();
* 下载apk,不能占用主线程.所以另开的线程
private void downloadApk() {
new downloadApkThread().start();
* 判断是否可更新
private boolean isUpdate() {
int versionCode = getVersionCode(context);
// 把version.xml放到网络上,然后获取文件信息
URL url = new URL(updateVersionXMLPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5 * 1000);
conn.setRequestMethod("GET");// 必须要大写
InputStream inputStream = conn.getInputStream();
// 解析XML文件。
ParseXmlService service = new ParseXmlService();
hashMap = service.parseXml(inputStream);
} catch (Exception e) {
e.printStackTrace();
if (null != hashMap) {
int serverCode = Integer.valueOf(hashMap.get("versionCode"));
// 版本判断
if (serverCode & versionCode) {
Toast.makeText(context, "新版本是: " + serverCode, Toast.LENGTH_SHORT).show();
* 获取当前版本和服务器版本.如果服务器版本高于本地安装的版本.就更新
* @param context2
private int getVersionCode(Context context2) {
int versionCode = 0;
// 获取软件版本号,对应AndroidManifest.xml下android:versionCode
versionCode = context.getPackageManager().getPackageInfo("com.example.updateversion", 0).versionC
Toast.makeText(context, "当前版本是: " + versionCode, Toast.LENGTH_SHORT).show();
} catch (NameNotFoundException e) {
e.printStackTrace();
return versionC
* 安装apk文件
private void installAPK() {
File apkfile = new File(fileSavePath, hashMap.get("fileName") + ".apk");
if (!apkfile.exists()) {
// 通过Intent安装APK文件
Intent i = new Intent(Intent.ACTION_VIEW);
System.out.println("filepath=" + apkfile.toString() + "
" + apkfile.getPath());
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
context.startActivity(i);
android.os.Process.killProcess(android.os.Process.myPid());// 如果不加上这句的话在apk安装完成之后点击单开会崩溃
* 卸载应用程序(没有用到)
public void uninstallAPK() {
Uri packageURI = Uri.parse("package:com.example.updateversion");
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
context.startActivity(uninstallIntent);
* 下载apk的方法
* @author rongsheng
public class downloadApkThread extends Thread {
public void run() {
// TODO Auto-generated method stub
super.run();
// 判断SD卡是否存在,并且是否具有读写权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// 获得存储卡的路径
String sdpath = Environment.getExternalStorageDirectory() + "/";
fileSavePath = sdpath + "download";
URL url = new URL(hashMap.get("loadUrl"));
// 创建连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5 * 1000);// 设置超时时间
conn.setRequestMethod("GET");
conn.setRequestProperty("Charser", "GBK,utf-8;q=0.7,*;q=0.3");
// 获取文件大小
int length = conn.getContentLength();
// 创建输入流
InputStream is = conn.getInputStream();
File file = new File(fileSavePath);
// 判断文件目录是否存在
if (!file.exists()) {
file.mkdir();
File apkFile = new File(fileSavePath, hashMap.get("fileName") + ".apk");
FileOutputStream fos = new FileOutputStream(apkFile);
int count = 0;
byte buf[] = new byte[1024];
// 写入到文件中
int numread = is.read(buf);
// 计算进度条位置
progress = (int) (((float) count / length) * 100);
// 更新进度
Message message = new Message();
message.obj = DOWN;
handler.sendMessage(message);
if (numread &= 0) {
// 下载完成
// 取消下载对话框显示
downLoadDialog.dismiss();
Message message2 = new Message();
message2.obj = DOWN_FINISH;
handler.sendMessage(message2);
// 写入文件
fos.write(buf, 0, numread);
} while (!cancelUpdate);// 点击取消就停止下载.
fos.close();
is.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
2:解析工具类,能做到自动升级的地步,xml解析就不用再注释了吧:
package com.example.
import java.io.IOE
import java.io.InputS
import java.util.HashM
import org.xmlpull.v1.XmlPullP
import org.xmlpull.v1.XmlPullParserE
import android.util.X
public class ParseXmlService {
public HashMap&String, String& parseXml(InputStream inputStream) {
HashMap&String, String& hashMap =
boolean flag =
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(inputStream, "UTF-8");
int event = pullParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
hashMap = new HashMap&String, String&();
case XmlPullParser.START_TAG:
String name = pullParser.getName();
if ("VERSIONCODE".equalsIgnoreCase(name) && flag == true) {
hashMap.put("versionCode", pullParser.nextText().trim());
} else if ("FILENAME".equalsIgnoreCase(name) && flag == true) {
hashMap.put("fileName", pullParser.nextText().trim());
} else if ("LOADURL".equalsIgnoreCase(name) && flag == true) {
hashMap.put("loadUrl", pullParser.nextText().trim());
case XmlPullParser.END_TAG:
event = pullParser.next();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
// hashMap = new HashMap&String, String&();
// hashMap.put("versionCode", "2");
// hashMap.put("fileName", "updateversion");
// hashMap.put("loadUrl",
// "http://192.168.1.30:8080/server/updateversion/updateversion.apk");
return hashM
3:activity的代码主ui:
package com.example.
import android.app.A
import android.os.B
import android.os.H
import android.view.V
public class MainActivity extends Activity {
private UpdateVersionService updateVersionS
private static final String UPDATEVERSIONXMLPATH = "http://192.168.1.30:8080/server/updateversion/version.xml";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// TODO Auto-generated method stub
new Handler().postDelayed(new Runnable() {
public void run() {
// TODO Auto-generated method stub
updateVersionService = new UpdateVersionService(UPDATEVERSIONXMLPATH, MainActivity.this);// 创建更新业务对象
updateVersionService.checkUpdate();// 调用检查更新的方法,如果可以更新.就更新.不能更新就提示已经是最新的版本了
}, 2000);// 2秒之后执行
* 更新按钮的监听事件
* @param view
public void updateVersion(View view) {
updateVersionService = new UpdateVersionService(UPDATEVERSIONXMLPATH, this);
updateVersionService.checkUpdate();
4:下面是主页面的xml和progress的xml
&LinearLayout xmlns: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:gravity="center_vertical|center_horizontal"
android:orientation="vertical" &
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/version_msg"
android:textSize="30sp"
tools:context=".MainActivity" /&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:onClick="updateVersion"
android:text="@string/update" /&
&/LinearLayout&
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" &
&ProgressBar
android:id="@+id/updateProgress"
style="@android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" /&
&/LinearLayout&
以上就是整个程序的代码了 发布新版本只需要修改AndroidManifest.xml文件中的versionCode的值,一定要比升级之前的版本高,那个versionName在本例中没有什么实际意义,主要是versioncode,如果想在ui上看的清楚一点的话 可以经string.xml中的version_msg 标明版本号.这样在ui上就能看到当前的版本了
以后能让自己清楚点再次使用这个例子 把服务器的xml格式也贴上来,新的apk和xml放一个文件夹就行
&?xml version="1.0" encoding="UTF-8"?&
&VERSIONCODE&2&/VERSIONCODE&
&FILENAME&updateversion&/FILENAME&
&LOADURL&http://192.168.1.30:8080/server/updateversion/updateversion.apk
&/LOADURL&
&/VERSION&
切记:如果测试的话,不管新的还是旧的apk 都得打包成apk文件.并且用同一个签名.如果是想在debug情况下使用 可以用(win7)C:\Users\rongsheng\.android目录下的debug.keystore这个签名(两个apk签名要一样),系统自带的签名的密码都是android
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 apk去除升级提示模块 的文章

 

随机推荐