2011-10-06 7 views
6

내 응용 프로그램 내부의 특정 작업을 수행하기 위해 서비스에서 팝업 창을 시작해야합니다. 나는 그것을 할 수있는 좋은 방법을 찾지 못하는 것 같습니다. 에서 onCreate 내부 (I 팝업 창을 생성하지만 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? 

사람이 도와 주실 수 있습니까? 당신이 적절한 의도와 startActivity를 호출하여 일부 avtivity을 시작해야하므로 덕분에,

-em

답변

0

서비스는 UI없이 백그라운드에서 실행됩니다.

+0

감사합니다. 조금 더 구체적 일 수 있습니까? 내 목표는 활동을 거치지 않고 서비스에서 팝업 창을 시작하는 것입니다. 특히, 나는 팝업 창을 시작하고 사용자가 일반적으로 전화를 사용함에 따라 다른 모든 창 위에 앉아 싶습니다. 이 작업을 수행 할 수 있습니까? – emi

+0

어쨌든 활동을 시작해야한다고 생각합니다. Theme.Dialog 테마를 지정하면 현재 사용자 화면 상단에 대화 상자처럼 보입니다. 방금 ​​[여기] dsicussion (http://stackoverflow.com/questions/2394477/make-android-activity-looks-like-dialog)을 발견했습니다. – slkorolev

+0

당신은 서비스에서 활동 X를 시작하고 활동 X가 대화 상자를 시작하는 것을 의미합니까? – emi

8

나는 똑같은 문제가 있었고 여기서 어떻게 해결했는지를 설명했다. 처음에 내가 안드로이드의 기본 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); 
} 

또한, 매니페스트 파일에 권한을 설정합니다, 나는 안드로이드의 LoadAverageService.java 클래스를 참조

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

nd 나는 마지막으로 서비스에서 팝업 창을 만들었습니다! 이것은 매우 간단한 예이므로 복잡한 함수를 개발하려면 더 많은 것을 추가해야 할 수도 있습니다. 희망이 당신과 다른 사람들을 도울 것입니다.