今回は、Android/TextClockが、
アプリがバックグランドになった際に停止されているかを検証します。
ソースコードの確認
[TextClock]
https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/TextClock.java
TextClockのソースコードになります。
Androidフレームワークでは、
オープンソースとして公開されているため、
TextClock自体を解析します。
「TextClock#onVisibilityAggregated」で、
「Runnable mTicker」の停止/再開をしているようです。
API仕様の確認
次は、「TextClock#onVisibilityAggregated」を調べます。
https://developer.android.com/reference/android/widget/TextClock#onVisibilityAggregated(boolean)
boolean: このビューとそのすべての祖先が表示され 、このビューのウィンドウも表示される場合は trueView.VISIBLE
英文も和訳も意味不明ですが、
「onVisibility」の語感から表示されたらtrueで、非表示でfalseになるように見えます。
裏付け確認用のコード作成
onVisibilityAggregatedの挙動を確認するため、
TextClockを継承した、TextClock2クラスを作成します。
[Java]
package jp.textclock;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextClock;
public class TextClock2 extends TextClock {
// Viewクラスのコンストラクタは3つでワンセット(たぶん)
public TextClock2(Context context) {
super(context);
}
public TextClock2(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TextClock2(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void onVisibilityAggregated(boolean isVisible) {
Log.d("onVisibilityAggregated", "isVisible>" + isVisible);
super.onVisibilityAggregated(isVisible);
}
}
「onVisibilityAggregated」動作でLogcat出力をするようにします。
以下は、実行時のLogcatです。
2022-10-17 22:47:46.059 onVisibilityAggregated isVisible>true
2022-10-17 22:47:50.340 onVisibilityAggregated isVisible>false
2022-10-17 22:47:52.990 onVisibilityAggregated isVisible>true
[アプリ起動時]
Logcatの1行目に「isVisible>true」が出力されています。
[アプリがバックグラウンドに移行]
Logcatの2行目に「isVisible>false」が出力されています。
[アプリがフォアグラウンドに移行]
Logcatの3行目に「isVisible>true」が出力されています。
super.onVisibilityAggregated(isVisible);
で、「TextClock#onVisibilityAggregated」が実行されるため、
- バックグラウンドで、「Runnable mTicker」の停止
- フォアグラウンドで、「Runnable mTicker」の再開
が行われていることになります。
まとめ
調べごとがあれば、Google検索するのが一般的だと思われますが、
ニッチな内容には対応できな場合もあります。
その際に自力で調査する方法として、
一例を紹介させて頂きました。