2010-04-11 19 views
9

मुझे एक एंड्रॉइड एप्लिकेशन मिला है जिसे पूरे दिन स्पोरैडिक रूप से जागृत करने की आवश्यकता है।मैं ब्रॉडकास्ट रिसीवर से डेटा को शुरू करने के माध्यम से डेटा कैसे पास करूं?

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

उपर्युक्त सभी काम करने लगते हैं, जिसमें गतिविधि स्वयं को सही तरीके से लॉन्च करती है; लेकिन मैं ब्रॉडकास्ट रिसीवर को गतिविधि को सूचित करने के लिए चाहता हूं कि यह अलार्म द्वारा शुरू किया गया था (जैसा कि उपयोगकर्ता द्वारा शुरू किया जा रहा है)। मेरे गतिविधि की onResume में

Intent i = new Intent(context, MyActivity.class); 
    i.putExtra(wakeupKey, true); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 

() विधि, मैं तो: BroadcastReceiver की विधि onReceive() से मैं कोशिश कर रहा हूँ इस, ऐसा करने के लिए इस प्रकार आशय का अतिरिक्त बंडल में एक चर सेट करने के लिए, इस बूलियन चर के अस्तित्व के लिए देखो:

protected void onResume() { 
    super.onResume(); 

    String wakeupKey = "blah";  
    if (getIntent()!=null && getIntent().getExtras()!=null) 
     Log.d("app", "onResume at " + System.currentTimeMillis() + ":" + getIntent().getExtras().getBoolean(wakeupKey)); 
    else 
     Log.d("app", "onResume at " + System.currentTimeMillis() + ": null"); 
} 

onResume() हमेशा अशक्त रिटर्न में getIntent() getExtras() कॉल - मैं इस में सब पर के माध्यम से किसी भी अतिरिक्त पारित करने के लिए सक्षम होने के लिए नहीं है। बंडल।

यदि मैं ब्रॉडकास्ट रिसीवर को ट्रिगर करने वाले लंबित इंंटेंट को अतिरिक्त बाध्य करने के लिए एक ही विधि का उपयोग करता हूं, तो अतिरिक्त बस ठीक से आते हैं।

क्या कोई मुझे बता सकता है कि किसी ब्रॉडकास्ट रिसीवर से एक गतिविधि में बंडल को पार करने के विरोध में ब्रॉडकास्ट रिसीवर से एक गतिविधि में बंडल पास करने के बारे में क्या अलग है? मुझे डर है कि मैं यहां कुछ बहुत ही गलत गलत कर रहा हूं ...

+0

क्युरियसर और कुरिओसेर ... यह सिर्फ (एमुलेटर में) काम करना शुरू किया, बिल्कुल के रूप में मैं उम्मीद थी । थोड़ी देर के लिए बार-बार काम किया। मैंने एमुलेटर को बंद कर दिया, फिर से शुरू किया (बिना कोड परिवर्तन या पुनर्मूल्यांकन के), और मैं पुराने व्यवहार पर वापस आ गया हूं (गतिविधि लॉन्च है लेकिन कोई बंडल पारित नहीं हुआ है)। मैं अभी भी दोनों रनों के लिए लॉग देख सकता हूं - पूर्व में, बंडल बाद में नहीं आ रहे हैं। –

उत्तर

30

बस यह स्पष्ट करना (क्योंकि मैं पता लगाना यह काम करने के लिए कैसे समय का एक बहुत प्रयोग किया जाता)

में सर्विस क्लास जो BroadcastReceiver फैली हुई है। onReceive()

Intent intent2open = new Intent(context, YourActivity.class); 
intent2open.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent2open.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
String name = "KEY"; 
String value = "String you want to pass"; 
intent2open.putExtra(name, value); 
context.startActivity(intent2open); 

में निम्न कोड में डाल FLAG_ACTIVITY_SINGLE_TOP यकीन है कि क्षुधा फिर से खुल नहीं करता है तो पहले से ही खुला बनाता है। इसका अर्थ यह है कि पहली जगह में आपकी सक्रियता खोला गया "पुराना" इरादा फिर से उपयोग किया जाता है और इसमें अतिरिक्त मान नहीं होंगे।http://www.anddev.org/images/android/activity_lifecycle.png

यह सिर्फ है: onResume() पता नहीं है अगर यह बाद OnCreate()->OnStart() OR onRestart()->onStart()
कृपया कहा जाता है - आप YourActivity.

public class YourActivity extends Activity { 
    private String memberFieldString; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Code doing your thing... 
    } // End of onCreate() 

    @Override 
    protected void onNewIntent(Intent intent) { 
    Log.d("YourActivity", "onNewIntent is called!"); 

    memberFieldString = intent.getStringExtra("KEY"); 

    super.onNewIntent(intent); 
} // End of onNewIntent(Intent intent) 

    @Override 
    protected void onResume() { 
     if (memberFieldString != null) { 
      if (opstartsIntent.getStringExtra(KEY) != null) { 
       Log.d("YourActivity", "memberFieldString: "+ memberFieldString); 
      } else { 
       Log.d("YourActivity", "The intent that started YourActivity did not have an extra string value"); 
      } 
     } 
    } // End of onResume() 

} // End of YourActivity 

में एक और तरीका onNewIntent() कहा जाता है में उन्हें पकड़ने कृपया ध्यान दें दो बयान करता है, तो है यह जांचने के लिए प्रयोग किया जाता है कि ऐप उपयोगकर्ता द्वारा लॉन्च किया गया है (कोई एक्स्ट्रा के साथ इरादा नहीं है) या BroadcastReceiver (एक्स्ट्रा के साथ इरादा) द्वारा।

+0

लेकिन मुझे एक ही समस्या का सामना करना पड़ रहा है? ..मेरी गतिविधि बार-बार शुरू हो रही है .. कोई अन्य अपडेट है? – CoDe

+1

यह बेवकूफ लग सकता है: लेकिन क्या आपने जांच की है कि आपने सही ध्वज सेट किया है और प्रत्येक बिंदु पर विवरण का पालन किया है?मुझे यह समझने में काफी समय लगा और मुझे एहसास हुआ कि सभी झंडे काम नहीं करते हैं जैसे कि मैं उन्हें करने की उम्मीद करता हूं। यदि आप वर्णित से अधिक झंडे जोड़ते हैं तो उन्हें हटाने का प्रयास करें। यह काम करें और फिर क्या होता है यह देखने के लिए उन्हें एक-एक करके जोड़ें। – Norfeldt

+1

"opstartsIntent" क्या है I इसे ढूंढ/संकलित नहीं कर सकता। – MrHIDEn

2

getIntent().getExtras().getBoolean(wakeupKey) के बजाय getIntent().getBooleanExtra(wakeupKey, defaultValue) लिखना अधिक पारंपरिक है। मुझे यकीन नहीं है कि यह आपकी समस्या से संबंधित है, लेकिन getExtras() के अंदर एक बंडल बनाने के साथ कुछ सामान है जो मुझे यकीन नहीं है, इसलिए यह किसी भी तरह से जाने योग्य हो सकता है।

+0

धन्यवाद जिम। बस उस बदलाव को करने की कोशिश की, लेकिन मूल्य हमेशा झूठा है (और मैं केवल इसे सच में स्थापित कर रहा हूं)। –

5

यह BroadcastReceiver तो एक गतिविधि शुरू होता है अग्रभूमि करने के लिए यूआई लाने के लिए।

यह आपकी समस्या का क्रूक्स हो सकता है। onNewIntent() ओवरराइड करने का प्रयास करें और यह देखकर कि Intent पास हो गया है, तो यह अतिरिक्त है। यदि ऐसा है, तो यह है कि जिस तरह से आपने मैनिफेस्ट में गतिविधि स्थापित की है (उदाहरण के लिए, आप singleTop का उपयोग कर रहे हैं) और तथ्य यह है कि, इस विशिष्ट मामले में, गतिविधि पहले से मौजूद थी।

आप i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); से छुटकारा पाने पर विचार कर सकते हैं और देख सकते हैं कि यह महत्वपूर्ण है या नहीं। startActivity() के लिए Intent में अतिरिक्त डाल - - ठीक काम करना चाहिए

नतीजा यह है कि आप क्या कर रहे है। वास्तव में, आप here के उदाहरण देख सकते हैं। इससे पता चलता है कि यह गतिविधि के बारे में कुछ गड़बड़ है (उदाहरण के लिए, singleTop) या जिस तरह से आप गतिविधि का आह्वान कर रहे हैं (उदाहरण के लिए, FLAG_ACTIVITY_NEW_TASK)।

संपादित करें:

के बाद से मेरा पहला शॉट काम नहीं किया, और अपने "कुरिओसेर" टिप्पणी ऊपर दिए गए ...

यह एक PendingIntent की तरह एक सा लगता है - उन के साथ, जब तक आप कदम उठाएं, आप अतिरिक्त अपडेट नहीं कर पाएंगे।

एक लहर पर, एक दूसरे <intent-filter> सिर्फ कुछ अद्वितीय कार्रवाई स्ट्रिंग पर, प्रकट में अपनी गतिविधि को जोड़ने का प्रयास करें, और उस का उपयोग कर अपने रिसीवर से अपनी गतिविधि शुरू करने का प्रयास करें। या, बस अपने Intent में कुछ एक्शन स्ट्रिंग को टॉस करें कि रिसीवर मैनिफेस्ट के साथ गड़बड़ किए बिना startActivity() के लिए उपयोग कर रहा है।

+0

नहीं, onNewIntent() यह या तो नहीं मिलता है ... FLAG_ACTIVITY_NEW_TASK है क्योंकि इसके बिना मैं एक RuntimeException मिलती है: ई/AndroidRuntime (274): java.lang.RuntimeException: रिसीवर कॉम प्रारंभ करने में अक्षम। futureplatforms.twitchr.BirdArrivesAlarmReceiver: android.util.AndroidRuntimeException: किसी गतिविधि संदर्भ के बाहर से प्रारंभ करने की क्रिया सक्रियता() को FLAG_ACTIVITY_NEW_TASK ध्वज की आवश्यकता होती है। क्या यह वास्तव में आप चाहते हैं? –

+0

मैंने अपने पहले के उत्तर को अन्य चीजों के साथ संपादित किया जो आप कोशिश कर सकते हैं - अगर आपको उत्तर संपादन पर अधिसूचित नहीं किया जाता है तो यहां टिप्पणी करें ... – CommonsWare

+1

ठीक है, फिर से प्रयास करें। ऑन न्यूइन्टेंट() अब इसे प्राप्त करता है - मैंने गतिविधि लॉन्चमोड को सिंगल टास्क में बदल दिया है, और यह वैसे ही काम कर रहा है जैसा मैंने आशा की थी। मैं फिर नए इंटेंट को ओवरराइड करता हूं और एक वैरिएबल सेट करता हूं जो गतिविधि को अलार्म द्वारा जागृत किया गया था यह निर्धारित करने के लिए कहीं और उठा सकता है। धन्यवाद! –

1

सेट झंडा काम करता है SingleTop (अन्य झंडे के साथ मिश्रित नहीं होते हैं)

Intent intent = new Intent(ContextManager.getContext(),OrderList.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
Bundle bundle = new Bundle();  

bundle.putString("username",username); 
bundle.putString("password",password); 

intent.putExtras(bundle); 
startActivityForResult(intent,0); 
0

बस इस तरह onNewIntent ओवरराइड और बंडल वर onresume विधि में उपलब्ध हो जाएगा:

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    setIntent(intent); 
} 
संबंधित मुद्दे