Android开发必有功能,更新版本提示,检测是否有新版本更新。下载完成后进行安装。

作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985,转载请说明出处。

给大家介绍个东西,MarkDown真的超级超级好用。哈哈。好了,

正题内容如下:

先说明,此文章是教程详解,而不是直接拿来用的Demo,想要Demo的

朋友可以在下面留言或者私信,看到有要的朋友会做一个Demo。下面

文章是教大家理解这个内容。

先看一下效果:


1,检测更新

    /*
     * 从服务器端读取相关信息
     */
    private String getInfoFromServer(String url) throws ClientProtocolException,
            IOException
    {
        // sb 是从updateServerUrl上面读取到的内容
        StringBuffer sb = new StringBuffer();

        HttpClient httpClient = new DefaultHttpClient();
        HttpParams httpParams = httpClient.getParams();
        // 设置网络超时参数
        HttpConnectionParams.setConnectionTimeout(httpParams, 3000);
        HttpConnectionParams.setSoTimeout(httpParams, 5000);
        HttpResponse response = httpClient.execute(new HttpGet(url));
        HttpEntity entity = response.getEntity();
        if (entity != null)
        {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    entity.getContent(), "UTF-8"), 8192);

            String line = null;
            while ((line = reader.readLine()) != null)
            {
                sb.append(line + "
");
            }
            reader.close();
        }
        else
        {
            // 如果网络不通则默认初始版本
            sb.append("1");
        }
        Log.i("getInfoFromServer", sb.toString().trim());
        return sb.toString().trim();
    }

    /**
     * 获取软件版本号
     * 
     * @param context
     * @return
     */
    private float getVersionCode(Context context)
    {
        float versionCode = 0;
        try
        {
            // 获取软件版本号,对应AndroidManifest.xml下android:versionCode
            versionCode = Float.valueOf(context.getPackageManager().getPackageInfo(
                    mContext.getPackageName(), 0).versionName);
        }
        catch (NameNotFoundException e)
        {
            e.printStackTrace();
        }
        return versionCode;
    }


    private void showUpdateDialog()
    {
        if (mDialog == null)
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("提示更新");
            builder.setMessage("有最新版本可更新,是否下载更新");
            builder.setPositiveButton("更新", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    // 开启服务进行更新
                    Intent intent = new Intent();
                    intent.setClass(MainActivity.this, UpgradeService.class);

                    bindService(intent, conn, Context.BIND_AUTO_CREATE);

                }
            });
            builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    if (mDialog.isShowing())
                    {
                        mDialog.dismiss();
                    }
                }
            });
            mDialog = builder.create();
        }
        mDialog.show();
    }


2,创建通知,带有自定义视图通知

    1)自定义布局:

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <ImageView
                android:id="@+id/image"
                android:layout_width="45dp"
                android:layout_height="45dp"
                android:layout_marginTop="2dp"
                android:background="@drawable/ic_launcher" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="3dp"
                android:layout_marginRight="3dp"
                android:orientation="vertical" >

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:orientation="horizontal" >

                    <TextView
                        android:id="@+id/dw_name"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical"
                        android:text="xxxx.apk"
                        android:textSize="18sp"
                        android:textColor="#4b8df9" />

                    <TextView
                        android:id="@+id/tv_progress"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical"
                        android:gravity="center"
                        android:minWidth="60dp"
                        android:textSize="18sp"
                        android:textColor="#4b8df9" />
                </LinearLayout>

                <ProgressBar
                    android:id="@+id/progressbar"
                    style="?android:attr/progressBarStyleHorizontal"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="bottom"
                    android:layout_marginRight="4dp"
                    android:layout_marginTop="3dp"
                    android:max="100"
                    android:progress="0"
                    android:text="xxxx.apk" />
            </LinearLayout>
        </LinearLayout>

    2) 通知处理:

    mNotificationManager = (NotificationManager) 
                getSystemService(android.content.Context.NOTIFICATION_SERVICE);

    /**
     * 创建通知
     */
    private void setUpNotification()
    {
        CharSequence tickerText = getString(R.string.download_begin);

        long when = System.currentTimeMillis();

        mNotification = new Notification();
        mNotification.icon = R.drawable.ic_launcher;
        mNotification.tickerText = tickerText;
        mNotification.when = when;

        // 放置在"正在运行"栏目中
        mNotification.flags = Notification.FLAG_ONGOING_EVENT;

        RemoteViews contentView = new RemoteViews(getPackageName(),
                R.layout.download_notification_layout);

        contentView.setTextViewText(R.id.dw_name,
                getString(R.string.tip_apk_download));

        // 指定个性化视图
        mNotification.contentView = contentView;

        Intent intent = new Intent(this, MainActivity.class);

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_NO_CREATE);

        // 指定内容意图
        mNotification.contentIntent = contentIntent;
        mNotificationManager.notify(NOTIFY_ID, mNotification);
    }

    通知修改:

    if (rate <= 100)
    {
        RemoteViews contentview = mNotification.contentView;
        contentview.setTextViewText(R.id.tv_progress, rate + "%");
        contentview.setProgressBar(R.id.progressbar, 100, rate, false);
    }
    else
    {
        // 下载完毕后变换通知形式
        mNotification.flags = Notification.FLAG_AUTO_CANCEL;
        // mNotification.contentView = null;

        stopSelf();
    }
    mNotificationManager.notify(NOTIFY_ID, mNotification);



3,下载逻辑处理

    private int lastRate = 0;
    private Runnable mdownApkRunnable = new Runnable()
    {
        @Override
        public void run()
        {
            try
            {
                // 获取下载地址
                URL url = new URL(DOWNLOAD_APK_URL);

                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.connect();
                int length = conn.getContentLength();
                InputStream is = conn.getInputStream();

                File file = new File(savePath);
                if (!file.exists())
                {
                    file.mkdirs();
                }

                file = new File(saveFileName);
                if (file.exists())
                {
                    file.delete();
                }

                String apkFile = saveFileName;
                File ApkFile = new File(apkFile);
                FileOutputStream fos = new FileOutputStream(ApkFile);

                int count = 0;
                byte buf[] = new byte[1024];

                do
                {
                    int numread = is.read(buf);
                    count += numread;
                    progress = (int) (((float) count / length) * 100);
                    // 更新进度
                    Message msg = mHandler.obtainMessage();
                    msg.what = 1;
                    msg.arg1 = progress;
                    if (progress >= lastRate + 1)
                    {
                        mHandler.sendMessage(msg);
                        lastRate = progress;
                    }
                    if (numread <= 0)
                    {
                        // 下载完成通知安装
                        mHandler.sendEmptyMessage(0);
                        // 下载完了,cancelled也要设置
                        canceled = true;
                        break;
                    }
                    fos.write(buf, 0, numread);
                }
                while (!canceled);// 点击取消就停止下载.

                fos.close();
                is.close();
            }
            catch (MalformedURLException e)
            {
                e.printStackTrace();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }

        }
    };

4,安装APK

    /**
     * 安装apk
     * 
     * @param url
     */
    private void installApk()
    {
        File apkfile = new File(saveFileName);
        if (!apkfile.exists())
        {
            return;
        }
        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);

        stopSelf();

        mNotification = null;
    }


程序员小冰博客:http://blog.csdn.net/qq_21376985 技术交流QQ986945193 微博:http://weibo.com/mcxiaobing
原文地址:https://www.cnblogs.com/mcxiaobing/p/5907376.html