Open39

Android Tips

Takayuki ShojiTakayuki Shoji

画面回転固定方法

AndroidManifest.xml

<!-- activityタグ内に追記 -->
<!-- 縦画面固定 -->
android:screenOrientation="portrait"
<!-- 横画面固定 -->
android:screenOrientation="landscape"

Activity

Java

// 縦画面固定
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// 横画面固定
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Kotlin

// 縦画面固定
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
// 横画面固定
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
Takayuki ShojiTakayuki Shoji

Android KTX

Android KTX は、Android Jetpack およびその他のAndroidライブラリに含まれるKotlinの拡張機能セット。KTXの拡張機能により、Jetpack、Androidプラットフォーム、その他のAPIで、Kotlinが簡潔になる。そうした簡素化のため、KTMの拡張機能は、次のKotlinの言語機能を活用する。

  • 拡張関数
  • 拡張プロパティ
  • ラムダ
  • 名前付きパラメータ
  • パラメータのデフォルト値
  • コルーチン
Takayuki ShojiTakayuki Shoji

Viewのレイアウト

Viewの角を丸める

参考サイト

res>drawableフォルダ内に下記xmlファイルを作成する

drawable/shape_rounded_corners_10dp.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <corners
                android:topRightRadius="10dp"
                android:bottomRightRadius="10dp"
                android:bottomLeftRadius="10dp"
                android:topLeftRadius="10dp"
                />
            <solid
                android:color="@color/button_material_light"
                />
        </shape>
    </item>
</selector>

4角のどれかを丸めたい場合は下記の丸めたい部分を選択する。

<corners
  android:topRightRadius="10dp"
  android:bottomRightRadius="10dp"
  android:bottomLeftRadius="10dp"
  android:topLeftRadius="10dp" />
Takayuki ShojiTakayuki Shoji

背景色の透過

背景色をグラデーションで透過させたい場合は下記のように記載する。
参考サイト:Androidの画像に黒を透明にする方法

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <gradient
        android:angle="90"
        android:centerColor="#59000000"
        android:endColor="@android:color/transparent"
        android:startColor="#000000" />
</shape>
Takayuki ShojiTakayuki Shoji

ARGBのカラーコード透明度

透明度 最初の2桁
100% FF
95% F2
90% E6
85% D9
80% CC
75% BF
70% B3
65% A6
60% 99
55% 8C
50% 80
45% 73
40% 66
35% 59
30% 4D
25% 40
20% 33
15% 26
10% 1A
5% 0D
0% 00
透明度 最初の2桁
100% FF
87% DE
70% B3
54% 8A
30% 4D
26% 42
12% 1F
Takayuki ShojiTakayuki Shoji

ブロードキャスト

Androidアプリは、パブリッシュ/サブスクライブのデザインパターンと同様に、Androidシステムや他のAndroidアプリからブロードキャストメッセージを送受信できる。
これらのブロードキャストは、対象となるイベントが発生したときに送信される。例えば、システムの起動、デバイスの充電の開始など、さまざまなシステムイベントが発生したときに、
Androidシステムがブロードキャストを送信する。また、アプリからカスタムブロードキャストが送信されることもある。新しいデータのダウンロードなどの他のアプリに関係する可能背のある情報の通知などが行われる。

アプリは特定のブロードキャストを受信するように登録できる。ブロードキャストが送信されると、特定の種類のブロードキャストを受信するように登録されたアプリにシステムから自動的にブロードキャストが送信される。

ブロードキャストは、アプリ間のメッセージシステムとして使用されたり、通常のユーザーフローの外部のメッセージシステムとして使用されるのが一般的。ただし、頻繁にブロードキャストに応答してバックグラウンドでジョブを実行しすぎないように注意する必要がある。

システムブロードキャスト

システムで機内モードのオンとオフが切り替えられるなど、さまざまなシステムイベントが発生するとシステムが自動的にブロードキャストを送信する。システムブロードキャストは、イベントを受信すうりるように登録されているすべてのアプリに送信される。

ブロードキャストメッセージ自体はIntentオブジェクトで囲まれており、そのオブジェクトのアクション文字列(android.intent.action.AIRPLANE_MODE など)で発生するイベントを指定する。追加フィールドに追加の情報をバンドルして、インテントに含めることもできる。例えば、機内モードのインテントには。機内モードがオンかどうか示す追加のブール値が含まれる。

インテントを読み取って、インテントから

Takayuki ShojiTakayuki Shoji

Androidアプリの終了処理

finish()

現在のActivityを閉じる。
実行すると、onPause()→onDestroy()の順番にイベントが発生する。
復帰時は、onCreate()→onStart()→onResume()の順番にイベントが発生する。

moveTaskToBack()

アプリケーション全体が中断状態になる。ホームボタンを押下した時と同じ動作になる。
実行するとonPause()イベントが発生する。
次の再開までバックグラウンドで待機状態になり、メモリ不足になった時はOSによって自動で
onDestroy()イベントが発生してアプリケーションすべてにタスクが終了する。
onDestroy()が呼ばれる前に復帰したときは最後のアクティビティから再開し、
onRestart()→onStart()→onResume()の順でイベントが発生する。

Takayuki ShojiTakayuki Shoji

xmlで現在日時の表示する

TextClockを利用する

<TextClock
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:textSize="60sp"
    android:timeZone="Asia/Tokyo"
    android:format24Hour="yyyy/MM/dd"
    android:format12Hour="yyyy/MM/dd" />
Takayuki ShojiTakayuki Shoji

Androidアプリ開発時の初期設定

  1. resフォルダで新規作成でnavigationフォルダを新規作成する
  2. navigationフォルダ内でNavigation Resource Fileを新規作成する
    1. Navigation Resource Fileの名前は自由だが、navigation_graphとする
  3. activity_main.xml※1を追加する
  4. 上記1~3により、Navigationによる画面遷移の初期設定完了

※1

<fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:navGraph="@navigation/navigation_graph"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
Takayuki ShojiTakayuki Shoji

Handlerを用いた遅延処理

非推奨記述

companion object {
    const val DELAY_TIME = 1000
}

fun delayDelay() {
     Handler().postDelayed({
             // 遅延させたい処理
          }, DELAY_TIME)
}

推奨記述

companion object {
    const val DELAY_TIME = 1000
}

fun delayDelay() {
    // Looperを明示的に指定する
     Handler(Looper.getMainLooper()).postDelayed({
             // 遅延させたい処理
          }, DELAY_TIME)
}

Androidのメインスレッド(UIスレッド)には、もともとLooperがある。

// メイン(UI)スレッドのLooperを取得
Looper looper = Looper.getMainLooper();

Looper内にはMessage Queueで処理を管理している。
ここでHandlerの引数をしていしないと、暗黙的にLooperが指定される。もしAndroidのメインスレッドのLooper以外が指定された場合クラッシュの原因になる。だからAndroidのメインスレッドのLooperを明示的に指定する。

Queue(キュー):「先入れ先出し」方式(FIFO : First In First Out)
Stack(スタック):「後入れ先出し」方式(LIFO : Last In First Out)

Takayuki ShojiTakayuki Shoji

Androidの非同期処理の方法

参考サイト:Androidでの非同期処理の8つの方法

目次

  • AsyncTask
  • IntentService
  • Loader
  • JobScheduler and GcmNetworkManager
  • CountDownTimer
  • Java Threads or Android HandlerThread
  • FutuerTask
  • Java Timer / ScheduledThreadpoolExecutor

AsyncTask

おそらく最もよく知られている非同期API。メインスレッドで結果を返す。
AsyncTaskの問題点がActivityやFragmentのライフサイクルを認識しないため、Activityが破棄された時AsyncTaskの動作を処理するのはプログラマの責任。つまり、長時間実行する操作に最適なオプションではない。アプリがバックグラウンド状態にあり、Androidによって終了された場合、バックグラウンド処理も終了する。

Takayuki ShojiTakayuki Shoji

companion object

companion objectとは?

クラス内に作成されるSingletonのこと。

companion objectの宣言方法

Kotlinでは、classの代わりにobjectキーワードを使用するとSingletonが作成できる。

記述場所についてのメモ

  • クラス上部または下部のどちらに書くか悩ましいな
  • 自動生成で作ったFragmentではクラス内の下部に生成されるので、下部に書くほうがGoogleの書き方なのかな?
  • Javaではクラス記述の直下に書いてたから下に書くのは変な感じ

参考

Takayuki ShojiTakayuki Shoji

Android開発でJavaのバージョン確認

appフォルダ内にあるbuild.gradleを確認する

Takayuki ShojiTakayuki Shoji

Kotlin coroutine

Github:https://github.com/Kotlin/kotlinx.coroutines

app/buildgradle

def coroutines_version = '1.5.0' //kotlinコルーチン用ライブラリ(async, await)のバージョン
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:coroutines_version '
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:coroutines_version '

gradle.properties

//Kotlin coroutineを使うのに必要
kotlin.coroutines=enable
Takayuki ShojiTakayuki Shoji

"@id"と"@+id"の違い

@id/hoge:R.javaにあるhogeを利用する。
@+id/hogehogeをR.java`に追加して使用する。

Takayuki ShojiTakayuki Shoji

Android Studio

File >Invalidate Caches/Restart : キャッシュを削除して再起動

Takayuki ShojiTakayuki Shoji

遅延実行処理

Java

// 3秒遅延して実行する
Handler handler = new Handler(getMainLooper());
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    // 実行したい処理
  }
}, 3000);
Takayuki ShojiTakayuki Shoji

data class

  • Kotlin特有の仕様で、データを保持するためのクラス
  • data classの作り方:data calss hoge()
  • プライマリコンストラクタに引数をひとつはもたせる
  • val orvarでイミュータブルか否かを明示する
  • 抽象クラス、openクラス、sealedクラス、インナークラスでないこと

普通のクラスとの違い

  • データを扱うのに便利なメソッドが自動で実装される
  • Anyクラスが持つ下記3つに加えてさらに下記2つのメソッドを持つ
    • toString()
    • hashCode()
    • equals()
    • copy():コピーできる
    • componentN():N番目のプロパティを返す

参考

Takayuki ShojiTakayuki Shoji

Kotlinのミュータブルとイミュータブル

Kotlinは下記の概念がある言語

  • イミュータビリティ -Immutability- (変更不可能性)
  • ミュータビリティ-Mutability- (変更可能性)

イミュータブル -Immutable- (変更不可能)なオブジェクト、ミュータブル -Mutable- (変更可能)なオブジェクトと呼んだりし、プログラムの中に出てくるオブジェクトを呼び分けたりする。

記述方法としてはミュータブルはvar、イミュータブルはvalで記載する。

参考