从服务启动弹出窗口

问题描述:

我需要从服务启动一个弹出窗口,以在我的应用程序内执行特定的操作。我似乎找不到一个好办法。里面的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

服务,所以你必须开始一些活性起着与调用startActivity适当的意向在后台运行而无需用户界面。

+0

谢谢。你能更具体一点吗?我的目标是从服务中启动弹出窗口,而无需进行任何活动。特别是,我想要启动弹出式窗口,并使其位于所有其他窗口的顶部,就像用户通常使用手机一样。这可以做到吗? – emi

+0

无论如何,我认为你必须开始一项活动。您可以将其分配给Theme.Dialog主题,使其看起来像当前用户屏幕顶部的对话框。 刚刚发现一个dsicussion [这里](http://*.com/questions/2394477/make-android-activity-looks-like-dialog)。 – slkorolev

+0

您的意思是从服务开始活动X并且有活动X启动对话框? – emi

我有同样的问题,在这里,如果我如何解决它。 在我第一次尝试使用Android的原生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类,一nd我终于从服务创建了一个弹出窗口!这是一个非常简单的例子,所以如果你想开发复杂的功能,你可能需要添加更多的东西。希望这会帮助你和其他人。