android apk安装完成自动升级之后安装完成 打开崩溃时怎么回事

15844人阅读
这是一个比较简单的程序,但网上还是有很多人问起这个问题,并且回答的人,也没有完全回答正确,然后又有很多人去转载非正确的答案,使别人用了之后还是有问题。
如何下载新版本的文件,这里就不赘述了,这里就说一下安装和打开。
& * 安装APK文件
&private void installApk() {
&&File apkfile = new File(mSavePath,Constant.appFileName);
&&if (!apkfile.exists()) {
&&// 通过Intent安装APK文件
&&Intent i = new Intent(Intent.ACTION_VIEW);
&&i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
&&i.setDataAndType(Uri.parse(&file://& + apkfile.toString()),
&&&&&application/vnd.android.package-archive&);
&&mContext.startActivity(i);
&&android.os.Process.killProcess(android.os.Process.myPid());
如果没有android.os.Process.killProcess(android.os.Process.myPid());最后不会提示完成、打开。
如果没有i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);这一步的话,最后安装好了,点打开,是不会打开新版本应用的。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:186627次
积分:1259
积分:1259
排名:千里之外
原创:10篇
转载:17篇
评论:53条
(2)(2)(3)(2)(9)(5)(3)(1)Android apk安装后自动添加桌面图标 和 自启动的尝试 - Univasity's (Share&Save) - ITeye技术网站
博客分类:
前一个问题是论坛里的一位朋友提出来的:
,第二个问题是在网上看到的:
很显然,除非在应用安装后有相关的广播能被捕获到,否则就没法做了,事实是有的:Intent.ACTION_PACKAGE_ADDED。
Launcher中的应用列表正是这么做的:
&Launcher.java&
* Registers various intent receivers. The current implementation registers
* only a wallpaper intent receiver to let other applications change the
* wallpaper.
private void registerIntentReceivers() {
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKjAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
registerReceiver(mApplicationsReceiver, filter);
filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(mCloseSystemDialogsReceiver, filter);
我依样画葫芦尝试了一下,直接在我的应用中实现BroadcastReceiver并在XML注册,对action=Intent.ACTION_PACKAGE_ADDED进行捕获,但是没捕获到。
后来一查文档才发现这是行不通的:
public static final
ACTION_PACKAGE_ADDED
Action: A new application package has been installed on the device. The
data contains the name of the package. Note that the newly installed
package does
receive this broadcast.
看来在应用自身中通过BroadcastReceiver来捕获Add消息是不行的,但是我想到了另一种折中的实现方法——通过另一个应用来辅助实现。
需要先实现一个包含对ntent.ACTION_PACKAGE_ADDED进行捕获的BroadcastReceiver的应用,首先安装到手机上,在他接受到消息后再向你的应用返回一个广播。你需要在你的应用中实现实现对应的BroadcastReceiver。
具体实现:
public class PackageChangeReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
final String packageName = intent.getData().getSchemeSpecificPart();
final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
// 通知对应的应用
Intent notifyIntent = new Intent("com.app.action.notifier");
notifyIntent.setPackage(packageName);
notifyIntent.putExtra("action", action);
notifyIntent.putExtra("replace", replacing);
context.sendBroadcast(notifyIntent);
&?xml version="1.0" encoding="utf-8"?&
&manifest xmlns:android="/apk/res/android"
package="com.app.notifier"
android:versionCode="1"
android:versionName="1.0"&
&uses-sdk android:minSdkVersion="7" /&
&application android:icon="@drawable/icon" android:label="@string/app_name"&
&receiver android:name="PackageChangeReceiver"&
&intent-filter&
&action android:name="android.intent.action.PACKAGE_ADDED"&&/action&
&action android:name="android.intent.action.PACKAGE_CHANGED"&&/action&
&action android:name="android.intent.action.PACKAGE_REMOVED"&&/action&
&data android:scheme="package"&&/data&
&/intent-filter&
&/receiver&
&/application&
&/manifest&
&你的应用&
public class PackageChangeReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
final String action = intent.getStringExtra("action");
boolean replace = intent.getBooleanExtra("replace", false);
if(action.equals(Intent.ACTION_PACKAGE_ADDED)){
// do some thing you want.
xml中注册广播 &receiver android:name="PackageChangeReceiver"&
&intent-filter&
&action android:name="com.app.action.notifier"&&/action&
&/intent-filter&
&/receiver&
缺点:必须先安装辅助apk
优点:仅需一次安装,之后使用只需在应用中实现并在XML中注册BroadcastReceiver就能捕获到安装事件,从而执行相应的操作(添加桌面图标,自启动...)
------------------------------------------------------------------------------------------------
可能说得有点乱,把代码也传上来好了... 大家还有什么好的思路可以讨论下哈~~
下载次数: 506
浏览 13288
论坛回复 /
(2 / 8538)
豌豆荚是怎么实现的??豌豆荚,91手机助手等也会在手机上装一个客户端的啊,没发现他们有实现安装后自启动和添加桌面快捷方式啊,具体没仔细研究过,除非他们还用了什么驱动吧,JAVA层只能用API提供的方法了。
问下楼主这个辅助APK 怎么安装到手机中& 谢谢了&& apk的正常安装方式:1.通过手机助手,USB连线安装; 2.传到SD卡,在手机上操作安装。说的是这个吗?
浏览: 502940 次
来自: 广州
谢谢 楼主 好东西
gaidandan 写道缓存失败,,模拟器上可以缓存,同样代码 ...
那么麻烦干吗,而且这种方法会导致,当拉太小的时候样式会丢掉,整 ...
缓存失败,,模拟器上可以缓存,同样代码在手机上没有办法缓存,什 ...Android实战项目(18)
& & & & 做项目的时候,公司要求自己写App在线自动检测更新,App启动是的flash界面也就是欢迎界面开始检测版本,不一样就下载;
在这里就出现一个问题,下载完了就开始安装替换,替换完了,程序没启动!但是,如果我进入其他Acitivity,然后子线程还在下载,那么下载完了还能自启动;所以就干脆在当前Activity下载,下载完了finish就可以了。如蓝色字体的代码
builder.setPositiveButton(&立刻升级&, new OnClickListener() {
public void onClick( DialogInterface dialog, int which) {
showDownloadDialog() ;
// 下载APK,并且替换安装
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// sdcard存在
FinalHttp finalhttp = new FinalHttp();
finalhttp.download(apkUrl, Environment.getExternalStorageDirectory().getAbsolutePath()+&/BusinessAPP_V3.apk&,
new AjaxCallBack&File&(){
public void onFailure(Throwable t, int errorNo,String strMsg) {
t.printStackTrace();
Toast.makeText(getApplicationContext(), &下载失败&, 1).show();
super.onFailure(t, errorNo, strMsg);
enterHome();
public void onLoading(long count, long current) {
// TODO Auto-generated method stub
super.onLoading(count, current);
tv_update_info.setVisibility(View.VISIBLE);
tv_update_info_text.setVisibility(View.VISIBLE);
//当前下载百分比
& &progress = (int) (current * 100 / count);
tv_update_info.setText(progress+&%&);
System.out.println(&----------------------------&progress:&+progress);
handler.sendEmptyMessage(66);
if(progress==100){
finish(); //下载完后要销毁当前Activity,否则不会自启动
mdialog.dismiss();
public void onSuccess(File t) {
// TODO Auto-generated method stub
super.onSuccess(t);
installAPK(t);
* @param t
private void installAPK(File t) {
&Intent intent = new Intent();
&intent.setAction(&android.intent.action.VIEW&);
&intent.addCategory(&android.intent.category.DEFAULT&);
&intent.setDataAndType(Uri.fromFile(t), &application/vnd.android.package-archive&);
&startActivity(intent);
Toast.makeText(getApplicationContext(), &没有sdcard,请安装上在试&,0).show();
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:83698次
积分:1737
积分:1737
排名:千里之外
原创:87篇
转载:69篇
评论:12条
(1)(1)(3)(8)(1)(3)(1)(9)(3)(9)(4)(13)(17)(30)(18)(8)(7)(1)(2)(3)(4)(8)查看: 22125|回复: 101
android应用静默升级,安装完成后自动启动该应用
签到天数: 59 天连续签到: 1 天[LV.5]常住居民I主题帖子e币
最近在做关于静默安装的功能,网上搜了好久,一直没有解决,后来结合各位大神的思路,终于把这个功能完整的实现了,好啦,废话不多说了,开始正文,该方法用的调用android隐藏方法,不需要获取ROOT权限,
首先,要使用静默安装,肯定得添加系统级的签名,(manifest中添加这句:android:sharedUserId=&android.uid.system&),后边会介绍怎么给应用加签名的
然后,开始调用android源码中隐藏的类和方法(也就是PackageManager),调用隐藏的方法大概有两种,一种是利用反射,还有一种就是重新编译android源码,网上有牛人重新编译好的.jar,这里就直接拿来用了,以下是Eclipse中的设置步骤:
在此放上需要的类和编译后的jar
1.右键项目,打开Build Path,进入Configure Build Path
2.Add Library,选择User Library,
3.新建一个,取名为framework,
4.Add Exernal JARS...选择上边提到的编译好的jar包
5.添加完成,把framework前边的小框打钩,并且通过Up上移到android源码上边
至此,就可以调用隐藏的方法啦& &~\(≧▽≦)/~啦啦啦
但是需要注意的一些问题
1)无论是反射还是使用自编译的stublibrary,只能解决调用隐藏API的问题,而无法越过权限检查。
2)Google之所以将有些API隐藏,有些原因可能是因为这些API属于内部逻辑,不想对外暴露,也有可能是API接口还未最终确定下来。所以在低版本Android上的隐藏API不一定能在高版本的Android上使用。这点是一定要注意的。也就说隐藏API的兼容性比较差。因此利用反射调用隐藏API时,一定要注意根据Android的版本采用不同的方式去反射。
接下来,我们开始调用:(这里说一下,PackageInstaller这个类里边的方法大家可以看看,自由选择调用就行)
& &PackageInstaller piInstaller = new PackageInstaller(getApplicationContext());
& &piInstaller.instatllBatch(updatePath);
别忘记了加权限哟:
&!-- 静默安装所需的权限 --&
& & &uses-permission android:name=&android.permission.INSTALL_LOCATION_PROVIDER& /&
& & &uses-permission android:name=&android.permission.INSTALL_PACKAGES& /&
& & &uses-permission android:name=&android.permission.DELETE_PACKAGES& /&
& & &uses-permission android:name=&android.permission.MOUNT_UNMOUNT_FILESYSTEMS& /&
& & &uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE& /&
如果报错,Project→Clean一下就好
在此添加系统签名需要的工具,大家也可以去网上查查怎么获取,
通过上面两行代码,我们就可以静默安装应用啦,但是,直接运行肯定会报错的,因为我们用到了系统级的签名,没错,就是上边说到的(android:sharedUserId=&android.uid.system&),在此我们需要给应用加系统签名
1.项目右键,Android Tools选择 Export Unsigned Application Package,到处未加签名的应用
2.把上边的platform.pk8,platform.x509.pem,signapk.jar以及未加签名的apk放在同一个文件夹下
3.在cmd中,定位到该文件夹,然后执行
java -jar signapk.jar platform.x509.pem platform.pk8 len.apk newlen_signed.apk
(其中len.apk是未加签名的,newlen_signed是打包后的)
4.然后把打包后的APK安装在设备上就可以啦,
在这里提醒下大家,使用系统签名并且也用到百度地图的,记得获取系统的数字证书,不然地图会不好使的(这个问题折磨了我好久 %&_&%),
亲测更新的apk不会把用户数据清除,大家放心使用,下边是几个广播,大家可以看看:
&action android:name=&android.intent.action.PACKAGE_ADDED& /&&&设备上新安装了一个应用程序包
&action android:name=&android.intent.action.PACKAGE_REMOVED& /&设备上删除了一个应用程序包
&action android:name=&android.intent.action.PACKAGE_REPLACED& /&设备上升级了一个应用程序包
就是这些了,第一次发帖,大家多多支持!!!
本帖子中包含更多资源
才可以下载或查看,没有帐号?
有帮助: 5 &
完全照着上面的教程来弄了,共享用户权限不完整 怎么解决?&
我支持: 5 有帮助: 5 不错&
我支持: 5 写的很详细,也很有用&
非常精彩,支持你,加油!
精彩主题,感谢分享
本帖被以下淘专辑推荐:
& |主题: 501, 订阅: 223
& |主题: 76, 订阅: 7
& |主题: 12, 订阅: 3
签到天数: 1 天连续签到: 1 天[LV.1]初来乍到主题帖子e币
楼主,静默卸载怎么写?能给个代码吗?
签到天数: 6 天连续签到: 1 天[LV.2]偶尔看看I主题帖子e币
我是说,动态获取系统签名啊,你做的只是在指定机子上吧。
就是 SignApk.rar 这个文件里的系统签名,如果你的应用安装到不同的手机上,你怎么获取它的签名。
Unable to execute dex: Cannot merge new index 65712 into a non-jumbo instruction!
无法正确运行出apk呀,报错呀,亲们&
签到天数: 22 天连续签到: 1 天[LV.4]偶尔看看III主题帖子e币
& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
签到天数: 59 天连续签到: 1 天[LV.5]常住居民I主题帖子e币
先占一楼,我再找找获取系统数字证书的方法,快来人呐.......
我帖子上有个链接 你可以看看/thread--1.html&
/thread--1.html
来看看我写的软件...很简单的哦,互相学习下,&
签到天数: 3 天连续签到: 1 天[LV.2]偶尔看看I主题帖子e币
咳咳咳,板凳坐上。。
嘻嘻,~\(≧▽≦)/~啦啦啦&
该用户从未签到主题帖子e币
签到天数: 59 天连续签到: 1 天[LV.5]常住居民I主题帖子e币
/android/android-view-signatures/comment-page-1/这个是获取系统数字证书
可用么,实践没?&
签到天数: 9 天连续签到: 1 天[LV.3]偶尔看看II主题帖子e币
这个是不是有点流氓啊
静默安装嘛,只是有需求的时候添加,&
签到天数: 59 天连续签到: 1 天[LV.5]常住居民I主题帖子e币
这个是不是有点流氓啊
静默安装嘛,只是有需求的时候添加,
签到天数: 59 天连续签到: 1 天[LV.5]常住居民I主题帖子e币
咳咳咳,板凳坐上。。
嘻嘻,~\(≧▽≦)/~啦啦啦
神经病,哼,⊙﹏⊙b汗&
签到天数: 105 天连续签到: 1 天[LV.6]常住居民II主题帖子e币
顶一个,做过使用命令行的方式实现的,需要root权限
恩恩,用ROOT也可以的,但是有时候手机不支持就很麻烦啦&
签到天数: 7 天连续签到: 1 天[LV.3]偶尔看看II主题帖子e币
不明觉厉。静默安装?
是的,程序会在后台自动安装好的,可以使用广播监听到安装完成,就可以启动的,亲测绝对没问题。。&
签到天数: 6 天连续签到: 1 天[LV.2]偶尔看看I主题帖子e币
/android/android-view-signatures/comment-page-1/这个是获取系统数字证书 ...
可用么,实践没?
我就是用的这个,完全没问题,,,&
签到天数: 108 天连续签到: 1 天[LV.6]常住居民II主题帖子e币
貌似很不错的啊!~~~呵呵 ···可以试试!
(*^__^*) 嘻嘻……&
签到天数: 18 天连续签到: 1 天[LV.4]偶尔看看III主题帖子e币
需要ROOT权限吧?
不需要ROOT,只要加系统级签名就行&
签到天数: 59 天连续签到: 1 天[LV.5]常住居民I主题帖子e币
需要ROOT权限吧?
不需要ROOT,只要加系统级签名就行
签到天数: 59 天连续签到: 1 天[LV.5]常住居民I主题帖子e币
可用么,实践没?
我就是用的这个,完全没问题,,,
我是说,动态获取系统签名啊,你做的只是在指定机子上吧。&
QQ已认证,此人靠谱
社区认证会员
社区认证会员
推荐阅读热门话题
61886420384328281281261252226218210208204201715
半小时前昨天&23:59昨天&21:23昨天&13:10昨天&13:07昨天&13:05昨天&09:41昨天&09:34前天&23:57前天&21:41前天&20:44前天&11:35前天&11:34前天&11:323&天前3&天前
Powered by
扫一扫 关注eoe官方微信}

我要回帖

更多关于 android 自动升级框架 的文章

更多推荐

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

点击添加站长微信