DownLoadManager的使用

最近項目版本更新,需要幹掉以前的那種應用更新功能,當用戶點擊確定更新的時候更新在後頭默默的更新,同時在通知欄裏面顯示進度,下載完應用之後再跳到安裝頁面。本代碼的邏輯是在引導頁啓動一個異步的IntentService,檢查更新之後使用downLoadManager下載 核心代碼如下:

清單文件:

      <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
             <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
         <receiver android:name=".MyReceiver">
            <intent-filter >
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
                <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>
            </intent-filter>
        </receiver>

        <service android:name=".DownLoadService" />

Activity裏面的版本號匹配:

 /**
  * 2 * 獲取版本號 3 * @return 當前應用的版本號 4
  */
 public String getVersion() {
  try {
   PackageManager manager = this.getPackageManager();
   PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
   String version = info.versionName;
   return this.getString(R.string.app_name) + version;
  } catch (Exception e) {
   e.printStackTrace();
   return "找不到版本號";
  }
 }

 // 版本號檢查的工具方法
 // 版本號檢查的工具方法
 private void checkTool(JSONObject response) {
  JSONObject jsonObj = (JSONObject) response.opt("data");
  String version = jsonObj.optString("version");
  if (!getVersion().equals(version)) {
   Dialog dialog = null;
   String title = jsonObj.optString("title");
   String content = jsonObj.optString("content");
   final String downLoadUrl = jsonObj.optString("downloadUrl");
   AlertDialog.Builder builder = new AlertDialog.Builder(this);
   builder.setTitle(title);
   builder.setMessage(content);
   builder.setNegativeButton("取消",
     new DialogInterface.OnClickListener() {

      @Override
      public void onClick(DialogInterface arg0, int arg1) {
       // TODO Auto-generated method stub
       arg0.cancel();
      }
     });
   builder.setPositiveButton("確定",
     new DialogInterface.OnClickListener() {

      @Override
      public void onClick(DialogInterface d, int arg1) {
       // TODO Auto-generated method stub
       d.cancel();
       Intent intent = new Intent(MainActivity.this,
         DownLoadService.class);
       intent.putExtra("downLoadUrl", downLoadUrl);
       MainActivity.this.startService(intent);
      }
     });
   dialog = builder.create();
   dialog.show();
  }
 }

 // 檢查版本
 public void checkUpdate(final String versionCode, String url) {
  RequestQueue requestQueue = Volley.newRequestQueue(this);

  JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
    Request.Method.GET, url, null,
    new Response.Listener<JSONObject>() {
     @Override
     public void onResponse(JSONObject response) {
      if (response.optBoolean("success")) {
       checkTool(response);
      }

     }
    }, new Response.ErrorListener() {
     @Override
     public void onErrorResponse(VolleyError arg0) {
      arg0.printStackTrace();
      System.out.println("sorry,Error");
     }
    });
  requestQueue.add(jsonObjectRequest);
 }

DownLodService裏面代碼如下:

 protected void onHandleIntent(Intent intent) {
  // TODO Auto-generated method stub
     String serviceString = Context.DOWNLOAD_SERVICE; 
     final DownloadManager downloadManager; 
     downloadManager = (DownloadManager)getSystemService(serviceString);
  String downLoadUrl = intent.getStringExtra("downLoadUrl");
  Log.e("download", "enter the service download"+downLoadUrl);
  DownloadManager.Request request = new DownloadManager.Request(
    Uri.parse("http://count.liqucn.com/d.php?id=444776&urlos=android&from_type=web"));
  request.setAllowedNetworkTypes(Request.NETWORK_WIFI);
  // 設置通知欄標題
  request.setNotificationVisibility(Request.VISIBILITY_VISIBLE);
  request.setTitle("下載");
  request.setDescription("貴金屬正在下載");
  request.setAllowedOverRoaming(false);
  // 設置文件存放目錄
 /* File file = new File(Environment.DIRECTORY_DOWNLOADS);
  if(!file.exists()){
   file.mkdirs();
  }*/
  
  request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "myApp.apk");
  MyReceiver.myReference =downloadManager.enqueue(request);

          最後在廣播裏面監聽下載完成的事件:


 public void onReceive(Context mContext, Intent intent) {
  // TODO Auto-generated method stub

  Log.e("MyReceiver", " enter thisi receiver");
  if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
   long id = intent
     .getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
   System.out.println(id == myReference);
   if (id == this.myReference) {
    Intent startIntent = new Intent(Intent.ACTION_VIEW);
    startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startIntent.setDataAndType(
      Uri.fromFile(new File(Environment
        .getExternalStorageDirectory()
        + "/download/myApp.apk")),
      "application/vnd.android.package-archive");
    mContext.startActivity(startIntent);
   }
   Toast.makeText(mContext, "下載完畢", 0).show();
  } else if (intent.getAction().equals(
    DownloadManager.ACTION_NOTIFICATION_CLICKED)) {
   // Toast.makeText(MainActivity.this, "別瞎點!!!",
   // Toast.LENGTH_SHORT).show();

  }
 }





發佈了39 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章