2010-09-28 17 views
14

से सिस्टम ओवरले विंडो के रूप में AlertDialog को प्रदर्शित करें मुझे सेवा से AlertDialog प्रदर्शित करने में समस्या है। मैं टोस्ट का उपयोग करके या विंडोमैनेजर (TYPE_SYSTEM_ALERT या TYPE_SYSTEM_OVERLAY) का उपयोग कर कस्टम लेआउट विंडो प्रदर्शित करने में सक्षम हूं। लेकिन, मैं कस्टम लेआउट का उपयोग नहीं करना चाहता, मैं सीधे अच्छा अलर्टडिअलॉग जीयूआई का उपयोग करना पसंद करता हूं।सेवा

परिदृश्य:

  • चल रहा है सेवा। कोई सक्रिय गतिविधि मौजूद नहीं है।
  • कुछ बाहरी घटना पर, सेवा अधिसूचना भेजता
  • जब उपयोगकर्ता प्रेस अधिसूचना, सेवा PendingIntent और AlertDialog के माध्यम से सूचित किया जाता है (AlertDialog.Builder(this) के साथ बनाया) प्रदर्शित किया जाना चाहिए

त्रुटि:

ERROR/AndroidRuntime(1063): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 

खोज उत्तर के लिए मुझे इंप्रेशन का कारण बनता है कि मैं ऐसा कुछ करने की कोशिश कर रहा हूं जो वर्तमान में संभव नहीं है (एंड्रॉइड 2.2)। या शायद यह है।

+0

[एंड्रॉयड सेवा से सूचना संवाद] (के संभावित डुप्लिकेट http://stackoverflow.com/questions/3599563/चेतावनी-संवाद-से-एंड्रॉइड-सेवा) – araks

उत्तर

25

वर्णित परिदृश्य से मेल खाने वाला समाधान पाया गया है।

  • नई गतिविधि सेवा से बनाई गई है और शुरू की गई है। हालांकि, यह पारदर्शी पृष्ठभूमि के साथ गतिविधि है। इस गतिविधि में onCreate() में लाइन नहीं है। अधिक महत्वपूर्ण है, पारदर्शिता सुनिश्चित करने के

    @Android: शैली/Theme.Translucent

AndroidManifest.xml जीयूआई में इस गतिविधि के लिए थीम टैग के तहत दर्ज किया गया है। तो, नई लाइन प्रकट एक्सएमएल को जोड़ा गया (या

android:theme="@android:style/Theme.Translucent"

  • में onCreate() AlertDialog के वास्तविक प्रदर्शन AlertDialog बटन पर होता है

  • प्रेस का कारण बनता है संवाद और गतिविधि बंद करने और आशय का भेजा जा रहा है सेवा के परिणाम देने के लिए कुछ अन्य साधनों का उपयोग)।

  • सुनिश्चित करें कि आपने संवाद के लिए setOnDismissListener() को परिभाषित किया है (कार्यान्वयन गतिविधि पर समापन() को कॉल करना चाहिए)। यदि आप बैक कुंजी पर उस प्रेस को नहीं करते हैं तो संवाद रद्द कर देता है लेकिन आपको वर्तमान गतिविधि में छोड़ देता है जो पारदर्शी है और कुछ ऐसा लगता है जैसे उपयोगकर्ता वास्तव में गलत है।

+0

ज़ेलिमिर, बहुत बहुत धन्यवाद। मुझे एक ही समस्या है और मैं वास्तव में इसकी तलाश कर रहा हूं। – Amitku

+0

मुझे खुशी है कि यह सहायक था। सादर। – Zelimir

+0

अगर मैं गलत हूं तो कृपया मुझे सही करें। पारदर्शी के साथ समस्या यह नहीं है कि यह पीछे क्या है इसका एक दर्पण है? जैसे अगर यह आने वाली कॉल स्क्रीन पर है। आप वास्तव में फोन का जवाब नहीं दे सकते? क्योंकि आपकी गतिविधि इसे अवरुद्ध कर रही है (हालांकि पारदर्शी?) – Guy

6

आपके समाधान के लिए धन्यवाद। मुझे एक ही समस्या का सामना करना पड़ा और आपकी मदद से काम किया।

मैंने इस उत्तर को केवल सेवा को वापस पास करने के लिए अपना रास्ता साझा करने के लिए रखा है।

मैंने कोई अतिरिक्त कस्टम इरादा वर्ग नहीं बनाया और कुछ चाल के साथ केवल Intent.putExtra() विधियों के परिणामस्वरूप समस्या को हल किया।

सेवा में, DialogActivity शुरू करने के लिए इस कोड का उपयोग करें जो onCreate() में अलर्ट संवाद प्रदर्शित करता है।

Intent intent = new Intent(this.getApplicationContext(), DialogActivity.class); 
intent.putExtra(DialogActivity.CLASS_KEY, this.getClass().getCanonicalName()); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 

और DialogActivity में, इसे इस तरह खत्म:

private void returnOk(boolean ok) { 
    Intent srcIntent = this.getIntent(); 
    Intent tgtIntent = new Intent(); 
    String className = srcIntent.getExtras().getString(CLASS_KEY); 
    Log.d("DialogActivity", "Service Class Name: " + className); 
    ComponentName cn = new ComponentName(this.getApplicationContext(), className); 
    tgtIntent.setComponent(cn); 
    tgtIntent.putExtra(RESULT_KEY, ok ? RESULT_OK : RESULT_CANCEL); 
    this.startService(tgtIntent); 
    this.finish(); 
} 

अंत में, सेवा में, onStartCommand() विधि ओवरराइड और इरादे से परिणाम मिलता है।

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    int ret = super.onStartCommand(intent, flags, startId); 
    Bundle extras = intent.getExtras(); 
    if (extras != null) { 
     int result = extras.getInt(DialogActivity.RESULT_KEY, -1); 
     if (result >= 0) { 
      if (result == DialogActivity.RESULT_OK) { 
       // Your logic here... 
      } 
     } else { 
      // Your other start logic here... 
     } 
    } 
    return ret; 
} 

मुझे यकीन नहीं है कि यह तरीका एक अच्छा समाधान है, कम से कम यह मेरे लिए काम करता है। उम्मीद है कि यह मेरे जैसे किसी और के लिए सहायक होगा।

पूरा स्रोत यहां पाया जा सकता:

+2

परिणाम को वापस करने के लिए startService() का उपयोग करना प्रसारण का उपयोग करने से बेहतर समाधान है। मैं नियमित रूप से उस दृष्टिकोण का उपयोग करता हूं। – Zelimir

+0

हाय सीएएन आप मुझे बताएं कि CLASS_KEY निरंतर क्या है – ekjyot

+0

CLASS_KEY केवल एक स्ट्रिंग है जो आपके द्वारा दिए गए मान के लिए नाम के रूप में काम करता है। – Programus

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