2011-10-06 18 views
6

Ho bisogno di avviare una finestra popup da un servizio per fare qualcosa di specifico all'interno della mia applicazione. Non riesco a trovare un buon modo per farlo. All'interno onCreate() creo la finestra pop-up, ma quando lo lancio con showAtLocation ottengo questo errore:Finestra popup di avvio dal servizio

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? 

qualcuno può aiutarmi? Grazie,

-em

risposta

0

servizio viene eseguito in background senza interfaccia utente in modo da avere per iniziare a qualche Avtivity con chiamando startActivity con adeguate Intent.

+0

grazie. Potresti essere un po 'più specifico? Il mio obiettivo è avviare la finestra popup dal servizio senza passare attraverso un'attività. In particolare, voglio lanciare la finestra popup e farla sedere sopra a tutte le altre finestre in quanto l'utente normalmente usa il telefono. Può essere fatto? – emi

+0

Penso che tu debba iniziare comunque un'attività. Puoi assegnarlo a tema Theme.Dialog per farlo apparire come una finestra di dialogo in cima alla schermata utente corrente. Ho appena trovato una discussione [qui] (http://stackoverflow.com/questions/2394477/make-android-activity-looks-like-dialog). – slkorolev

+0

vuoi dire iniziare l'attività X dal servizio e avere un'attività X lanciare la finestra di dialogo? – emi

8

Ho avuto lo stesso problema e qui se come ho risolto. In un primo momento ho cercato di usare nativo PopupWindow classe di Android, ma in seguito ho deciso di usare WindowManager come questo senso:

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); 
    } 
} 
} 

e si può chiamare questa classe di servizio tramite intento:

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

inoltre, impostare il permesso nel file manifest:

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

ho fatto riferimento la classe di Android LoadAverageService.java, un e finalmente ho creato una finestra popup dal servizio! Questo è un esempio molto semplice, quindi potrebbe essere necessario aggiungere qualcosa di più se si desidera sviluppare funzioni complesse. Spero che questo possa aiutare te e gli altri.

Problemi correlati