2010-10-03 12 views
28

मैं निम्नलिखित BroadcastReceiver onPause में लागू() विधि का उपयोग कर चार्ज पर मेरे nightclock आवेदन autostart करने के लिए कोशिश कर रहा हूँ से:startActivity() BroadcastReceiver

BroadcastReceiver test = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     unregisterReceiver(this); 
     Intent i = new Intent(context, NightClock.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    }   
}; 
registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED)); 

onReceive() विधि के सक्रिय होने पर यूएसबी केबल है जब प्लग इन, लेकिन गतिविधि शुरू नहीं होती है। हालांकि लॉग यह दिखाता है:

I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock } 

लॉग इन कहता है कि गतिविधि शुरू हो गई है, लेकिन कुछ भी नहीं होता है?

+0

कृपया लॉगकैट से अधिक के साथ अपनी समस्या को अपडेट करें - इस से पहले कुछ लाइनें और इसके बाद एक दर्जन या तो लाइनें। साथ ही, क्यों 'FLAG_ACTIVITY_NEW_TASK'? साथ ही, क्या गतिविधि है जो इस 'ब्रॉडकास्ट रिसीवर' को अभी भी पंजीकृत करती है जब ACTION_POWER_CONNECTED होती है? – CommonsWare

+0

सत्ता से कनेक्ट करते समय LogCat में और कोई लाइन नहीं हैं। 'ब्रॉडकास्ट रिसीवर' उसी गतिविधि में पंजीकृत है जिसे इसे शुरू करना चाहिए। यह गतिविधि अभी भी पृष्ठभूमि में चल रही है (लॉगकैट ऐप को सामने लाया गया है)। यदि कार्यकर्ता में यह गतिविधि मारे जाती है, तो 'ब्रॉडकास्ट रिसीवर' बिल्कुल ट्रिगर नहीं लग रहा है। क्या यह दृष्टिकोण शुरुआत से मेरे ऐप को गलत करने के लिए है? – Gubbel

उत्तर

16

यदि आपका लक्ष्य यह है कि NightClock जब भी ACTION_POWER_CONNECTED प्रसारण भेजा जाता है, तो शुरू होने के लिए, BroadcastReceiver का उपयोग करने का आपका दृष्टिकोण ठीक है। हालांकि, इसे किसी गतिविधि से पंजीकृत न करें। बल्कि, प्रकट में यह रजिस्टर:

<receiver android:name=".OnPowerReceiver"> 
     <intent-filter> 
       <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     </intent-filter> 
</receiver> 

फिर, अपने BroadcastReceiver एक सार्वजनिक जावा वर्ग (यहाँ OnPowerReceiver नाम है, हालांकि आप इसे कॉल कर सकते हैं जो कुछ भी आप चाहते हैं), और यह startActivity() फोन किया है।

ध्यान रखें कि उपयोगकर्ता शायद यह नहीं चाहते कि आप ऐसा कर रहे हों। "रात की घड़ी" शुरू करने के अलावा फोन को बिजली से जोड़ने के लिए कई अन्य मामले हैं। मैं नम्रता से सुझाव देता हूं कि आप बस उपयोगकर्ताओं को होम स्क्रीन के माध्यम से अपनी गतिविधि शुरू करने दें।

+0

मैंने 'ब्रॉडकास्ट रिसीवर' को मैनिफेस्ट में पंजीकृत किया है जैसा कि आपने इस कॉल के साथ 'onReceive()' विधि: 'context.startActivity (नया इरादा (संदर्भ, NightClock.class)) में कहा है; 'लेकिन कनेक्ट होने पर कुछ नहीं होता बिजली के लिए फोन। यदि मैं 'log.d (this.toString(), "ऐप शुरू करने का प्रयास कर रहा हूं ...") जोड़ता हूं, तो विधि लॉग भी नहीं जोड़ा जाता है। – Gubbel

+2

@ गुबेल: ओह। '' आज़माएं। अधिकांश समय, उनके पास स्ट्रिंग में 'ACTION_' नहीं है, लेकिन स्पष्ट रूप से वे इस पर करते हैं। – CommonsWare

+0

यह काम करता है! धन्यवाद। – Gubbel

46

आप() विधि onRecieve को पैरामीटर के रूप में पारित कर दिया संदर्भ है, तो बस का उपयोग करें:

@Override 
public void onReceive(Context context, Intent intent) { 
    //start activity 
    Intent i = new Intent(); 
    i.setClassName("com.test", "com.test.MainActivity"); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

यह काम करता है, बेशक आप अपने खुद के लिए पैकेज और गतिविधि वर्ग के नाम बदलना होगा।

+2

डाउनवोट क्यों? क्या यह बुरा है? इससे मुझे +1 में मदद मिली क्योंकि मुझे कुछ भी नहीं मिला कि यह एक बुरा दृष्टिकोण है। – Mafro34

+0

@ माफ्रो 34 मैंने अभी एक ही दृष्टिकोण की कोशिश की और कारण मुझे लगता है कि यह आदर्श नहीं है वह वह ध्वज है जो वह सेटिंग कर रहा है। क्योंकि जब तक आप यह नहीं चाहते हैं (एक नया कार्य चलाना) यह आपके आवेदन तर्क से गंभीरता से गड़बड़ कर सकता है - यह वैसे भी मेरे साथ किया। तो जब तक कि आप यही चाहते हैं, मैं एक और दृष्टिकोण खोजने की सलाह देता हूं। – AgentKnopf

+5

@AgentKnopf ऐसा लगता है कि आपके पास अधिक विकल्प नहीं है: (http://developer.android.com/reference/android/content/Context.html#startActivity%28android.content.Intent,%20android.os.Bundle से % 2 9): "ध्यान दें कि यदि इस विधि को किसी गतिविधि संदर्भ के बाहर से बुलाया जा रहा है, तो इरादे में FLAG_ACTIVITY_NEW_TASK लॉन्च ध्वज शामिल होना चाहिए। ऐसा इसलिए है क्योंकि, मौजूदा गतिविधि से शुरू किए बिना, कोई मौजूदा कार्य नहीं है नई गतिविधि को रखने के लिए और इस प्रकार इसे अपने अलग कार्य में रखा जाना चाहिए। " – aberaud

-3
Docs से

:

प्रसारण रिसीवर से गतिविधियों प्रारंभ न करें क्योंकि उपयोगकर्ता अनुभव कर्कश है; विशेष रूप से यदि एक से अधिक रिसीवर है। इसके बजाय, एक अधिसूचना प्रदर्शित करने पर विचार करें।

+0

वे इसे कई डिफ़ॉल्ट ऐप्स जैसे अलार्म और इनकमिंग कॉल में ओवरराइड करते हैं। इसलिए, यदि उपयोगकर्ता यह होना चाहता है, तो यह उसकी कॉल है। और आपका उत्तर प्रश्न का उत्तर नहीं देता है। – Dpedrinha

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