Help us understand the problem. What is going on with this article?

背景が透過しているDialogをつくる

More than 1 year has passed since last update.

この前書いた記事
爆速でfloat menuを作ってみた
今回、float menuをタップしたらDialogを出したい。

ServiceからDialogを出す

ServiceからDialogを出すにはDialog用のActivityを作る必要がある。

FloatMenuService.kt
//「爆速でfloat menuを作ってみた」で書いたFloatMenuService.ktの最後
        floatMenuView.setOnClickListener {
            //タップした時の処理
            //Intentを作ってActivityを立ち上がる
                val intent = Intent(this, DialogActivity::class.java)
                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                application.startActivity(intent)
        }

Dialog用のActivityを作る

DialogActivity.kt
class DialogActivity : FragmentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val fragment = DialogFragment()
        fragment.show(fragmentManager , "alert_dialog")
    }
}

作ったActivityをAndroidManifestに追加する

AndroidManifest.xml
        <activity
            android:name=".DialogActivity"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            />

Dialogを表示するFragmentを作る

DialogFragment.kt
class DialogFragment : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder = AlertDialog.Builder(activity)
        val dialog = builder.setTitle("Dialog").setMessage("うんうん、それもまたアイカツだね!").create()
        dialog.setCanceledOnTouchOutside(true)

        return dialog
    }

    override fun onStop() {
        super.onStop()
        activity.finish()
    }
}

こんな感じになった

Untitled.gif

あれ、背景が透過しているけど...何故かMainActivityがバックグラウンドから立ち上がったのか...イメージしたものと若干違うね

MainActivityを立ち上がらないようにする

どうやらこれはActivityの起動方法android:launchModeに関係があるらしい
https://developer.android.com/guide/topics/manifest/activity-element?hl=ja#lmode
今回の条件を満たすためにはandroid:launchModesingleInstanceに設定する必要らしい
公式の説明

singleInstance:システムが、インスタンスを保持しているタスクで他のアクティビティを起動しないことを除いて、"singleTask" と同じです。 アクティビティは常に、そのタスクの唯一のメンバーです。

singleInstanceの設定によってDialogActivityとMainActivityが同じタスクではなくなって、別々のタスクとして動いてるので、DialogActivityを呼び出されたときMainActivityはまだバックグラウンドにいることになった。
一行を足してこんな感じになった

AndroidManifest.xml
        <activity
            android:name=".DialogActivity"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:launchMode="singleInstance"             
        />

Untitled.gif

今回のまとめ

  1. ServiceからDialogを出したい時はActivityから出す必要がある
  2. LaunchModeをやりたいことによってちゃんと設定しましょう〜
ikarosu_chihaya
私の熱いエンジニア活動 エンカツ 始まります
mfac
実際に人を動かすことを特徴とした位置情報連動型ゲーム及びサービスを開発しています。
http://www.mobilefactory.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away