この前書いた記事
爆速でfloat menuを作ってみた
今回、float menuをタップしたらDialogを出したい。
ServiceからDialogを出す
ServiceからDialogを出すにはDialog用のActivityを作る必要がある。
//「爆速で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を作る
class DialogActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val fragment = DialogFragment()
fragment.show(fragmentManager , "alert_dialog")
}
}
作ったActivityをAndroidManifestに追加する
<activity
android:name=".DialogActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
/>
Dialogを表示するFragmentを作る
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()
}
}
こんな感じになった
あれ、背景が透過しているけど...何故かMainActivityがバックグラウンドから立ち上がったのか...イメージしたものと若干違うね
MainActivityを立ち上がらないようにする
どうやらこれはActivityの起動方法android:launchMode
に関係があるらしい
https://developer.android.com/guide/topics/manifest/activity-element?hl=ja#lmode
今回の条件を満たすためにはandroid:launchMode
をsingleInstance
に設定する必要らしい
公式の説明
singleInstance:システムが、インスタンスを保持しているタスクで他のアクティビティを起動しないことを除いて、"singleTask" と同じです。 アクティビティは常に、そのタスクの唯一のメンバーです。
singleInstanceの設定によってDialogActivityとMainActivityが同じタスクではなくなって、別々のタスクとして動いてるので、DialogActivityを呼び出されたときMainActivityはまだバックグラウンドにいることになった。
一行を足してこんな感じになった
<activity
android:name=".DialogActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:launchMode="singleInstance"
/>
今回のまとめ
- ServiceからDialogを出したい時はActivityから出す必要がある
- LaunchModeをやりたいことによってちゃんと設定しましょう〜