2012-09-20 40 views
0

當我嘗試打開對話框時,出現以下android異常。從服務中調用對話框時出錯Android

09-20 09:27:46.119: W/System.err(558): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
09-20 09:27:46.139: W/System.err(558): at android.view.ViewRoot.setView(ViewRoot.java:440) 
09-20 09:27:46.139: W/System.err(558): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:181) 
09-20 09:27:46.139: W/System.err(558): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95) 
09-20 09:27:46.139: W/System.err(558): at android.app.Dialog.show(Dialog.java:269) 
09-20 09:27:46.139: W/System.err(558): at android.app.AlertDialog$Builder.show(AlertDialog.java:907) 

我打電話從服務的Android對話框,然後我嘗試下面的代碼:

handler.post(new Runnable() { 
    public void run() {        
     try{ 
      new AlertDialog.Builder(getApplicationContext()).setTitle("Alert!").setMessage("SIMPLE MESSAGE!").setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 

       } 
      }).show(); 
     } catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 
}); 

回答

0

我想這個問題是在getApplicationContext()可能返回null,傳遞正確的上下文.. 。

+0

如果我用這個來代替getApplicatonContext()這個問題電源。也許是因爲我從Service調用對話框。 – GVillani82

+0

檢查http://stackoverflow.com/a/9670742/1434631 – Nermeen

+0

您的廣播接收器將捕獲將重定向到服務的意圖,然後您的服務將調用顯示對話框的活動。 BroadCast接收器 - >服務 - >活動 我需要更多的detalis :( – GVillani82

1

您無法從服務打開對話框。對話框是一個UI組件,它需要與一個UI元素(Activity)關聯。你可以做的是從你的服務開始一個「看起來像」對話框的活動。您可以將活動的UI設置爲「DialogTheme」,以使其看起來像標準的Andrdoid對話框。只需在StackOverflow中搜索「活動對話框主題」即可。

0

步驟1: 創建類MyReciever:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class MyReceiver extends BroadcastReceiver { 
    public MyReceiver() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED)){ 
      Intent serviceIntent = new Intent(context, MyService.class); 
      context.startService(serviceIntent); 
     } 

     Intent serviceIntent = new Intent(context, MyService.class); 
     context.startService(serviceIntent); 
    } 
} 

步驟2: 創建類爲MyService

import android.app.PendingIntent; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Build; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 

public class MyService extends Service { 

    public MyService() { 
    } 

    @Override 
    public void onCreate() { 

    //your SERVICE code here... 

     super.onCreate(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Return the communication channel to the service. 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } 
} 

步驟3: 在MainActivity類別開始服務:

startService(new Intent(this, MyService.class));