2012-05-19 88 views
0

我有一個線程打開進度對話框並下載文件。線程下載文件時,它會更新進度條。但是如果隱藏進度對話框,線程會在通知中創建通知並更新進度欄。我想這樣做:當用戶點擊通知時,Android會打開Activity並顯示進度對話框。 我該怎麼做?如何在用戶點擊通知時運行一些代碼?

這是我的方法下載文件:

public void downloadAction(int id) { 
    if(id<0 || id>data.length) { IO.showNotify(MusicActivity.this, getResources().getStringArray(R.array.errors)[4]); return; } 
    final int itemId = id; 

    AsyncTask<Void, Integer, Boolean> downloadTask = new AsyncTask<Void, Integer, Boolean>() { 
     ProgressDialog progressDialog = new ProgressDialog(MusicActivity.this); 
     String error = null; 
     int nId = -1; 
     int progressPercent = 0; 
     boolean notificated = false; 
     int urlFileLength; 
     String FILE_NAME = fileName(data.getName(itemId)); 

     @Override 
     protected void onPreExecute() { 
      progressDialog.setTitle(data.getName(itemId)); 
      progressDialog.setIndeterminate(false); 
      progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      progressDialog.setCancelable(true); 
      progressDialog.setOnCancelListener(new OnCancelListener() { 
       public void onCancel(DialogInterface dialog) { 
        cancel(true); 
       } 
      }); 

      progressDialog.setButton(Dialog.BUTTON_POSITIVE, getResources().getString(R.string.hide), new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        progressDialog.hide(); 
       } 
      }); 
      progressDialog.setButton(Dialog.BUTTON_NEGATIVE, getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        if(progressDialog.isShowing()) { cancel(true); progressDialog.dismiss();} 
       } 
      }); 

      progressDialog.show(); 
      progressDialog.setProgressNumberFormat("");        
     } 

     @Override 
     protected Boolean doInBackground(Void... params) { 
      int localFileLength, len; 
      int fullProgress = 0; 
      byte[] bytes = new byte[1024]; 
      File rootDir = new File(PATH); 

      if(!rootDir.isDirectory()) rootDir.mkdir(); 

      try { 
       URLConnection urlConnection = new URL(data.getUrl(itemId)).openConnection(); 
       urlConnection.setConnectTimeout(20000); 
       urlConnection.setReadTimeout(60000); 

       localFileLength = (int) new File(FILE_NAME).length(); 
       urlFileLength = urlConnection.getContentLength(); 

       if (urlFileLength == 169 || urlFileLength == 0 || urlFileLength == -1) { 
        error = getResources().getStringArray(R.array.errors)[5]; 
        return false; 
       } 
       if (urlFileLength == localFileLength) { 
        error = getResources().getString(R.string.file_exist); 
        return false; 
       } else { 
        publishProgress(0, urlFileLength); 
        InputStream in = urlConnection.getInputStream(); 
        OutputStream out = new FileOutputStream(FILE_NAME); 

        while((len=in.read(bytes))!=-1) { 
         if(!isCancelled()) { 
          out.write(bytes, 0, len); 
          fullProgress += len; 
          publishProgress(fullProgress); 
         } else { 
          new File(FILE_NAME).delete(); 
          error = getResources().getString(R.string.stopped); 
          return false;        
         } 
        } 

       } 

      } catch (MalformedURLException e) { 
       new File(FILE_NAME).delete(); 
       error = getResources().getStringArray(R.array.errors)[2]; 
      } catch (IOException e) { 
       new File(FILE_NAME).delete(); 
       error = getResources().getStringArray(R.array.errors)[3]; 
      } 



      return true; 
     } 

     @Override 
     protected void onProgressUpdate(Integer ... progress) { 
      int tmp; 

      if (progress.length==2) { 
       progressDialog.setProgress(progress[0]); 
       progressDialog.setMax(progress[1]); 
      } else if(progress.length==1) { 
       if(!progressDialog.isShowing()) { 
        if(!notificated) { 
         nId = NotificationUtils.getInstace(MusicActivity.this).createDownloadNotification(data.getName(itemId)); 
         notificated = true; 
        } else { 
         tmp = (int) (progress[0]/(urlFileLength*0.01)); 
         if(progressPercent!=tmp) { 
          progressPercent = tmp; 
          NotificationUtils.getInstace(MusicActivity.this).updateProgress(nId, progressPercent); 
         } 
        } 
       } else { 
        progressDialog.setProgress(progress[0]); 
       } 
      } 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 
      if(result==true && error == null) { 
       if(progressDialog.isShowing()) { 
        IO.showNotify(MusicActivity.this, getResources().getString(R.string.downloaded) + " " + PATH); 
        progressDialog.dismiss(); 
       } else if (nId!=-1) { 
        NotificationUtils.getInstace(MusicActivity.this).cancelNotification(nId); 
        NotificationUtils.getInstace(MusicActivity.this).createMessageNotification(data.getName(itemId) + " " + getResources().getString(R.string.finished)); 
       } 
      } else { 
       if(progressDialog.isShowing()) { 
        IO.showNotify(MusicActivity.this, error); 
        progressDialog.dismiss(); 
       } else if (nId!=-1){ 
        NotificationUtils.getInstace(MusicActivity.this).cancelNotification(nId); 
        NotificationUtils.getInstace(MusicActivity.this).createMessageNotification(getResources().getString(R.string.error) + "! " + error); 
       } 
      } 

     } 

     @Override 
     protected void onCancelled() { 
      IO.showNotify(MusicActivity.this, getResources().getString(R.string.stopped)); 
     } 

    }; 

    if(downloadTask.getStatus().equals(AsyncTask.Status.PENDING) || downloadTask.getStatus().equals(AsyncTask.Status.FINISHED)) 
     downloadTask.execute(); 
} 

而這兩種方法多數民衆贊成在創建通知:

public int createDownloadNotification(String fileName) { 
    String text = context.getString(R.string.notification_downloading).concat(" ").concat(fileName); 
    RemoteViews contentView = createProgressNotification(text, text); 
    contentView.setImageViewResource(R.id.notification_download_layout_image, android.R.drawable.stat_sys_download); 

    return lastId++; 
} 


private RemoteViews createProgressNotification(String text, String topMessage) { 
    Notification notification = new Notification(android.R.drawable.stat_sys_download, topMessage, System.currentTimeMillis()); 
    RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.notification_download_layout); 
    contentView.setProgressBar(R.id.notification_download_layout_progressbar, 100, 0, false); 
    contentView.setTextViewText(R.id.notification_download_layout_title, text); 

    notification.contentView = contentView; 
    notification.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT | Notification.FLAG_ONLY_ALERT_ONCE; 

    Intent notificationIntent = new Intent(context, NotificationUtils.class); 
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 

    notification.contentIntent = contentIntent; 

    manager.notify(lastId, notification); 
    notifications.put(lastId, notification); 

    return contentView; 
} 

請幫助我......

回答

0

我不知道,但在我的通知代碼中,我沒有notification.contentIntent = contentIntent;,你似乎在​​行之前缺少了這個:

notification.setLatestEventInfo(context, MyNotifyTitle, MyNotifiyText, contentIntent); 

MyNotifyTitle是通知的標題,MyNotifyText是文本。在contentIntent之前添加它們作爲

MyIntent.putExtra("extendedTitle", notificationIntent); 
MyIntent.putExtra("extendedText" , notificationIntent); 

希望這會有所幫助。

+0

方法setLatestEventInfo(...)是depricated這就是爲什麼我沒有。我認爲你沒有理解我的問題。我想這樣做:在創建通知後,如果用戶點擊通知,然後返回到創建它並運行progressDialog.show()的線程; 如何? :( – ruslanys

+0

噢,我已經抓住你了,我會試試,謝謝 – ruslanys

+0

是的,對不起,我誤解了你的問題,忍不住 – erdomester

相關問題