Android提示版本更新操作流程

來源:互聯網
上載者:User

標籤:android   style   blog   class   code   java   

             

                                                        Android提示版本更新操作流程

 

 2014年5月8日:

 andorid的app應用中都會有版本更新的操作,今天閒置時候就花了點心思弄了一下,主要技術方面用到了AsyncTask非同步載入、http協議、json解析、擷取版本號碼等。。。

 

下面就來介紹一下大概的流程吧,首先呢:

activity_main.xml:

 

    <Button         android:id="@+id/chek_newest_version"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_margin="5dip"        android:text="檢測最新版本"/>


這裡我就只用了一個按鈕了!

 

接下來mainactivity代碼:

啟動了非同步載入來處理的,如果舊版本小於新版本號碼,就開始執行下載操作,否則就不更新!

一步步看吧!

 

public class MainActivity extends Activity {Button m_btnCheckNewestVersion;long m_newVerCode; //最新版的版本號碼String m_newVerName; //最新版的版本名String m_appNameStr; //下載到本地要給這個APP命的名字Handler m_mainHandler;ProgressDialog m_progressDlg;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化相關變數initVariable();m_btnCheckNewestVersion.setOnClickListener(btnClickListener);}private void initVariable(){m_btnCheckNewestVersion = (Button)findViewById(R.id.chek_newest_version);m_mainHandler = new Handler();m_progressDlg =  new ProgressDialog(this);m_progressDlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 設定ProgressDialog 的進度條是否不明確 false 就是不設定為不明確     m_progressDlg.setIndeterminate(false);    m_appNameStr = "haha.apk";}OnClickListener btnClickListener = new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubnew checkNewestVersionAsyncTask().execute();}};class checkNewestVersionAsyncTask extends AsyncTask<Void, Void, Boolean>{@Overrideprotected Boolean doInBackground(Void... params) {// TODO Auto-generated method stubif(postCheckNewestVersionCommand2Server()){int vercode = Common.getVerCode(getApplicationContext()); // 用到前面第一節寫的方法           if (m_newVerCode > vercode) {               return true;         } else {               return false;         }  }return false;}@Overrideprotected void onPostExecute(Boolean result) {// TODO Auto-generated method stubif (result) {//如果有最新版本doNewVersionUpdate(); // 更新新版本  }else {notNewVersionDlgShow(); // 提示當前為最新版本  }super.onPostExecute(result);}@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();}}/** * 從伺服器擷取當前最新版本號碼,如果成功返回TURE,如果失敗,返回FALSE * @return */private Boolean postCheckNewestVersionCommand2Server(){StringBuilder builder = new StringBuilder();JSONArray jsonArray = null;try {// 構造POST方法的{name:value} 參數對List<NameValuePair> vps = new ArrayList<NameValuePair>();// 將參數傳入post方法中vps.add(new BasicNameValuePair("action", "checkNewestVersion"));builder = Common.post_to_server(vps);Log.e("msg", builder.toString());jsonArray = new JSONArray(builder.toString());if (jsonArray.length()>0) {if (jsonArray.getJSONObject(0).getInt("id") == 1) {m_newVerName = jsonArray.getJSONObject(0).getString("verName");m_newVerCode = jsonArray.getJSONObject(0).getLong("verCode");return true;}}return false;} catch (Exception e) {Log.e("msg",e.getMessage());m_newVerName="";m_newVerCode=-1;return false;}}/** * 提示更新新版本 */private void doNewVersionUpdate() {int verCode = Common.getVerCode(getApplicationContext());      String verName = Common.getVerName(getApplicationContext());          String str= "目前的版本:"+verName+" Code:"+verCode+" ,發現新版本:"+m_newVerName+    " Code:"+m_newVerCode+" ,是否更新?";      Dialog dialog = new AlertDialog.Builder(this).setTitle("軟體更新").setMessage(str)              // 設定內容              .setPositiveButton("更新",// 設定確定按鈕                      new DialogInterface.OnClickListener() {                          @Override                          public void onClick(DialogInterface dialog,                                  int which) {                             m_progressDlg.setTitle("正在下載");                              m_progressDlg.setMessage("請稍候...");                              downFile(Common.UPDATESOFTADDRESS);  //開始下載                        }                      })              .setNegativeButton("暫不更新",                      new DialogInterface.OnClickListener() {                          public void onClick(DialogInterface dialog,                                  int whichButton) {                              // 點擊"取消"按鈕之後退出程式                              finish();                          }                      }).create();// 建立      // 顯示對話方塊      dialog.show();  }/** *  提示當前為最新版本   */private void notNewVersionDlgShow(){int verCode = Common.getVerCode(this);      String verName = Common.getVerName(this);     String str="目前的版本:"+verName+" Code:"+verCode+",/n已是最新版,無需更新!";    Dialog dialog = new AlertDialog.Builder(this).setTitle("軟體更新")              .setMessage(str)// 設定內容              .setPositiveButton("確定",// 設定確定按鈕                      new DialogInterface.OnClickListener() {                          @Override                          public void onClick(DialogInterface dialog,                                  int which) {                              finish();                          }                      }).create();// 建立      // 顯示對話方塊      dialog.show();  }private void downFile(final String url){m_progressDlg.show();      new Thread() {          public void run() {              HttpClient client = new DefaultHttpClient();              HttpGet get = new HttpGet(url);              HttpResponse response;              try {                  response = client.execute(get);                  HttpEntity entity = response.getEntity();                  long length = entity.getContentLength();                                  m_progressDlg.setMax((int)length);//設定進度條的最大值                                InputStream is = entity.getContent();                  FileOutputStream fileOutputStream = null;                  if (is != null) {                      File file = new File(                              Environment.getExternalStorageDirectory(),                              m_appNameStr);                      fileOutputStream = new FileOutputStream(file);                      byte[] buf = new byte[1024];                      int ch = -1;                      int count = 0;                      while ((ch = is.read(buf)) != -1) {                          fileOutputStream.write(buf, 0, ch);                          count += ch;                          if (length > 0) {                           m_progressDlg.setProgress(count);                        }                      }                  }                  fileOutputStream.flush();                  if (fileOutputStream != null) {                      fileOutputStream.close();                  }                  down();  //告訴HANDER已經下載完成了,可以安裝了            } catch (ClientProtocolException e) {                  e.printStackTrace();              } catch (IOException e) {                  e.printStackTrace();              }          }      }.start();  }/** * 告訴HANDER已經下載完成了,可以安裝了 */private void down() {        m_mainHandler.post(new Runnable() {            public void run() {                m_progressDlg.cancel();                update();            }        });}/** * 安裝程式 */    void update() {        Intent intent = new Intent(Intent.ACTION_VIEW);        intent.setDataAndType(Uri.fromFile(new File(Environment                .getExternalStorageDirectory(), m_appNameStr)),                "application/vnd.android.package-archive");        startActivity(intent);    }}


 

最後是Common.java類:

類似一個工具類,很多方法都寫在這裡面,下載完成後,開始執行安裝的操作!

public class Common {public static final String SERVER_IP="http://192.168.1.105/";public static final String SERVER_ADDRESS=SERVER_IP+"try_downloadFile_progress_server/index.php";//軟體更新包地址public static final String UPDATESOFTADDRESS=SERVER_IP+"try_downloadFile_progress_server/update_pakage/baidu.apk";//軟體更新包地址/** * 向伺服器發送查詢請求,返回查到的StringBuilder類型資料 *  * @param ArrayList *            <NameValuePair> vps POST進來的參值對 * @return StringBuilder builder 返回查到的結果 * @throws Exception */public static StringBuilder post_to_server(List<NameValuePair> vps) {DefaultHttpClient httpclient = new DefaultHttpClient();try {HttpResponse response = null;// 建立httpost.訪問本機伺服器網址HttpPost httpost = new HttpPost(SERVER_ADDRESS);StringBuilder builder = new StringBuilder();httpost.setEntity(new UrlEncodedFormEntity(vps, HTTP.UTF_8));response = httpclient.execute(httpost); // 執行if (response.getEntity() != null) {// 如果伺服器端JSON沒寫對,這句是會出異常,是執行不過去的BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));String s = reader.readLine();for (; s != null; s = reader.readLine()) {builder.append(s);}}return builder;} catch (Exception e) {// TODO: handle exceptionLog.e("msg",e.getMessage());return null;} finally {try {httpclient.getConnectionManager().shutdown();// 關閉串連// 這兩種釋放串連的方法都可以} catch (Exception e) {// TODO Auto-generated catch blockLog.e("msg",e.getMessage());}}}/** * 擷取軟體版本號碼 * @param context * @return */public static int getVerCode(Context context) {        int verCode = -1;        try {        //注意:"com.example.try_downloadfile_progress"對應AndroidManifest.xml裡的package="……"部分            verCode = context.getPackageManager().getPackageInfo(                    "com.example.try_downloadfile_progress", 0).versionCode;        } catch (NameNotFoundException e) {        Log.e("msg",e.getMessage());        }        return verCode;    }   /**    * 擷取版本名稱    * @param context    * @return    */    public static String getVerName(Context context) {        String verName = "";        try {            verName = context.getPackageManager().getPackageInfo(                    "com.example.try_downloadfile_progress", 0).versionName;        } catch (NameNotFoundException e) {        Log.e("msg",e.getMessage());        }        return verName;   }

已經貼完畢!

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.