2012-08-24 32 views
6

Tôi đã phát triển một ứng dụng để tải xuống một tệp video và lưu trữ nó trong thẻ SD. Trong quá trình này, tôi cũng cập nhật tiến trình và trạng thái tải xuống dưới dạng thông báo trên thanh trạng thái bằng cách sử dụng NotificationManager.Android getIntent() trả về ý định đầu tiên

Lớp học của tôi được gọi là DownloadTask.java mở rộng AsyncTask. Vì vậy, ở đây tôi cập nhật tiến trình bằng cách sử dụng phương pháp onProgressUpdate() trong đó tôi sử dụng NotificationManager cho mục đích này. Tất cả mọi thứ hoạt động như một say mê ngoại trừ, khi hoàn thành tải về tôi muốn bấm vào thông báo để mở tập tin video cụ thể. Vì vậy, đây là những gì tôi đã làm:

mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); 

int icon = android.R.drawable.stat_sys_download_done; 
long when = System.currentTimeMillis(); 

mNotification = new Notification(icon, "", when); 
mContentTitle_complete = mContext.getString(R.string.download_complete); 
notificationIntent = new Intent(mContext,OpenDownloadedVideo.class); 
notificationIntent.putExtra("fileName", file); 
mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, 0); 
mNotification.setLatestEventInfo(mContext, file, mContentTitle_complete, mContentIntent); 
mNotification.flags = Notification.FLAG_AUTO_CANCEL; 
mNotificationManager.notify(NOTIFICATION_ID, mNotification); 

Lưu ý rằng fileNameNOTIFICATION_ID là duy nhất trong trường hợp của tôi.

Các ActivityOpenDownloadedVideo.java mở tập tin bằng cách:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try { 
     fileName = getIntent().getExtras().getString("fileName"); 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     File videoFileToPlay = new File(Environment.getExternalStorageDirectory()+"/MyFolder"+"/"+fileName); 
     i.setDataAndType(Uri.fromFile(videoFileToPlay), "video/*"); 
     startActivity(i); 
     finish(); 
    } catch(Exception e) { 
     // 
    } 
} 

Vì vậy, khi tôi tải một đoạn video cho lần đầu tiên và click vào thông báo file video thích hợp sẽ được mở ra. Tuy nhiên lần sau khi tôi tải xuống một video khác và nhấp vào thông báo, tệp đầu tiên được tải xuống sẽ được mở lại.

Điều này là do getIntent bên trong OpenDownloadedVideo trả lại Intent đầu tiên được tạo và không phải là mới nhất. Làm thế nào tôi có thể sửa lỗi này?

Ngoài ra, xin lưu ý rằng kịch bản sự cố tồn tại khi tôi tải xuống nhiều video, ví dụ: nếu tôi tải xuống năm tệp video khác nhau và có năm thông báo trên thanh trạng thái. Cùng một tệp sẽ được mở mỗi lần thông báo được nhấp.

Trả lời

4

@Alex và @Codinguser, cảm ơn bạn đã trả lời. Nhiều đánh giá cao. Tuy nhiên tôi tìm thấy một câu trả lời khác nhau có hiệu quả đối với tôi. Khi tạo một PendingIntent cho số Intent, hãy chuyển một giá trị duy nhất cho nó. Trong trường hợp của tôi, tôi đã làm điều này:

mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, 0); 

nhưng bây giờ tôi đang sử dụng NOTIFICATION_ID vì nó là duy nhất. Tôi đã thay đổi cuộc gọi ở trên thành:

mContentIntent = PendingIntent.getActivity(mContext, NOTIFICATION_ID, 
              notificationIntent, 0); 

Đó là tất cả và hoạt động.

Tôi tìm thấy một số thông tin về nó trong câu hỏi Mulitple Instances of Pending Intent

0

Điều gì sẽ xảy ra nếu bạn thực hiện hoạt động OpenDownloadedVideo SINGLE_TOP và ghi đè onNewIntent?

+0

làm thế nào để làm điều đó không ?? xin lỗi Im khá mới này. – Bopanna

+0

Tôi không biết liệu nó có giúp ích hay không. Trong trình chỉnh sửa tệp kê khai, bạn thêm SINGLE_TOP cho chế độ Khởi chạy hoạt động của bạn. Sau đó, bạn ghi đè lên hoạt động của bạn onNewIntent() và đặt cùng một mã trong đó như bạn có trong onCreate –

+0

Tôi đã thực hiện hoạt động 'OpenDownloadedVideo'' SINGLE_TOP' và bên trong hoạt động tôi đã ghi đè lên 'onNewIntent' cũng như bạn đề xuất .. .. Nhưng khi hoạt động được khởi động hoặc khởi động lại, dường như nó không đi vào trong phương thức 'onNewIntent'. – Bopanna

6

Từ Android Activity.onNewIntent() documentation

Lưu ý rằng getIntent() vẫn trả về Ý định ban đầu. Bạn có thể sử dụng setIntent (Intent) để cập nhật nó vào Intent mới này.

Vì vậy, khi bạn có được Mục đích mới, bạn cần đặt rõ ràng mục đích hoạt động.

+0

cũng, để lấy ý định mới, bạn phải ghi đè lênNewIntent(), gọi getIntent() sẽ trả về giá trị cũ ngay cả khi bạn sử dụng setIntent() – DoruChidean

+0

Đây là một câu trả lời tuyệt vời. Tôi cần thiết về cơ bản sử dụng setIntent hoặc gọi phương thức super cho onNewIntent() để đảm bảo getIntent trả về ý định mới nhất. – welshk91

10

thực sự bạn chỉ cần tạo PendingIntent với PendingIntent.FLAG_UPDATE_CURRENT, như thế này:

mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
4
/** 
* Override super.onNewIntent() so that calls to getIntent() will return the 
* latest intent that was used to start this Activity rather than the first 
* intent. 
*/ 
@Override 
public void onNewIntent(Intent intent){ 
    super.onNewIntent(intent); // Propagate. 
    setIntent(intent); // Passing the new intent to setIntent() means this new intent will be the one returned whenever getIntent() is called. 
} 
Các vấn đề liên quan