7 Stimmen

Starten Sie das Popup-Fenster vom Service

Ich muss ein Popup-Fenster von einem Service aus starten, um etwas Bestimmtes innerhalb meiner Anwendung zu tun. Ich scheine keinen guten Weg zu finden, es zu tun. Innerhalb von onCreate() erstelle ich das Popup-Fenster, aber wenn ich es mit showAtLocation starte, erhalte ich diesen Fehler:

10-06 13:39:49.573: ERROR/AndroidRuntime(5966): Verursacht durch: android.view.WindowManager$BadTokenException: Fenster kann nicht hinzugefügt werden - Token null ist ungültig; läuft Ihre Aktivität?

Kann mir bitte jemand helfen? Vielen Dank,

-em

8voto

Nari Kim Shin Punkte 2379

Ich hatte das gleiche Problem und hier ist, wie ich es gelöst habe. Zuerst habe ich versucht, die native PopupWindow Klasse von Android zu verwenden, aber später entschied ich mich, WindowManager zu verwenden, und zwar auf diese Weise :

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

Sie können diese Service-Klasse über einen Intent aufrufen :

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

Setzen Sie auch die Berechtigung in Ihrer Manifest-Datei :

Ich habe die LoadAverageService.java Klasse von Android referenziert und schließlich ein Popup-Fenster vom Service aus erstellt! Dies ist ein sehr einfaches Beispiel, also müssen Sie vielleicht noch etwas hinzufügen, wenn Sie komplexe Funktionen entwickeln wollen. Hoffentlich hilft dies Ihnen und anderen.

0voto

slkorolev Punkte 5704

Dienst läuft im Hintergrund ohne Benutzeroberfläche, daher müssen Sie mit einem entsprechenden Intent startActivity aufrufen, um eine Aktivität zu starten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X