从服务启动弹出窗口
问题描述:
我需要从服务启动一个弹出窗口,以在我的应用程序内执行特定的操作。我似乎找不到一个好办法。里面的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适当的意向在后台运行而无需用户界面。
答
我有同样的问题,在这里,如果我如何解决它。 在我第一次尝试使用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我终于从服务创建了一个弹出窗口!这是一个非常简单的例子,所以如果你想开发复杂的功能,你可能需要添加更多的东西。希望这会帮助你和其他人。
谢谢。你能更具体一点吗?我的目标是从服务中启动弹出窗口,而无需进行任何活动。特别是,我想要启动弹出式窗口,并使其位于所有其他窗口的顶部,就像用户通常使用手机一样。这可以做到吗? – emi
无论如何,我认为你必须开始一项活动。您可以将其分配给Theme.Dialog主题,使其看起来像当前用户屏幕顶部的对话框。 刚刚发现一个dsicussion [这里](http://*.com/questions/2394477/make-android-activity-looks-like-dialog)。 – slkorolev
您的意思是从服务开始活动X并且有活动X启动对话框? – emi