binbinyang---Android自动检测更新功能的实现--杨彬

来源:互联网 发布:犀牛o2o源码 编辑:程序博客网 时间:2024/06/06 17:07
今天来说说 安卓开发中任何APP都会要用到的升级 更新的问题
首先写了一个 在通知栏弹出 一个简单的 带有图片.文字的 更新提示
public class MainActivity extends Activity implements OnClickListener{public static final int  NOTIFICATION_ID = 24;private Button but;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);but = (Button)findViewById(R.id.but);but.setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.but:Builder builder = new NotificationCompat.Builder(MainActivity.this);builder.setSmallIcon(R.drawable.ic_launcher);builder.setContentTitle("下载");builder.setContentText("正在下载");Notification notification= builder.build();NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);/** * id  NOTIFICATION_ID通过这个ID 来更新 */manager.notify(NOTIFICATION_ID,notification);break;default:break;}} }


下面是关于友盟---自动更新升级下载的步骤

1.集成过程客户端集成

2首先到友盟官网下载更新的SDK,复制jar包到目标项目中的libs目录:


3. 配置AndroidManifest.xml


android.permission.WRITE_EXTERNAL_STORAGE 权限允许将下载的apk保存到sd卡中。
android.permission.ACCESS_NETWORK_STATE 权限允许检查网络状态,从而根据不同网络环境决定何种下载策略,务必添加该权限。

3.2 添加APPKEY和渠道到<application>标签下: (如果已经集成了统计SDK等友盟其他服务,不需要重复添加APPKEY)

<meta-data android:value="YOUR APP KEY" android:name="UMENG_APPKEY"/><meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>

UMENG_APPKEY:用来定位该应用的唯一性,用您该应用的UMENG APPKEY,替换value中的"YOUR APP KEY"。
UMENG_CHANNEL:用来标注应用推广渠道,不同渠道可以上传不同更新包,您可以使用20位以内的英文和数字为渠道定名,替换value中的"Channel ID"。如果不改动,将代表默认渠道。(特别提示:如果需要使用友盟自动更新多渠道更新,必须先集成友盟统计SDK)

渠道ID

请参考第5节如何上传APK。

3.3 添加Service和Activity到<application>标签下: (请注意:v2.4的SDK中,对话框改为Activity实现)

注意

com.umeng包名可能有变,如果不能下载,请检查包名,替换成正确的包名。

<service    android:name="com.umeng.update.net.DownloadingService"    android:process=":DownloadingService" ></service><activity     android:name="com.umeng.update.UpdateDialogActivity"    android:theme="@android:style/Theme.Translucent.NoTitleBar" ></activity>

4.调用接口

<pre name="code" class="html">public void onCreate(Bundle  savedInstanceState) {   
 super.onCreate(savedInstanceState);   
 UmengUpdateAgent.update(this);
}

5.上传最新的APK

<h2 id="1_5" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, 'Microsoft Yahei', Arial, sans-serif; font-weight: normal; line-height: 1.1; color: rgb(62, 62, 62); margin: 1em 0px 0.25em; font-size: 24px; padding: 0.5em; text-align: justify;"> <img src="http://img.blog.csdn.net/20160423190619605?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="http://img.blog.csdn.net/20160423190625855?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></h2>



public class MainActivity extends Activity implements OnClickListener {//public static final int NOTIFICATION_ID = 24;private Button but;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);UmengUpdateAgent.update(this);}



如果是自己写一个 升级 跟检测是否当前是最新版本

public class UpdateManager {private ProgressBar mpProgressBar;private Dialog mDownloadDialog;private String mSavePath;private int mProgress;// 进度条值private boolean mIsCancel = false;private static final int DOWNLOADING = 1;private static final int DOWNLOAD_FINISH = 2;private static final String PATH = "http://192.168.0.103/autoupdate/version.html";private String mVersion_code;private String mVersion_name;private String mVersion_desc;private String mVersion_path;private Context mContext;public UpdateManager(Context context) {mContext = context;}private Handler mGetVersionHandler = new Handler() {public void handleMessage(Message msg) {JSONObject jsonObject = (JSONObject) msg.obj;// Toast.makeText(mContext, "出错了" + jsonObject.toString(),// 1).show();System.out.println(jsonObject.toString() + "==========");try {mVersion_code = jsonObject.getString("version_code");mVersion_name = jsonObject.getString("version_name");mVersion_desc = jsonObject.getString("version_desc");mVersion_path = jsonObject.getString("version_path");if (isUpdate()) {Toast.makeText(mContext, "需要更新", Toast.LENGTH_LONG).show();// 需要更新 显示要更新的提示对话框showNoticeDialog();} else {Toast.makeText(mContext, "不需要更新", Toast.LENGTH_LONG).show();}} catch (Exception e) {// TODO: handle exception}};};private Handler mUpdateProgressHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case DOWNLOADING:mpProgressBar.setProgress(mProgress);break;case DOWNLOAD_FINISH:// 隐藏 销毁 下载对话框mDownloadDialog.dismiss();// 安装本地apk文件break;default:break;}};};/* * 检测软件是否需要更新 */public void checkUpdate() {RequestQueue requestQueue = Volley.newRequestQueue(mContext);JsonObjectRequest request = new JsonObjectRequest(PATH, null,new Listener<JSONObject>() {@Overridepublic void onResponse(JSONObject jsonObject) {Message msg = Message.obtain();msg.obj = jsonObject;mGetVersionHandler.sendMessage(msg);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError arg0) {// TODO Auto-generated method stub// Toast.makeText(mContext, "出错了" + arg0.toString(), 1)// .show();System.out.println(arg0.toString() + "bbbbbbbbbbb");}});requestQueue.add(request);}/* * 与本地版本比较判断是否需要更新 */protected boolean isUpdate() {int serverVersion = Integer.parseInt(mVersion_code);int localVersion = 1;/** * 拿到本地的包名 */try {localVersion = mContext.getPackageManager().getPackageInfo("com.example.notification", 0).versionCode;} catch (NameNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (serverVersion > localVersion)return true;elsereturn false;}/* * 有更新时显示提示对话框 */protected void showNoticeDialog() {AlertDialog.Builder builder = new Builder(mContext);builder.setTitle("提示");String message = "软件有更新,需要下载吗\n" + mVersion_desc;builder.setMessage(message);/** * 确认的那个按钮 */builder.setPositiveButton("更新", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 隐藏当前对话框dialog.dismiss();// 显示下载的对话框showDownloadDialog();}});/** * 取消的按钮 */builder.setNegativeButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(mContext, "取消", 1).show();// 隐藏当前对话框dialog.dismiss();}});builder.create().show();}/* * 显示正在下载对话框 */protected void showDownloadDialog() {AlertDialog.Builder builder = new Builder(mContext);View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_progress, null);builder.setTitle("正在下载");mpProgressBar = (ProgressBar) view.findViewById(R.id.prog);builder.setView(view);builder.setNegativeButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub// 隐藏对话框dialog.dismiss();// 设置下载状态为取消}});mDownloadDialog = builder.create();// 创建对话框mDownloadDialog.show();// 下载文件downloadAPK();}/* * 开启新线程下载文件 */private void downloadAPK() {new Thread(new Runnable() {@Overridepublic void run() {try {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String sdPath = Environment.getExternalStorageDirectory() + "/";mSavePath = sdPath + "jikedownload";File dir = new File(mSavePath);if (!dir.exists())dir.mkdir();// 下载文件HttpURLConnection conn = (HttpURLConnection) new URL(mVersion_path).openConnection();conn.connect();InputStream is = conn.getInputStream();int length = conn.getContentLength();File apkFile = new File(mSavePath, mVersion_name);FileOutputStream fos = new FileOutputStream(apkFile);int count = 0;byte[] buffer = new byte[1024];while (!mIsCancel) {int numread = is.read(buffer);count += numread;// 计算进度条的当前位置mProgress = (int) (((float) count / length) * 1);// 更新进度条mUpdateProgressHandler.sendEmptyMessage(DOWNLOADING);// 下载完成if (numread < 0) {mUpdateProgressHandler.sendEmptyMessage(DOWNLOAD_FINISH);break;}fos.write(buffer, 0, numread);}fos.close();is.close();}} catch (Exception e) {e.printStackTrace();}}}).start();}/* * 下载到本地后执行安装 */protected void installAPK() {}}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 6个月宝宝阴唇粘连怎么办? 高一孩子不爱上学怎么办 3岁宝宝外阴发红怎么办 40爸妈离婚我该怎么办 小儿吃糖卡住了怎么办 额头撞墙上肿了怎么办 宝宝额头撞肿了怎么办 小孩额头撞肿了怎么办 宝宝撞到额头肿了怎么办 小孩子上一年级语文很差了怎么办? 楼下说小孩太吵怎么办 托班的小孩太吵怎么办 宝宝两岁只会简单的词怎么办 我儿子的视力低怎么办 小孩子课文看书都不会读怎么办 宝宝衣服买小了怎么办 拉拉裤腰围小了怎么办 一周九个月宝宝发烧怎么办 8个月的婴儿37.7怎么办 宝宝发烧37度3怎么办 2岁宝宝发烧37度怎么办 3个月新生儿发烧怎么办 生完孩子肚子松弛怎么办 6个月婴儿高烧怎么办 7个月婴儿高烧怎么办 11个月婴儿高烧怎么办 4个月婴儿高烧怎么办 新生宝宝混合喂养消化不良怎么办 四个月的宝宝不追听不追视怎么办 宝宝母乳换奶粉拉肚子怎么办 奶牛产奶脂肪低怎么办 新生儿混合喂养不喝水怎么办 小孩子咳嗽怎么办有什么偏方 混合喂养宝宝不喝奶粉怎么办 混合喂养宝宝不吃奶粉怎么办 混合喂养宝宝不吃奶瓶怎么办 混合喂养的宝宝不吃奶粉怎么办 三个月的宝宝突然不吃奶粉怎么办 四个月宝宝拉绿屎推拿怎么办 三个月大的宝宝消化不良怎么办 婴儿大便常规正常的腹泻怎么办