2017-12-12,13 到達点メモ
対処方法を探している途中で使い道はないが
面白いものを発見したのでメモしておく
参考サイト:[Android/Kotlin] アプリの画面をスリープさせない/動画再生中はスリープを無効にする
具体的には、layout.xml に android:keepScreenOn=”true” を書くことで
画面をスリープさせないことができるのですが、通知画面でレイアウトを作りそこに先程の設定をすると通知画面が見える状態だとアプリがスリープしない状態になります。
スゴイ雑なやり方だけど、何処かに小さい透過ビューを作って
それのレイアウトに先程の設定をすれば、メインアクティビティは表示されていないくてもずっとスリープさせない状態にできるかも??
検証自体は面白そうですが、変な所で問題が起きそう気がするので実装はしません。
最終的には、サービスをフォアグラウンドで実行することにしたところ
スリープ中でも動くことは確認できた。
ただし、前の日記でも書いたが、この状態だとアプリが終了した時に
サービスが残ったままなので表示がおかしくなる。
そのため、サービス自体にアクティビティが終了しているかどうかを調べる機能が必要だった。
具体的には、アプリ起動中に特定のActivityを開いているかどうか判定するに書いてある内容をほぼそのまま使う。
ただし、自分の場合は、Activityがあるかどうかを是非としているので
(別のアクティビティへ遷移し、その後にMainActivtyに復帰した時に、
値が空のままになるのでこれだけでは使えない)
onActivityDestroyedで空にするようにする。
そうすることで、アプリをスライドして呼び出した場合
アプリが終了したことを察知できるようになる。
参考サイト:Androidで死なないServiceを実装してみた
参考サイト:アプリ起動中に特定のActivityを開いているかどうか判定する
参考サイト:[Android]自分のアプリが前面にいるかを判別する正しい方法
参考サイト:Checking if an Android application is running in the background
ただし、Kotlinでしか確認していないが、MainActivtyでクラス名を代入する際に以下のように実装すると問題が発生する
companion object {
var name:String = MainActivity.javaClass.name
}
上記のように実装した場合、
nameの中身は(アプリの設定アドレス).MainActivityではなく
(アプリの設定アドレス).MainActivity$Companionになる。
検証した結果、companion object内でクラス名を呼び出した際につくようである。
対策自体は簡単で
companion object {
var name:String = ""
}
にし、
onCreateで
name = this.javaClass.name
と呼び出せばよい。
なお、以下の面倒な文字列置換を行う必要はない。
companion object {
var name:String = MainActivity.javaClass.name.replace(Regex("\\.MainActivity.*"),".MainActivity")
}
文字列置換とかエスケープとか正規表現などで参考にしたサイト一覧
参考サイト:特殊な文字の入力(エスケープシーケンス)
参考サイト:【Java】正規表現って何?
参考サイト:Kotlin の正規表現を使う
参考サイト:Kotlin公式ドキュメント-replace
メモ書きとして残しておくが、開発者設定できる機能の中に
充電中はスリープしないという項目があるので、充電中にスリープする場合は
その機能がONになっていないか確認すること。
バージョン違いのテストもそうだが、多分これはきちんとテスト仕様書を書いて
確認しないと★1の嵐になりそうである。
明日こそいい加減バージョンアップさせたい。
これ以上は集中できないので今日はここまで。
0 コメント:
コメントを投稿