본문 바로가기
오래된글/Articles

Android Service에서 AlertDialog 띄우기

by Andrew's Akashic Records 2018. 5. 3.
728x90

Android Service에서 AlertDialog을 원칙적으로 띄울 수는 없다.

Dialog 형태의 Activity을 만들어 띄우는 편법을 사용해야 한다.


Step 1. AlertDialog Activity 정의, theme을 "Theme.Dialog”로 정의해서 PopUp 형태를 취할 수 있게 한다.

<activity

android:name=".AlertDialogActivity"

android:theme="@android:style/Theme.Dialog">

<intent-filter>

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>


Step 2. AlertDialog Layout “alertdialog.xml”, 원하는 형태의 Dialog Layout을 작성한다.

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="wrap_content"

android:layout_height="wrap_content">


<ImageView

android:id="@+id/imgView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/notification_icon"

android:layout_centerHorizontal="true" />


<ScrollView

android:id="@+id/ScrollView01"

android:layout_width="wrap_content"

android:layout_below="@id/imgView"

android:layout_height="200px">


<TextView

android:text=""

android:id="@+id/message"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />


</ScrollView>


<Button

android:id="@+id/submit"

android:layout_below="@id/ScrollView01"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:text="Cancel" />


</RelativeLayout>


Step 3. AlertDialog Activity, notiMessage을 Service로 부터 전달 받게 된다. Button을 클릭하면 Dialog 창을 닫을 수 있게 Activity를 finish 해준다.


import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.Window;

import android.widget.Button;

import android.widget.TextView;


public class AlertDialogActivity extends Activity {


private String notiMessage;


@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

Bundle bun = getIntent().getExtras();

notiMessage = bun.getString("notiMessage");

setContentView(R.layout.alertdialog);

TextView adMessage = (TextView)findViewById(R.id.message);

adMessage.setText(notiMessage);

Button adButton = (Button)findViewById(R.id.submit);

adButton.setOnClickListener(new SubmitOnClickListener());


}

private class SubmitOnClickListener implements onClickListener {


public void onClick(View v) {

finish();


}

}

}


Step 4. Service에서 AlertDialog 띄우기, intent 전달은 PendingIntent를 사용해야 한다.


Bundle bun = new Bundle();

bun.putString("notiMessage", text);


Intent popupIntent = new Intent(getApplicationContext(), AlertDialogActivity.class);


popupIntent.putExtras(bun);

PendingIntent pie= PendingIntent.getActivity(getApplicationContext(), 0, popupIntent, PendingIntent.FLAG_ONE_SHOT);

try {

pie.send();

} catch (CanceledException e) {

LogUtil.degug(e.getMessage());

}


728x90