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

私は同じ問題を抱えていましたが、ここでどのように解決したのですか?最初の時点で 私は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); 
} 

また、マニフェストファイルにアクセス権を設定します、私はAndroidのLoadAverageService.javaクラスを参照

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

nd私は最終的にサービスからポップアップウィンドウを作成しました!これは非常に単純な例なので、複雑な関数を開発する場合は、何かを追加する必要があります。これがあなたと他の人を助けることを願っています。

関連する問題