天客云到底有何作用?

5 款傻瓜式手机 APP 开发工具
Google推出的 Android App开发工具可以让你仅通过拖拉式的简单操作就可以创建自己的Android App。对于那些为了特定目的想要动手尝试开发一个简单应用的用户,除了App Inventor其实还有很多其他的选择,比如下面介绍的5款工具就可以让所有人都能轻松开发手机应用。
随着智能手机及APP应用程序的普及,越来越多的企业和个人意识到APP的营销价值,出于对技术的敬畏,很多企业下意识认为开发APP是一个有难度 的技术活,所以就算有心想开发一个企业自己的APP来对企业或者产品做宣传、交易,也担心APP的后续的技术支持、内容管理、维护等问题。
现在是打消这种疑虑的时候了。国外的营销工作者和技术开发者开发了许多能帮助企业创建简单APP应用的工具,通过这些工具,就算是一个对程序一窍不通的普通网民都可以很容易的创建一个企业的APP程序,并可以对程序进行应用更新维护,开展营销等活动。
下面给大家介绍几款傻瓜式的APP开发工具: 一、Bizness Apps
Bizness Apps为中小企业提供了一个快速制作手机App的平台。它目前支持iOS(iPhone、 iPad)及Android平台上的本机App制作。用户完全不需要具备任何编程知识,只要进行按钮勾选及拖拽,就能完成大部分设计工作。建立App时, 首先选择你的App类型。Bizness Apps为每种类型提供了相应的模板,包含了该类型大部分的常见功能,用户只需要进一步在选单中选取你的App需要的功能即可完成本机App的设计。在 App完成后,Bizness Apps会帮你把App上传到他们在iOS和Android应用商店的帐号。当然,你也可以申请帐号自己上传。选择iOS或Android之 一,Bizness Apps收费为每个平台39美元。如果选择同时支持两个平台,总共仅需59美元。这个价格对于中小企业来说实在很有吸引力,只需要一比颇小的投入,就能利 用App进行品牌营销。
同时,Bizness Apps公司还发布了其HTML5的手机App制作平台,中小企业们只要额外支付每月10美元的费用, 就可以同时拥有本机应用和HTML5的Web应用。HTML5的手机App最大的好处无疑在于其跨平台特性,客户只要制作基于HTML5的App就可以实 现对所有智能机平台的支持。
作为HTML5平台发布的一部分,Bizness Apps还建立了一个QR码模块,帮助中小企业进行手机App推广。消费者只要用手机扫一遍QR码,就能快速定位到对应平台的App。
Bizness Apps简明的操作、强大的功能以及美观的UI,吸引了众多中小企业使用他们的服务。自去年10月正 式上线以来,其增长势头异常迅猛,已经完成了超过1000个App,覆盖10多种语言,20多个国家。
二、DevmyApp
一款傻瓜式的iOS应用程序开发软件。有了该应用,您就可以创建、设计和开发自己的iOS应用程序,同时还可避免为一些经常出现的功能模块重复编写代码。 DevmyApp的主要特色功能有:
视图和过渡:创建视图并为其增加动画过渡效果。
共享 应用:启动外部原生应用,如Safari、电话或短信等。
动画:创建基本的动画。
网页视图:创建网页视图用自定义的控制方式导航互联网。
地图视图:创建可在混合地图和卫星地图之间切换的地图并可提示用户位置。
滚动文字:创建在屏幕上滚动的标签。
摇晃 API:创建摇晃iDevice时执行的操作。
应用内程序:启动消息或邮件等原生应用并在应用内使用。
提醒视图:创建自定义提醒视图。
旋转模式:当您转动iDevice时使应用支持横屏模式。
振动:使特定操作触发振动。
每项特色功能都带有说明并可预览应用内集成的实际例子的效果,而且还可预览代码和通过邮件发送代码。代码中包含注释和解释,您可对其进行修改满足您应用程序的需要。
对于想要通过强大的功能增强创意的iOS开发人员和iOS平台开发新手,该应用都是必备应用。
要开发iOS程序,您需要有一台Mac系统的电脑。
若要理解和运用该应用中包含的代码,您需有一定编程知识(特别是Objective-C语言)。
三、appsgeyser
使用AppsGeyser就可以让任何人都可以做应用程序的开发。 当然,这个程序并不能让你创建下一个愤怒的小鸟或者Foursquare。不过你仅仅想基于Web内容建立一个非常简单的应用程序的 话,AppsGeyser将会是你最佳的选择。AppsGeyser其实非常容易。它仅仅有三个选项: 首先,你可以任意输入一个移动网站网址,即可生成一个应用;第二,输入任何网页小工具的HTML代码,便可直接转化为Android应用;第三,通过工具抓取网页上的版块生成应用。
一旦你的工作完成后,你可以将其上传到Android Market上(但你事先要有一个出版商帐号)或者供你自己使用这个程序上个月才可以使用,但其联合创始人Vasily Salomatov称用户已经用AppsGeyser创建了1000个应用程序。
四、APPMakr
这个是之前我在《APP不是移动互联网的全部》一文中介绍过的APP开发工具,但是类似的工具还很少。
它的主要业务是为用户提供一个软件开发平台,让不会编程的用户也可以通过一个功能齐全的DIY工具包来开发手机应用程序。目前,AppMakr平台上的大部分应用主要是针对iOS系统,但针对Android及WP7的应用现在也正不断增长中。
基于浏览器的AppMakr可以整合用户已有的网页内容和社交网站更新,也帮助出版商、博客用户、小企业家和其他手机程序爱好者整合短信提示、相册 和 定位功能。它甚至还提供手机广告网络整合工具来增加开发者的赚钱机会。AppMakr为用户设计了算法来预测程序获得批准的可能性,标记出程序的潜在问题 并提出必要的程序修改建议。一旦程序通过审批并开始提供下载,用户就可以通过AppMakr操作版面查看进程,发布给消费者新信息并进行程序升级等。截至 2011年5月,已经有约3700个iPhone程序由AppMakr平台开发,这超过了苹果店全部iPhone应用程序库存的1%。
在具体使用过程中,用户首先需要注册一个AppMakr账号。注册完就可以立刻开始制作你的应用,然后选择应用模板如Android、iPhone等。
AppMakr的整个应用制作流程分七步。
第一步是Art这个版面,这里是设置你应用的名称,图标和启动画面。用户可以通过AppMakr的搜索功能到网上找一张适合的图,或者选择自己上传。
第二步来到Tab版面,这是比较重要的一个地方,设置你所制作的应用中内容,你应用的内容可以来自网络相册,然后你的应用就是展示这些图片。也可以来自某RSS的内容,你的应用就是用来展示它。
第三步来到自定义版面,这里是设置你应用中内容的文字颜色和把内容发到其他地方,如Facebook,但你想发布到这些网站的前提是有这些网站的开发者ID。
第四步来到通知推送版面,开发者可在这里设置应用对手机推送通知时的显示图样。
第五步来到应用信息版面,开发者可以在这里是对自己的应用做一些背景描述。
第六步是商业化版面,在这里开发者可以为自己的应用添加广告,以在日后获取广告费,但需要去对应的广告网站注册一个相关ID。
最后一步是发布版面,在发布前,开发者要提交一个自己的证书进行认证,认证结束以后就可以真正去发布自己制作的应用。
五、Mobile Roadie
Mobile Roadie提供一个应用开发平台,整合YouTube, Brightcove, Flickr, Twitpic, Ustream, Topspin, Google资讯,RSS, Twitter和Facebook。用户可使用该应用平台开发iOS应用和Android应用,并可以使用其提供的内容管理系统更新资讯,也可自行修改应 用细节。Mobile Roadie还提供了数据分析工具。
Mobile Roadie至今已开发出超过1500款应用程序,在全球拥有一千多万用户,支持16种语言,在美国、法国、西班牙、澳大利亚、加拿大、意大利、韩国和日 本市场均有出色表现。Q魔宝是Mobile Roadie在中国的本地化产品,由Mobile Roadie提供技术支持,飞客(中国)有限公司负责经销。用户可通过互联网登录Q魔宝平台,在网页拖拽界面上,轻松创建专属的iPhone及 Android应用程序,整个过程只需短短数小时
Mobile Roadie现已进入英国,法国,西班牙,澳大利亚,意大利,德国,巴西,土耳其和日本市场。
当然,APP开发工具不仅仅这些,例如:
专为艺术家打造的SwebApps
功能:SwebApps提供了一种在线服务,让你即便不知道如何编写代码也可以开发iPhone软件。 专为小公司打造,提供多种可供定制的模板,你还可以使用他们的图片库。
开发电子书应用利器 eBook App
功能: T用于通过电子书创建软件几乎支持所有格式的文件:PDF, Doc, Zip, CHM, HTML, TXT, FB2, PDB, PRC, Mobi, PDB, MHT, RTF此外用户还可以选择字体和大小,添加图片和注释,锁定横屏或竖屏等
游戏创意的实现者 GameSalad
功能: 这个下载工具可以让用户无需了解编程或脚本知识就可以开发游戏开发的软件可以发布到网页或iPhone上 …… 期待有一天,APP开发好比纸上画图一样简单!
转载请注明:文章转载自 开源中国社区
本文标题:5 款傻瓜式手机 APP 开发工具
本文地址:开源中国 - 找到您想要的开源项目,分享和交流
2017 码云招聘开发工程师。码云团队是一群追逐梦想的人,为做出美好的事情而努力。在这里没有大公司的等...
Ant Design 2.7.0 发布了,Ant Design 是蚂蚁金服开发和正在使用的一套企业级的前端设计语言和基于 R...
21回/1210阅
特赞公司 CTO,曾任阿里巴巴公司系统架构师。对微服务架构与大数据技术有深入研究。
33阅/0评/0赞
20阅/1评/0赞
726阅/6评/3赞
86阅/0评/0赞
60阅/0评/1赞
163阅/0评/0赞
211阅/0评/0赞
56阅/0评/0赞
61阅/0评/0赞
77阅/0评/0赞
90阅/0评/0赞
106阅/0评/0赞
269阅/0评/0赞
95阅/0评/0赞
2072阅/0评/1赞
29评/2073阅
25评/860阅
20评/1208阅
11评/584阅
19评/1567阅
19评/1417阅
10评/1222阅
30评/3511阅OSChina开源中国app下载 v2.8.0 安卓版
中文 / 33.1M
中文 / 23.2M
中文 / 5.4M
中文 / 3.5M
中文 / 10.3M
中文 / 13.1M
中文 / 11.1M
中文 / 4.5M
中文 / 9.6M
中文 / 22M
中文 / 23.2M
中文 / 10M
中文 / 11.5M
中文 / 33.1M
中文 / 4.5M
中文 / 3.5M
中文 / 21.1M
中文 / 17.7M
中文 / 22M/luomingui/p/3949429.htmlandroid 在线升级借助开源中国App源码分析如下:1: checkAppUpdate 检查是或需要升级&&&&&&& // 网络连接判断&&&&&&& if (appContext.isNetworkConnected()) {&&&&&&&&&&& // 检查新版本&&&&&&&&&&& if (appContext.isCheckUp()) {&&&&&&&&&&&&&&&&&& UpdateManager.getUpdateManager().checkAppUpdate(this, false);&&&&&&&&&&& }&&&&&&& }2: UpdateManager类package lcl.android.import java.io.Fimport java.io.FileOutputSimport java.io.IOEimport java.io.InputSimport java.net.HttpURLCimport java.net.MalformedURLEimport java.net.URL;import java.text.DecimalFimport lcl.android.R;import lcl.android.api.ApiCimport android.app.AlertDimport android.app.AlertDialog.Bimport android.app.Dimport android.app.ProgressDimport android.content.Cimport android.content.DialogIimport android.content.DialogInterface.OnCancelLimport android.content.DialogInterface.OnClickLimport android.content.Iimport android.content.pm.PackageIimport android.content.pm.PackageManager.NameNotFoundEimport android.net.Uimport android.os.Eimport android.os.Himport android.os.Mimport android.view.LayoutIimport android.view.Vimport android.widget.ProgressBimport android.widget.TextVimport android.widget.T/*** 应用程序更新工具包*&*/public class UpdateManager {&&& private static final int DOWN_NOSDCARD = 0;&&& private static final int DOWN_UPDATE = 1;&&& private static final int DOWN_OVER = 2;&&& private static final int DIALOG_TYPE_LATEST = 0;&&& private static final int DIALOG_TYPE_FAIL = 1;&&& private static UpdateManager updateM&&& private Context mC&&& // 通知对话框&&& private Dialog noticeD&&& // 下载对话框&&& private Dialog downloadD&&& // '已经是最新' 或者 '无法获取最新版本' 的对话框&&& private Dialog latestOrFailD&&& // 进度条&&& private ProgressBar mP&&& // 显示下载数值&&& private TextView mProgressT&&& // 查询动画&&& private ProgressDialog mProD&&& // 进度值&&& &&& // 下载线程&&& private Thread downLoadT&&& // 终止标记&&& private boolean interceptF&&& // 提示语&&& private String updateMsg = &&;&&& // 返回的安装包url&&& private String apkUrl = &&;&&& // 下载包保存路径&&& private String savePath = &&;&&& // apk保存完整路径&&& private String apkFilePath = &&;&&& // 临时下载文件路径&&& private String tmpFilePath = &&;&&& // 下载文件大小&&& private String apkFileS&&& // 已下载文件大小&&& private String tmpFileS&&& private String curVersionName = &&;&&& private int curVersionC&&& private Update mU&&& //单利模式&&& public static UpdateManager getUpdateManager() {&&&&&&& if (updateManager == null) {&&&&&&&&&&& updateManager = new UpdateManager();&&&&&&& }&&&&&&& updateManager.interceptFlag =&&&&&&& return updateM&&& }&&& private Handler mHandler = new Handler() {&&&&&&& public void handleMessage(Message msg) {&&&&&&&&&&& switch (msg.what) {&&&&&&&&&&& case DOWN_UPDATE:&&&&&&&&&&&&&&& mProgress.setProgress(progress);&&&&&&&&&&&&&&& mProgressText.setText(tmpFileSize + &/& + apkFileSize);&&&&&&&&&&&&&&&&&&&&&&&&&& case DOWN_OVER:&&&&&&&&&&&&&&& downloadDialog.dismiss();&&&&&&&&&&&&&&& installApk();&&&&&&&&&&&&&&&&&&&&&&&&&& case DOWN_NOSDCARD:&&&&&&&&&&&&&&& downloadDialog.dismiss();&&&&&&&&&&&&&&& Toast.makeText(mContext, &无法下载安装文件,请检查SD卡是否挂载&, 3000).show();&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&& };&&& };&&& /**&&&& * 获取当前客户端版本信息&&&& */&&& private void getCurrentVersion() {&&&&&&& try {&&&&&&&&&&& PackageInfo info = mContext.getPackageManager().getPackageInfo(&&&&&&&&&&&&&&&&&&& mContext.getPackageName(), 0);&&&&&&&&&&& curVersionName = info.versionN&&&&&&&&&&& curVersionCode = info.versionC&&&&&&& } catch (NameNotFoundException e) {&&&&&&&&&&& e.printStackTrace(System.err);&&&&&&& }&&& }&&& /**&&&& * 检查App更新&&&& *&&&&& * @param context&&&& * @param isShowMsg&&&& *&&&&&&&&&&& 是否显示提示消息&&&& */&&& public void&checkAppUpdate(Context context, final boolean isShowMsg) {&&&&&&& this.mContext =&&&&&&& getCurrentVersion();&&&&&&& if (isShowMsg) {&&&&&&&&&&& if (mProDialog == null)&&&&&&&&&&&&&&& mProDialog = ProgressDialog.show(mContext, null, &正在检测,请稍后...&,&&&&&&&&&&&&&&&&&&&&&&& true, true);&&&&&&&&&&& else if (mProDialog.isShowing()&&&&&&&&&&&&&&&&&&& || (latestOrFailDialog != null && latestOrFailDialog&&&&&&&&&&&&&&&&&&&&&&&&&&& .isShowing()))&&&&&&&&&&&&&&&&&&&&&& }&&&&&&& final Handler handler = new Handler() {&&&&&&&&&&& public void handleMessage(Message msg) {&&&&&&&&&&&&&&& // 进度条对话框不显示 - 检测结果也不显示&&&&&&&&&&&&&&& if (mProDialog != null && !mProDialog.isShowing()) {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& // 关闭并释放释放进度条对话框&&&&&&&&&&&&&&& if (isShowMsg && mProDialog != null) {&&&&&&&&&&&&&&&&&&& mProDialog.dismiss();&&&&&&&&&&&&&&&&&&& mProDialog =&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& // 显示检测结果&&&&&&&&&&&&&&& if (msg.what == 1) {&&&&&&&&&&&&&&&&&&& mUpdate = (Update) msg.&&&&&&&&&&&&&&&&&&& if (mUpdate != null) {&&&&&&&&&&&&&&&&&&&&&&& if (curVersionCode & mUpdate.getVersionCode()) {&&&&&&&&&&&&&&&&&&&&&&&&&&& apkUrl = mUpdate.getDownloadUrl();&&&&&&&&&&&&&&&&&&&&&&&&&&& updateMsg = mUpdate.getUpdateLog();&&&&&&&&&&&&&&&&&&&&&&&&&&& showNoticeDialog();&&&&&&&&&&&&&&&&&&&&&&& } else if (isShowMsg) {&&&&&&&&&&&&&&&&&&&&&&&&&&& showLatestOrFailDialog(DIALOG_TYPE_LATEST);&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& } else if (isShowMsg) {&&&&&&&&&&&&&&&&&&& showLatestOrFailDialog(DIALOG_TYPE_FAIL);&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&& };&&&&&&& new Thread() {&&&&&&&&&&& public void run() {&&&&&&&&&&&&&&& Message msg = new Message();&&&&&&&&&&&&&&& try {&&&&&&&&&&&&&&&&&&& Update update = ApiClient&&&&&&&&&&&&&&&&&&&&&&&&&&& .checkVersion((AppContext) mContext&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .getApplicationContext());&&&&&&&&&&&&&&&&&&& msg.what = 1;&&&&&&&&&&&&&&&&&&& msg.obj =&&&&&&&&&&&&&&& } catch (Exception e) {&&&&&&&&&&&&&&&&&&& e.printStackTrace();&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& handler.sendMessage(msg);&&&&&&&&&&& }&&&&&&& }.start();&&& }&&& /**&&&& * 显示版本更新通知对话框&&&& */&&& private void showNoticeDialog() {&&&&&&& AlertDialog.Builder builder = new Builder(mContext);&&&&&&& builder.setTitle(&软件版本更新&);&&&&&&& builder.setMessage(updateMsg);&&&&&&& builder.setPositiveButton(&立即更新&, new OnClickListener() {&&&&&&&&&&& @Override&&&&&&&&&&& public void onClick(DialogInterface dialog, int which) {&&&&&&&&&&&&&&& dialog.dismiss();&&&&&&&&&&&&&&& showDownloadDialog();&&&&&&&&&&& }&&&&&&& });&&&&&&& builder.setNegativeButton(&以后再说&, new OnClickListener() {&&&&&&&&&&& @Override&&&&&&&&&&& public void onClick(DialogInterface dialog, int which) {&&&&&&&&&&&&&&& dialog.dismiss();&&&&&&&&&&& }&&&&&&& });&&&&&&& noticeDialog = builder.create();&&&&&&& noticeDialog.show();&&& }&&& /**&&&& * 显示下载对话框&&&& */&&& private void showDownloadDialog() {&&&&&&& AlertDialog.Builder builder = new Builder(mContext);&&&&&&& builder.setTitle(&正在下载新版本&);&&&&&&& final LayoutInflater inflater = LayoutInflater.from(mContext);&&&&&&& View v = inflater.inflate(R.layout.update_progress, null);&&&&&&& mProgress = (ProgressBar) v.findViewById(R.id.update_progress);&&&&&&& mProgressText = (TextView) v.findViewById(R.id.update_progress_text);&&&&&&& builder.setView(v);&&&&&&& builder.setNegativeButton(&取消&, new OnClickListener() {&&&&&&&&&&& @Override&&&&&&&&&&& public void onClick(DialogInterface dialog, int which) {&&&&&&&&&&&&&&& dialog.dismiss();&&&&&&&&&&&&&&& interceptFlag =&&&&&&&&&&& }&&&&&&& });&&&&&&& builder.setOnCancelListener(new OnCancelListener() {&&&&&&&&&&& @Override&&&&&&&&&&& public void onCancel(DialogInterface dialog) {&&&&&&&&&&&&&&& dialog.dismiss();&&&&&&&&&&&&&&& interceptFlag =&&&&&&&&&&& }&&&&&&& });&&&&&&& downloadDialog = builder.create();&&&&&&& downloadDialog.setCanceledOnTouchOutside(false);&&&&&&& downloadDialog.show();&&&&&&& downloadApk();&&& }&&& /**&&&& * 显示'已经是最新'或者'无法获取版本信息'对话框&&&& */&&& private void showLatestOrFailDialog(int dialogType) {&&&&&&& if (latestOrFailDialog != null) {&&&&&&&&&&& // 关闭并释放之前的对话框&&&&&&&&&&& latestOrFailDialog.dismiss();&&&&&&&&&&& latestOrFailDialog =&&&&&&& }&&&&&&& AlertDialog.Builder builder = new Builder(mContext);&&&&&&& builder.setTitle(&系统提示&);&&&&&&& if (dialogType == DIALOG_TYPE_LATEST) {&&&&&&&&&&& builder.setMessage(&您当前已经是最新版本&);&&&&&&& } else if (dialogType == DIALOG_TYPE_FAIL) {&&&&&&&&&&& builder.setMessage(&无法获取版本更新信息&);&&&&&&& }&&&&&&& builder.setPositiveButton(&确定&, null);&&&&&&& latestOrFailDialog = builder.create();&&&&&&& latestOrFailDialog.show();&&& }&&& private Runnable mdownApkRunnable = new Runnable() {&&&&&&& @Override&&&&&&& public void run() {&&&&&&&&&&& try {&&&&&&&&&&&&&&& String apkName = &OSChinaApp_& + mUpdate.getVersionName()&&&&&&&&&&&&&&&&&&&&&&& + &.apk&;&&&&&&&&&&&&&&& String tmpApk = &OSChinaApp_& + mUpdate.getVersionName()&&&&&&&&&&&&&&&&&&&&&&& + &.tmp&;&&&&&&&&&&&&&&& // 判断是否挂载了SD卡&&&&&&&&&&&&&&& String storageState = Environment.getExternalStorageState();&&&&&&&&&&&&&&& if (storageState.equals(Environment.MEDIA_MOUNTED)) {&&&&&&&&&&&&&&&&&&& savePath = Environment.getExternalStorageDirectory()&&&&&&&&&&&&&&&&&&&&&&&&&&& .getAbsolutePath() + &/OSChina/Update/&;&&&&&&&&&&&&&&&&&&& File file = new File(savePath);&&&&&&&&&&&&&&&&&&& if (!file.exists()) {&&&&&&&&&&&&&&&&&&&&&&& file.mkdirs();&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&& apkFilePath = savePath + apkN&&&&&&&&&&&&&&&&&&& tmpFilePath = savePath + tmpA&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& // 没有挂载SD卡,无法下载文件&&&&&&&&&&&&&&& if (apkFilePath == null || apkFilePath == &&) {&&&&&&&&&&&&&&&&&&& mHandler.sendEmptyMessage(DOWN_NOSDCARD);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& File ApkFile = new File(apkFilePath);&&&&&&&&&&&&&&& // 是否已下载更新文件&&&&&&&&&&&&&&& if (ApkFile.exists()) {&&&&&&&&&&&&&&&&&&& downloadDialog.dismiss();&&&&&&&&&&&&&&&&&&& installApk();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& // 输出临时下载文件&&&&&&&&&&&&&&& File tmpFile = new File(tmpFilePath);&&&&&&&&&&&&&&& FileOutputStream fos = new FileOutputStream(tmpFile);&&&&&&&&&&&&&&& URL url = new URL(apkUrl);&&&&&&&&&&&&&&& HttpURLConnection conn = (HttpURLConnection) url&&&&&&&&&&&&&&&&&&&&&&& .openConnection();&&&&&&&&&&&&&&& conn.connect();&&&&&&&&&&&&&&& int length = conn.getContentLength();&&&&&&&&&&&&&&& InputStream is = conn.getInputStream();&&&&&&&&&&&&&&& // 显示文件大小格式:2个小数点显示&&&&&&&&&&&&&&& DecimalFormat df = new DecimalFormat(&0.00&);&&&&&&&&&&&&&&& // 进度条下面显示的总文件大小&&&&&&&&&&&&&&& apkFileSize = df.format((float) length / 1024 / 1024) + &MB&;&&&&&&&&&&&&&&& int count = 0;&&&&&&&&&&&&&&& byte buf[] = new byte[1024];&&&&&&&&&&&&&&& do {&&&&&&&&&&&&&&&&&&& int numread = is.read(buf);&&&&&&&&&&&&&&&&&&& count +=&&&&&&&&&&&&&&&&&&& // 进度条下面显示的当前下载文件大小&&&&&&&&&&&&&&&&&&& tmpFileSize = df.format((float) count / 1024 / 1024) + &MB&;&&&&&&&&&&&&&&&&&&& // 当前进度值&&&&&&&&&&&&&&&&&&& progress = (int) (((float) count / length) * 100);&&&&&&&&&&&&&&&&&&& // 更新进度&&&&&&&&&&&&&&&&&&& mHandler.sendEmptyMessage(DOWN_UPDATE);&&&&&&&&&&&&&&&&&&& if (numread &= 0) {&&&&&&&&&&&&&&&&&&&&&&& // 下载完成 - 将临时下载文件转成APK文件&&&&&&&&&&&&&&&&&&&&&&& if (tmpFile.renameTo(ApkFile)) {&&&&&&&&&&&&&&&&&&&&&&&&&&& // 通知安装&&&&&&&&&&&&&&&&&&&&&&&&&&& mHandler.sendEmptyMessage(DOWN_OVER);&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&& fos.write(buf, 0, numread);&&&&&&&&&&&&&&& } while (!interceptFlag);// 点击取消就停止下载&&&&&&&&&&&&&&& fos.close();&&&&&&&&&&&&&&& is.close();&&&&&&&&&&& } catch (MalformedURLException e) {&&&&&&&&&&&&&&& e.printStackTrace();&&&&&&&&&&& } catch (IOException e) {&&&&&&&&&&&&&&& e.printStackTrace();&&&&&&&&&&& }&&&&&&& }&&& };&&& /**&&&& * 下载apk&&&& *&&&&& * @param url&&&& */&&& private void downloadApk() {&&&&&&& downLoadThread = new Thread(mdownApkRunnable);&&&&&&& downLoadThread.start();&&& }&&& /**&&&& * 安装apk&&&& *&&&&& * @param url&&&& */&&& private void installApk() {&&&&&&& File apkfile = new File(apkFilePath);&&&&&&& if (!apkfile.exists()) {&&&&&&&&&&&&&&&&&& }&&&&&&& Intent i = new Intent(Intent.ACTION_VIEW);&&&&&&& i.setDataAndType(Uri.parse(&file://& + apkfile.toString()),&&&&&&&&&&&&&&& &application/vnd.android.package-archive&);&&&&&&& mContext.startActivity(i);&&& }}3:应用程序更新实体类package lcl.android.import java.io.IOEimport java.io.InputSimport java.io.Simport lcl.android.utility.StringUimport org.xmlpull.v1.XmlPullPimport org.xmlpull.v1.XmlPullParserEimport android.util.X/*** 应用程序更新实体类*&* @author liux (http://my.oschina.net/liux)* @version 1.0* @created */public class Update implements Serializable {&&& private static final long serialVersionUID = -0891288L;&&& public final static String UTF8 = &UTF-8&;&&& public final static String NODE_ROOT = &oschina&;&&& private int versionC&&& private String versionN&&& private String downloadU&&& private String updateL&&& public int getVersionCode() {&&&&&&& return versionC&&& }&&& public void setVersionCode(int versionCode) {&&&&&&& this.versionCode = versionC&&& }&&& public String getVersionName() {&&&&&&& return versionN&&& }&&& public void setVersionName(String versionName) {&&&&&&& this.versionName = versionN&&& }&&& public String getDownloadUrl() {&&&&&&& return downloadU&&& }&&& public void setDownloadUrl(String downloadUrl) {&&&&&&& this.downloadUrl = downloadU&&& }&&& public String getUpdateLog() {&&&&&&& return updateL&&& }&&& public void setUpdateLog(String updateLog) {&&&&&&& this.updateLog = updateL&&& }&&& public static Update parse(InputStream inputStream) throws IOException,&&&&&&&&&&& Exception {&&&&&&& Update update =&&&&&&& // 获得XmlPullParser解析器&&&&&&& XmlPullParser xmlParser = Xml.newPullParser();&&&&&&& try {&&&&&&&&&&& xmlParser.setInput(inputStream, UTF8);&&&&&&&&&&& // 获得解析到的事件类别,这里有开始文档,结束文档,开始标签,结束标签,文本等等事件。&&&&&&&&&&& int evtType = xmlParser.getEventType();&&&&&&&&&&& // 一直循环,直到文档结束&&&&&&&&&&& while (evtType != XmlPullParser.END_DOCUMENT) {&&&&&&&&&&&&&&& String tag = xmlParser.getName();&&&&&&&&&&&&&&& switch (evtType) {&&&&&&&&&&&&&&& case XmlPullParser.START_TAG:&&&&&&&&&&&&&&&&&&& // 通知信息&&&&&&&&&&&&&&&&&&& if (tag.equalsIgnoreCase(&android&)) {&&&&&&&&&&&&&&&&&&&&&&& update = new Update();&&&&&&&&&&&&&&&&&&& } else if (update != null) {&&&&&&&&&&&&&&&&&&&&&&& if (tag.equalsIgnoreCase(&versionCode&)) {&&&&&&&&&&&&&&&&&&&&&&&&&&& update.setVersionCode(StringUtils.toInt(&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& xmlParser.nextText(), 0));&&&&&&&&&&&&&&&&&&&&&&& } else if (tag.equalsIgnoreCase(&versionName&)) {&&&&&&&&&&&&&&&&&&&&&&&&&&& update.setVersionName(xmlParser.nextText());&&&&&&&&&&&&&&&&&&&&&&& } else if (tag.equalsIgnoreCase(&downloadUrl&)) {&&&&&&&&&&&&&&&&&&&&&&&&&&& update.setDownloadUrl(xmlParser.nextText());&&&&&&&&&&&&&&&&&&&&&&& } else if (tag.equalsIgnoreCase(&updateLog&)) {&&&&&&&&&&&&&&&&&&&&&&&&&&& update.setUpdateLog(xmlParser.nextText());&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case XmlPullParser.END_TAG:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& // 如果xml没有结束,则导航到下一个节点&&&&&&&&&&&&&&& evtType = xmlParser.next();&&&&&&&&&&& }&&&&&&& } catch (XmlPullParserException e) {&&&&&&& } finally {&&&&&&&&&&& inputStream.close();&&&&&&& }&&&&&&&&&& }}4:获取网络版本信息/*** API客户端接口:用于访问网络数据*&* @author liux (http://my.oschina.net/liux)* @version 1.0* @created */public class ApiClient {&&& /**&&&& * 检查版本更新&&&& *&&&&& * @param url&&&& * @return&&&& */&&& public static Update checkVersion(AppContext appContext) throws Exception {&&&&&&& try {&&&&&&&&&&& return Update.parse(HtmlRegexpUtil&&&&&&&&&&&&&&&&&&& .GetInputStreamByUrl(“/luomingui/MobileAppVersion.xml”));&&&&&&& } catch (Exception e) {&&&&&&&&&&&&&&&&&& }&&& }}5:发布到网络
最新教程周点击榜
微信扫一扫

我要回帖

更多关于 云客药有什么作用 的文章

 

随机推荐