2012-08-24 17 views
6

देता है मैंने एक वीडियो फ़ाइल डाउनलोड करने और इसे एसडी कार्ड में स्टोर करने के लिए एक एप्लीकेशन विकसित किया है। प्रक्रिया में मैं NotificationManager का उपयोग कर स्टेटस बार अधिसूचना के रूप में डाउनलोड की प्रगति और स्थिति को भी अपडेट करता हूं।एंड्रॉइड getIntent() पहला इरादा

मेरी कक्षा DownloadTask.java कहलाती है AsyncTask फैली हुई है। तो यहां मैं onProgressUpdate() विधि का उपयोग करके प्रगति को अद्यतन करता हूं जहां मैं उद्देश्य के लिए NotificationManager का उपयोग करता हूं। सब कुछ एक आकर्षण की तरह काम करता है, डाउनलोड के पूरा होने पर मैं विशिष्ट वीडियो फ़ाइल खोलने के लिए अधिसूचना पर क्लिक करना चाहता हूं। तो यह मैं क्या किया है:

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); 

ध्यान दें कि fileName और NOTIFICATION_ID मेरे मामले में अद्वितीय हैं।

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) { 
     // 
    } 
} 

तो जब मैं पहली बार के लिए एक वीडियो डाउनलोड करने और नोटिफिकेशन पर क्लिक उचित वीडियो फ़ाइल खोला जाएगा:

ActivityOpenDownloadedVideo.java से फ़ाइल को खोलता है। हालांकि अगली बार जब मैं एक और वीडियो डाउनलोड करता हूं, और अधिसूचना पर क्लिक करता हूं तो डाउनलोड की गई पहली फ़ाइल फिर से खोली जाएगी।

ऐसा इसलिए है क्योंकि getIntentOpenDownloadedVideo के अंदर पहला Intent बनाया गया है और नवीनतम नहीं है। यह कैसे सही हो सकता है?

इसके अलावा, कृपया ध्यान दें कि समस्या एक परिदृश्य मौजूद है जब मैं एक से अधिक वीडियो डाउनलोड करता हूं, उदा। अगर मैं पांच अलग-अलग वीडियो फाइल डाउनलोड करता हूं और स्टेटस बार में पांच अधिसूचनाएं हैं। प्रत्येक बार एक अधिसूचना क्लिक होने पर एक ही फाइल खोली जाएगी।

उत्तर

4

@Alex और @Codinguser, आपके उत्तरों के लिए धन्यवाद। बहुत सराहना की। हालांकि मुझे एक अलग जवाब मिला जो मेरे लिए काम करता था। Intent के लिए PendingIntent बनाते समय इसके लिए एक अद्वितीय मूल्य प्राप्त करें। मेरे मामले में मैं यह कर रहा था:

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

लेकिन अब मैं NOTIFICATION_ID उपयोग कर रहा हूँ, क्योंकि यह अद्वितीय था। मैंने उपरोक्त कॉल को बदल दिया है:

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

यह सब कुछ और यह काम करता है।

मैं सवाल Mulitple Instances of Pending Intent

0

क्या होगा यदि आप OpenDownloadedVideo गतिविधि SINGLE_TOP करते हैं और onNewIntent ओवरराइड करते हैं?

+0

मैं कैसे है कि क्या करते हो ?? क्षमा करें मैं इस के लिए काफी नया हूँ। – Bopanna

+0

मुझे नहीं पता कि यह मदद करेगा या नहीं। मैनिफेस्ट एडिटर में आप अपने गतिविधि लॉन्च मोड के लिए SINGLE_TOP जोड़ते हैं। फिर आप अपनी गतिविधि के ऑन न्यूइन्टेंट() को ओवरराइड करते हैं और उसी कोड को उसी पर डालते हैं जैसे आपके पास –

+0

है, मैंने 'ओपनडाउनलोडेड वीडियो' गतिविधि 'SINGLE_TOP' बनाई है और गतिविधि के अंदर मैंने' ऑन न्यूइन्टेंट 'को ओवरराइड किया है जैसा आपने सुझाव दिया है .. .. लेकिन जब गतिविधि लॉन्च या पुन: लॉन्च की जाती है तो यह 'ऑन न्यूइन्टेंट' विधि के अंदर नहीं लगती है। – Bopanna

6
से Android Activity.onNewIntent() documentation

ध्यान दें कि getIntent() अभी भी मूल आशय रिटर्न

। आप इस नए इरादे को अपडेट करने के लिए setIntent (इरादा) का उपयोग कर सकते हैं।

तो जब आपको नया इरादा मिलता है, तो आपको इसे स्पष्ट रूप से गतिविधि के इरादे के रूप में सेट करने की आवश्यकता होती है।

+0

भी, नए इरादे को पुनर्प्राप्त करने के लिए आपको न्यूइन्टेंट() पर ओवरराइड करना है, getIntent() को कॉल करना पुराने को वापस कर देगा, भले ही आप setIntent() – DoruChidean

+0

का उपयोग करें, यह एक अच्छा जवाब है। मुझे मूल रूप से सेट इंटेन्टेंट का उपयोग करने की आवश्यकता है या यह सुनिश्चित करने के लिए कि इंटेंटेंट ने नवीनतम इरादा वापस कर दिया है, पर न्यूजेंटेंट() के लिए सुपर विधि को कॉल करने की आवश्यकता है। – welshk91

10

वास्तव में आप सिर्फ PendingIntent साथ PendingIntent बनाने की जरूरत है इस पर कुछ जानकारी नहीं मिली।FLAG_UPDATE_CURRENT, इस तरह:

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. 
} 
संबंधित मुद्दे