kmmkの雑種系日記

学習まとめです。

Android_Kotlin 「初めてのAndroidプログラミング」chapter11章

www.amazon.co.jp

この本のサンプル

0.画面の作成

f:id:makoo5:20190730001729p:plain:w300

ここでは、画像を背景画像として画面全体に反映させている。

imageViewにはscaleTypeというものがある。

どうやら基本的に使用するものは3つでFIT_CENTER,CENTER_CROP,FIT_XYっぽい。(今回使用したのはCENTER_CROP)

FIT_CENTERは、切り取られることなく画面全体が表示される。

CENTER_CROPは、画面いっぱいにリサイズされる。その分切り取られ る。

FIT_XYは、画面いっぱいにリサイズされる。切り取られることはないが縦横の比率を考慮せずに拡大・縮小して表示される。

雑談MarkDown記法で記述する場合[f:id:xxxx:2015yyyyyyy:plain:w300]と書いてあげれば画像がリサイズできる。

1.アラーム処理のプログラム

このアラームのアプリは将来のある時点で処理Aが実行される(アラームを鳴らすなど)

この場合、AlarManager,BroadcastReceiverの2つが必要になる。

ブロードキャストとは、設定した時刻での処理実行(Androidシステムに非同期に発生する)イベントの情報を送る仕組み。

役割としては、

AlarmMagerは、ブロードキャストするインテントと、ブロードキャストする時刻を設定してくれる。

BroadcastReceiverは、インテントや情報などを受け取ってくれる。アプリが起動していない場合は自動的に起動してくれる(MainActivityと関わりをもつ)

1.1BroadcastReceiverを継承したクラスの作成

appで右クリック。 new > other > BroadcastReceiverを作成

以下が作成される。(作成したファイル。私の場合はAlarmBroadcaseReceiver.kt)

class AlarmBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        // This method is called when the BroadcastReceiver is receiving an Intent broadcast.
        TODO("AlarmBroadcastReceiver.onReceive() is not implemented")
    }
}

引数にintentがある通り、AlarmManagerで設定したintentを引数を取っていることから、BroadcastReceiver#onReceiveはintent取得後に実行される。引数のContextintentはレシーバーのcontextと設定されたintent。(今の所なぜ引数にcontextが渡るのかあまりわからない。。)

改良してメッセージ確認用のToastを記述。

Toast(1.context,2.text,3.duration)

1,使用するcontext(MainActivityのcontext???)

2,表示する内容

3,表示時間(Toast.LENGTH_SHORT / Toast.LENGTH_LONG)

.showがないと表示されない場合があるっぽい。x

class AlarmBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        // This method is called when the BroadcastReceiver is receiving an Intent broadcast.
        Toast.makeText(context,"intent受け取ったよ",Toast.LENGTH_SHORT) //追加
                 .show()
    }
}

1.2 ブロードキャストインテントの作成

AlarmManagerクラスを使用する(注意:直接インスタンス化してはいけない

・システムの AlarmService を使うためのクラス

・アプリケーションを将来のあるポイントで起動するようスケジュールできる

PendingIntentを作成する必要がある。

PendingIntentとはIntentを即座に発行せずにタイミングを指定して発行できるインテント(AlarmManagerなど)

1、getBroadcastメソッドでペディングインテントの作成

2、AlarmClockInfo,setAlarmClockでアラームの設定を行う

    private fun setAlarmManager(calender:Calendar){

  //am = alarmManager
        val am = getSystemService(Context.ALARM_SERVICE) as AlarmManager
  //intentの作成
        val intent = Intent(this,AlarmBroadcastReceiver::class.java)
  //ペディングインテントの作成
        val pending = PendingIntent.getBroadcast(this,0,intent,0)  //1

        when{
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ->{
                val info = AlarmManager.AlarmClockInfo(calender.timeInMillis,null)  //2
                am.setAlarmClock(info,pending)
                }
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ->{
                am.setExact(AlarmManager.RTC_WAKEUP,calender.timeInMillis,pending)
            }
            else ->{
                am.set(AlarmManager.RTC_WAKEUP,calender.timeInMillis,pending)
            }
        }
    }

1.3 アラームをキャンセルする

3 ダイアログを利用する 

Dialog

・DialogFragmentクラスを継承したクラスを作成する(ダイアログ管理クラス。ボタンの挙動制御などが可能)

・onCreateDialogでAlertDialogを作成(最大3つまでボタンを配置できるシンプルなダイアログ作成が可能)

・DialogFragmentクラスを継承したクラスのインスタンスを生成する

・ 処理記述後に.show()で表示する(なかったら表示されない)

3.1 アラートダイアログとは

3.2 ダイアログを作成する

app/java/pkg名 > new > Kotlin File

3.3 コールバックを用意する

コールバックとは異なるクラス間で通知する仕組み

例)ボタンが押された -> DialogFragmentからActivityへ通知 -> Activityで処理

f:id:makoo5:20190730114230p:plain

f:id:makoo5:20190730114242p:plain

一旦ここまで。。

参考

[Android]ImageViewのscaleTypeを秒で決める - Qiita

はてなブログで画像のサイズを変更する方法(Markdown環境) - conf t

Y.A.M の 雑記帳: AlarmManager