Вызов AlertDialog из сервиса

в 21:18, , рубрики: alertdialog, android, service, разработка, Разработка под android, сервис, метки: , , , ,

В Android не существует «прямого» способа вызвать AlertDialog из сервиса. Создатели для оповещения пользователя рекомендуют использовать Toast или уведомления. Тем не менее, такая возможность все же имеется. И реализовать ее совсем несложно:

  1. Добавляем в манифест строку:
    <activity android:name="ServiceDialog" android:label="" android:theme="@android:style/Theme.Dialog" />
    
  2. Создаем новый класс и добавляем в него следующий код:
    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();
    	}
    	
    }
    
  3. И, наконец, вызываем наш 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

* - обязательные к заполнению поля