2011-10-06 20 views
6

Necesito abrir una ventana emergente de un servicio para hacer algo específico dentro de mi aplicación. No parece encontrar una buena manera de hacerlo. Dentro onCreate() se crea la ventana emergente, pero cuando inicio con showAtLocation consigo este error:Ventana emergente de inicio del servicio

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? 

Puede alguien por favor ayuda? Gracias,

-em

Respuesta

0

servicio se ejecuta en segundo plano y sin interfaz de usuario lo que tiene que iniciar algún avtivity con llamar startActivity con la intención apropiada.

+0

gracias. ¿Podrías ser un poco más específico? Mi objetivo es abrir la ventana emergente del servicio sin pasar por una actividad. En particular, quiero iniciar la ventana emergente y hacer que se asiente en la parte superior de todas las otras ventanas ya que el usuario normalmente usa el teléfono. Se puede hacer esto? – emi

+0

Creo que tienes que comenzar una actividad de todos modos. Puede asignarle el tema Theme.Dialog para que parezca un cuadro de diálogo en la parte superior de la pantalla del usuario actual. Acabo de encontrar una sugerencia [aquí] (http://stackoverflow.com/questions/2394477/make-android-activity-looks-like-dialog). – slkorolev

+0

te refieres a iniciar la actividad X desde el servicio y tener actividad X ¿iniciar el diálogo? – emi

8

Tuve el mismo problema y aquí si lo resolví. A primera vez que he tratado de usar la clase nativa PopupWindow de Android, pero luego decidí usar WindowManager como esta manera:

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

y se puede llamar a esta clase de servicio a través de la intención:

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

además, establecer el permiso en el archivo de manifiesto:

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

hice referencia a la clase de Android LoadAverageService.java, una ¡Finalmente, creé una ventana emergente del servicio! Este es un ejemplo muy simple, por lo que puede necesitar agregar algo más si desea desarrollar funciones complejas. Espero que esto te ayude a ti y a los demás.

Cuestiones relacionadas