KotlinになれるためにJavaで書かれたAndroidアプリをKotlinで書きなおしてみた
[Android] タイマーアプリをAlarmManagerを使って作る
これをKotlinに変換していきます。
概要
AlarmManagerを使用して、ボタンタップしたら5秒後にアラームを発生させるというもの。
今回はAndroid Studio 3.0で作成していきます。
完成形
・WatchFor.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
class WatchFor : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_watch_for) setSupportActionBar(toolbar) startstop.text = "timer" fab.setOnClickListener { view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } startstop.setOnClickListener { var calendar = Calendar.getInstance() calendar.timeInMillis = System.currentTimeMillis() calendar.add(Calendar.SECOND,5) val intent = Intent(this,AlarmBroadcastReceiver::class.java) val pending = PendingIntent.getBroadcast(this,0,intent,0) var am : AlarmManager = getSystemService(ALARM_SERVICE) as AlarmManager am.setExact(AlarmManager.RTC_WAKEUP,calendar.timeInMillis,pending) Toast.makeText(this,"SetAlarm",Toast.LENGTH_SHORT).show() } } } |
・AlarmBroadcastReceiver.kt
1 2 3 4 5 6 |
class AlarmBroadcastReceiver() : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { Toast.makeText(context,"Received",Toast.LENGTH_LONG).show() } } |
ボタン
xmlに以下のように書いておきます。
1 2 3 |
<Button android:id="@+id/startstop" android:text="Button" /> |
Javaではボタンイベントは
1 2 3 |
Button btn1 = (Button)this.findViewById(R.id.button1); btn1.setOnClickListener(new View.OnClickListener() { } |
と書いていましたがKotlinではこれだけ
1 2 |
startstop.setOnClickListener { } |
シンプルでいいですね
時間セット
時間をセットする部分です
Java
1 2 3 4 5 6 |
// 時間をセットする Calendar calendar = Calendar.getInstance(); // Calendarを使って現在の時間をミリ秒で取得 calendar.setTimeInMillis(System.currentTimeMillis()); // 5秒後に設定 calendar.add(Calendar.SECOND, 5); |
Kotlin
1 2 3 |
var calendar = Calendar.getInstance() calendar.timeInMillis = System.currentTimeMillis() calendar.add(Calendar.SECOND,5) |
インスタンス生成はvarで通常の変数のように書いていく
varとvalというのもあるがその違いは
varは書き換え可能で、valは読み込みのみ
setterの書き方も変わっています。
PendingIntent
Java
1 2 3 4 |
// Intent のインスタンス生成 Intent indent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class); // Broadcast にメッセージを送るための設定 PendingIntent pending = PendingIntent.getBroadcast(getApplicationContext(), 0, indent, 0); |
Kotlin
1 2 |
val intent = Intent(this,AlarmBroadcastReceiver::class.java) val pending = PendingIntent.getBroadcast(this,0,intent,0) |
一番はまったのはIntentを生成するところ
今回はAlarmBroadcastReceiverもkotlinで書いたのでclass.javaのjavaの部分は不要だろうと思いとってしまい、エラーが取れないので困った。
KotlinでかかれてもIntentの引数がJavaクラスを受け取るようになっているので.javaが必要なようだ
アラームセット
Java
1 2 3 |
// アラームをセットする AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); am.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pending); |
Kotlin
1 2 |
var am : AlarmManager = getSystemService(ALARM_SERVICE) as AlarmManager am.setExact(AlarmManager.RTC_WAKEUP,calendar.timeInMillis,pending) |
このas AlarmManagerというのはSmart Castというようだ
BroadcastReceiver
java
1 2 3 4 5 6 7 8 |
public class AlarmBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // toast で受け取りを確認 Toast.makeText(context, "Received ", Toast.LENGTH_LONG).show(); } } |
Kotlin
1 2 3 4 5 6 |
class AlarmBroadcastReceiver() : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { Toast.makeText(context,"Received",Toast.LENGTH_LONG).show() } } |
Kotlinではオーバーライドが明示的になってますね。Javaではアノテーションでしたが、override修飾子をつけないとオーバーライドができない
終わり
AndroidはひさしぶりにやったのでJavaすらあやしかったがKotlinはJavaよりも簡潔でわかりやすさを感じた。いいねKotlin
参考
[Kotlin de Android] 第3回: 画面遷移をしてみよう