В Android не существует «прямого» способа вызвать AlertDialog из сервиса. Создатели для оповещения пользователя рекомендуют использовать Toast или уведомления. Тем не менее, такая возможность все же имеется. И реализовать ее совсем несложно:
- Добавляем в манифест строку:
<activity android:name="ServiceDialog" android:label="" android:theme="@android:style/Theme.Dialog" />
- Создаем новый класс и добавляем в него следующий код:
public class ServiceDialog extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent=getIntent(); String text = ""; if(intent.hasExtra("text")) text = intent.getStringExtra("text"); AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Alert"); alert.setIcon(android.R.drawable.ic_dialog_info); alert.setMessage(text); alert.setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ServiceDialog.this.finish(); } }); alert.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface arg0) { ServiceDialog.this.finish(); } }); alert.show(); } }
- И, наконец, вызываем наш AlertDialog внутри сервиса:
Intent intent = new Intent("android.intent.action.MAIN"); intent.setClass(this, ServiceDialog.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("text", "Hello!"); startActivity(intent);
Суть трюка заключается в том, что мы создаем пустой Activity, а на его основе уже создаем наш AlertDialog. Параметр «android:theme» в манифесте задает тему Activity и делает его внешний вид таким же, как у обычного алерта. В классе мы получаем текст сообщения, а также устанавливаем Listener'ы, в которых указываем, что Activity должно быть уничтожено, как только пользователь закроет наш алерт (нажмет «Ок» или кнопку «Назад»).
В результате, будет показан AlertDialog с текстом «Hello!».
Автор: bartwell