2011-10-06 18 views
6

मुझे अपने एप्लिकेशन के अंदर कुछ विशिष्ट करने के लिए किसी सेवा से पॉपअप विंडो लॉन्च करने की आवश्यकता है। मुझे ऐसा करने का अच्छा तरीका नहीं लगता है। onCreate अंदर() मैं पॉपअप विंडो बनाने लेकिन जब मैं showAtLocation साथ इसे लॉन्च मैं इस त्रुटि मिलती है:सेवा से पॉपअप विंडो लॉन्च करें

10-06 13:39:49.573: ERROR/AndroidRuntime(5966): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 

किसी की मदद कृपया कर सकते हैं? धन्यवाद,

-em

उत्तर

0

सेवा यूआई के बिना पृष्ठभूमि में चलता है तो आप उचित आशय के साथ startActivity बुला के साथ कुछ avtivity शुरू कर दिया है।

+0

धन्यवाद। क्या आप थोड़ा और विशिष्ट हो सकते हैं? मेरा लक्ष्य पॉपअप विंडो को किसी गतिविधि के बिना सेवा से लॉन्च करना है। विशेष रूप से, मैं पॉपअप विंडो लॉन्च करना चाहता हूं और यह अन्य सभी विंडोज़ के शीर्ष पर बैठता है क्योंकि उपयोगकर्ता सामान्य रूप से फोन का उपयोग करता है। क्या यह किया जा सकता है? – emi

+0

मुझे लगता है कि आपको वैसे भी एक गतिविधि शुरू करनी है। आप इसे वर्तमान उपयोगकर्ता स्क्रीन के शीर्ष पर संवाद की तरह दिखने के लिए थीम। डायलॉग थीम असाइन कर सकते हैं। बस एक डिस्यूशन [यहां] (http://stackoverflow.com/questions/2394477/make-android-activity-looks-like-dialog) मिला। – slkorolev

+0

क्या आप सेवा से गतिविधि एक्स शुरू करना चाहते हैं और गतिविधि एक्स को संवाद लॉन्च करना है? – emi

8

मुझे एक ही समस्या थी और यहां अगर मैंने इसे हल किया। पहले समय मैं एंड्रॉयड के मूल PopupWindow वर्ग का उपयोग करने की कोशिश की है, लेकिन बाद में मैं इस तरह की तरह WindowManager उपयोग करने का फैसला:

public class MyService extends Service { 

private View mView; 

private WindowManager.LayoutParams mParams; 
private WindowManager mWindowManager; 

@Override 
public void onCreate() { 
    super.onCreate(); 

    mView = new MyLoadView(this); 

    mParams = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.MATCH_PARENT, 150, 10, 10, 
      WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
      WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
      PixelFormat.TRANSLUCENT); 

    mParams.gravity = Gravity.CENTER; 
    mParams.setTitle("Window test"); 

    mWindowManager = (WindowManager)getSystemService(WINDOW_SERVICE); 
    mWindowManager.addView(mView, mParams); 

} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    ((WindowManager)getSystemService(WINDOW_SERVICE)).removeView(mView); 
    mView = null; 
} 

public class MyLoadView extends View { 

    private Paint mPaint; 

    public MyLoadView(Context context) { 
     super(context); 
     mPaint = new Paint(); 
     mPaint.setTextSize(50); 
     mPaint.setARGB(200, 200, 200, 200); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawText("test test test", 0, 100, mPaint); 
    } 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 
} 
} 

और तुम प्रयोजन द्वारा इस सेवा के वर्ग कॉल कर सकते हैं:

intent = new Intent(mContext, MyService.class); 
if (intent != null) { 
    getContext().startService(intent); 
} 

इसके अलावा, अपने मैनिफ़ेस्ट फ़ाइल में अनुमति सेट:,

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

मैं Android के LoadAverageService.java वर्ग संदर्भित एक अंत में मैंने सेवा से एक पॉपअप विंडो बनाई! यह एक बहुत ही सरल उदाहरण है, इसलिए यदि आप जटिल कार्यों को विकसित करना चाहते हैं तो आपको कुछ और जोड़ने की आवश्यकता हो सकती है। उम्मीद है कि यह आपको और दूसरों की मदद करेगा।

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