5

मैं एक आवेदन है कि एक प्रसारण प्राप्त करता है विकसित किया है और उसके बाद एक Activity, जहां कि Activity प्रश्नों एक ContentProvider जो वास्तविक समय में डीएनएस से जानकारी खींचती की शुरूआत।एंड्रॉइड ब्रॉडकास्ट रिसीवर, कंटेंटप्रोवाइडर और गतिविधि के बीच डेटाफ्लो?

मैं यह इतना जाने की कि बजाय शफ़ल करने में सक्षम होना चाहते हैं:

BroadcastReceiver.onReceive() { 
    Intent intent = new Intent(...); 
    intent.setData(...); // set a single String data 
    context.startActivity(intent); 
} 

Activity.onCreate() { 
    String value = intent.getData(); // get the String data 
    Cursor = ContentProvider.query(search); 
    ... 
    setContentView(...); 
} 

यह जाता है:

BroadcastReceiver.onReceive() { 
    Cursor = ContentProvider.query(...); 
    if (cursor != null) { 
    Intent intent = new Intent(...); 
    // how do I pass the cursor? 
    getContext().startActivity(intent); 
    } 
} 

Activity.onCreate() { 
    // how do I retrieve the cursor? 
    setContentView(...); 
} 

यानी अगर query() रिटर्न कोई डेटा मैं शुरू से वंचित करना चाहते हैं Activity, और ब्रॉडकास्ट संदेश सामान्य के रूप में गिरने की अनुमति देता है।

query() डेटा वापस करता है, मुझे लगता है कि Cursor, Activity को आपूर्ति किए जाने वाले ताकि मैं फिर से डेटा के लिए जाने के लिए और क्वेरी करने के लिए है नहीं करना चाहती।

बदले में, Activity का अपना यूआई है जिसे उपयोगकर्ता को जवाब देने की आवश्यकता है।

क्या यह संभव है?

उत्तर

5

आप जो चाहते हैं वह कुछ मुश्किल और मेरे लिए बल्कि अक्षम है। मैं प्रस्ताव दूंगा कि आप पहले विकल्प का उपयोग करें, लेकिन जब आप गतिविधि में कर्सर लोड करते हैं, तो जांच करें कि कोई डेटा नहीं है, और फिर गतिविधि से बाहर निकलें।

BroadcastReceiver.onReceive() { 
    Intent intent = new Intent(...); 
    intent.setData(...); // set a single String data 
    context.startActivity(intent); 
} 

Activity.onCreate() { 
    String value = intent.getData(); // get the String data 
    Cursor = ContentProvider.query(search); 

    if(cursor.isEmpty() ...){ 
    finish(); 
    return; 
    } 
    ... 
    setContentView(...); 
} 

यह ठीक उसी प्रभाव, कर्सर केवल एक बार लोड किया जाएगा, और यदि कुछ कर्सर में मौजूद गतिविधि केवल प्रदर्शित किया जाएगा होगा। एकमात्र अतिरिक्त ओवरहेड यह है कि इरादा फेंक दिया गया है, लेकिन यह बिल्कुल कर नहीं है :)

ध्यान दें कि कोई फ्लिकर या कुछ भी नहीं होगा, एंड्रॉइड ऑनरेट() (मैं ऑनस्टार्ट और ऑन्यूसम पर भी विश्वास करता हूं) ताकि उपयोगकर्ता कभी नहीं जानता कि यह हुआ।

+0

ठीक है, अच्छा लगता है - लेकिन - संदर्भ के लिए कॉल कब होता है .startActivity() वापस आती है? – Alnitak

+0

और ब्रॉडकास्ट रिसीवर को यह कैसे पता चलेगा कि गतिविधि ने कुछ भी उपयोगी किया है या नहीं? AFAIK मैं ब्रॉडकास्ट रिसीवर में startActivityForResult() का उपयोग नहीं कर सकता। – Alnitak

+0

संदर्भ के लिए कॉल .startActivity तुरंत लौटता है, अनिवार्य रूप से, यह सब कुछ बाद में शुरू होता है जैसे ही मुख्य ईवेंट थ्रेड मुक्त होता है। – sooniln

0

आपको एक कर्सर खोजने या बनाने की आवश्यकता होगी जो Serializable या पार्ससेल योग्य है (और फिर intent.setExtra() का उपयोग करें)। या हो सकता है कि इसके बजाय सभी डेटा को पार्सल के रूप में पढ़ना संभव हो और गतिविधि पर जाएं?

+0

यह मेरी सोच का भी प्रकार है - शायद पार्सेलबल, क्योंकि गतिविधि वास्तव में एक सूची गतिविधि है इसलिए मुझे एक सूची एडाप्टर के माध्यम से डेटा पास करने की आवश्यकता है। – Alnitak

संबंधित मुद्दे