2015-11-04 2 views
1

Как показать AlertDialog в IntentService? Ошибка выглядит так: Невозможно добавить окно - токен null не для приложения. Так что это проблема с контекстом, но я не знаю, как это исправить. Любые решения? Ниже мой код:Показать оповещениеDialog в IntentService

public class GcmMessageHandler extends IntentService { 

private GoogleCloudMessaging gcm; 
private static AlertDialog alert; 

String mes; 
private Handler handler; 
public GcmMessageHandler() { 
    super("GcmMessageHandler"); 
} 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
    handler = new Handler(); 

} 
@Override 
protected void onHandleIntent(Intent intent) { 
    Bundle extras = intent.getExtras(); 

    gcm = GoogleCloudMessaging.getInstance(this); 
    String messageType = gcm.getMessageType(intent); 

    mes = extras.getString("message"); 
    MApp.wakeupSync(); 

    showToast(); 
    Log.i("GCM", "Received : (" + messageType + ") " + extras.getString("message")); 
    GcmBroadcastReceiver.completeWakefulIntent(intent); 
} 

@Override 
public void onDestroy() { 
    try { 
     gcm.unregister(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void showToast(){ 

    handler.post(new Runnable() { 
     public void run() { 
      AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext()); 
      builder.setMessage("TEST") 
        .setCancelable(false) 
        .setNegativeButton("OK", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
         } 
        }); 
      alert = builder.create(); 
      alert.show(); 
     } 
    }); 

} 
} 
+0

Я думаю, единственное, что вы можете сделать, это начать деятельность, которая показывает ваш диалог. Вы можете сделать фон активности прозрачным. – Christopher

+0

Возвратите результат, откуда вы начали. –

+0

Показать активность как диалог, <активность android: theme = "@ android: style/Theme.Dialog" /> – rajahsekar

ответ

0

Вы можете только показать AlertDialog, используя контекст деятельности.

Здесь вы используете getApplicationContext() для создания строителя, но ни контекст приложения, ни контекст службы не будут работать. Вы должны отправить трансляцию/намерение в какую-либо активность, и в ответ на это сообщение вы увидите AlertDialog внутри этого действия, используя контекст действия.

Прочитайте это для более подробной информации: https://possiblemobile.com/2013/06/context/

+0

Мой путь к StartNotification , отправьте значение с помощью braodcast в намерение и покажите предупреждение в намерении – user5523912

+0

. Я не понимаю, что вы подразумеваете под «показать предупреждение в намерении» Главное здесь не использовать getApplicationContext(), он не может работать , Вместо этого используйте любой контекст активности. –

+0

AlertDialog в задании, которое выбрано в уведомлении – user5523912

0

Определить обработчик в вашем Activity

/** 
    * Response handler 
    */ 
    private Handler handlerResponse = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
     //Show your alert here 
     } 
    }; 

сервис Start вместе с Messenger

Intent intent = new Intent(getActivity(), CommunicationService.class); 
intent.setAction(Constants.ACTION_ONE); 
intent.putExtra(Constants.EXTRA_MESSENGER, new Messenger(handlerResponse)); 
startService(intent); 

В вашей службе возвращает сообщение после завершения работы функциональность

protected void onHandleIntent(Intent intent) { 
     if (intent != null) { 
      sendResult(intent, result); 
     } 
    } 

private void sendResult(Intent intent, String result) { 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      Messenger messenger = (Messenger) extras.get(Constants.EXTRA_MESSENGER); 
      Message msg = Message.obtain(); 
      msg.obj = result; 
      try { 
       messenger.send(msg); 
      } catch (Exception e1) { 
       Log.e(getClass().getName(), "Exception sending message", e1); 
      } 
     } 
    } 

Константы

public static final String EXTRA_MESSENGER = "EXTRA_MESSENGER"; 
public static final String ACTION_ONE = "INIT_SOCKET"; 
+0

Мой путь к StartNotification, отправьте значение с помощью braodcast на намерение и покажите предупреждение в намерении – user5523912

Смежные вопросы