zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    JavaScript 之 typeof
    Octotree Chrome安装与使用方法
    支持主流MySQL中间件的数据迁移工具ora2mysql
    Eclipse搭建SpringBoot之HelloWorld
    Spring Boot插件spring tool suite安装及使用
    树的前中后序遍历非递归实现
    判断是否是完全二叉树
    Leetcode 437_path sum III todo
    DFS回溯只在递归基回溯————leetcode112
    Leetcode 94 Binary Tree Inorder
  • 原文地址:https://www.cnblogs.com/mcxiaobing/p/5907376.html
Copyright © 2011-2022 走看看