Translate

BTemplates.com

Powered by Blogger.

2017年12月27日水曜日

2017-12-14、15、19~21、27 到達点メモ


タイマーが終了した時に画面を点灯するように修正した

                val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
                wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
                        or PowerManager.ACQUIRE_CAUSES_WAKEUP, "disableLock")
                wakeLock.acquire()
                wakeLock.release()

PowerManager.SCREEN_BRIGHT_WAKE_LOCKは非推奨ではあるが
使用できない訳ではない。
というか、これそのものを実装する機能が見つからなかったので
これを使うしかない。
設定的には、wakeLock を取得した時に点灯するという設定の為
設定は全部近くでやる必要がある。
また、wakeLock.release()してもすぐに点灯が消えるわけではなく
単に灯りをつけるだけなら、この方がバクとかが発生しないのでこの方がよい。


ライフサイクル形式だと他のアクティビティがある場合はうまくいかない。
        ClassNoticeManager.instance.unregisterActivityLifecycleCallbacks(MyLifecycleListener())
ClassNoticeManager.instance.registerActivityLifecycleCallbacks(MyLifecycleListener())
的なやり方も試してみたが、再登録される様子はなかった。

あと、どうもデストロイされた後はずっとデストロイ扱いのようである。
すくなくともresumeとかは呼ばれなかったのは確認した。

参考サイト:Application registerActivityLifecycleCallbacks - top ranked examples from Open Source projects
参考サイト:アクティビティのライフサイクル


最終的にふと思ったのが、ようはアプリケーションが終了するときに処理をやれればいいので、onTerminateを使えばできるのではないだろうか?と思っていたが
実機では使うことができないらしい。
Android でアプリケーション開始時と終了時にごにょごにょする
アプリケーション開始時・終了時の処理を定義する
Application#onTerminateは、実機では呼ばれない。

副産物
メニューアイテムを隠す方法
 override fun onCreateOptionsMenu(menu: Menu): Boolean
でtestmenu = menuのような形で値を保持するようにし

必要な場所で
testmenu.findItem(R.id.(ボタン名)).setVisible(false)
と書けばよい

参考サイト:メニューアイテムを隠す

代案
存在しているActivityの名前を取る方法が見つかったので
そこから取得。getRunningTasksを使うのだが
これは例によって非推奨である。しかし、代案が見つからないため
一先ずこれを採用


私の場合は以下のように書いた
val manager:ActivityManager = getSystemService(Service.ACTIVITY_SERVICE) as ActivityManager
var activityFlag:Boolean = false
for (task:ActivityManager.RunningTaskInfo in manager.getRunningTasks(Int.MAX_VALUE)){
                    if(MainActivity.name.equals(task.baseActivity.className)){
                        activityFlag = true
                        break
                    }
}

代案が見つかりました。appTaskを使う。

for (tasks:ActivityManager.AppTask in manager.appTasks){ if(MainActivity.name.equals(tasks.taskInfo.baseIntent.component.className)){
                        activityFlag = true
                        break
                    }
}

なお、getRunningTasksを使った場合
他のアクティビティが前面に出ているときに
メインのアクティビティを呼び出すという処理を行った場合
サービスが止まるという事が起きた。(厳密にはサービスでタイマー処理を行っているが
それの動作が止まった)
なお、appTasksの場合は、その現象は起きなかった


参考サイト:Android L getTasksの挙動変更
参考サイト:Androidで表示しているActivity名を取得(非推奨のやり方)
参考サイト:Androidでアプリやサービスが起動しているかどうか確認する方法(非推奨のやり方)

どうも検証した結果、電源ボタンを押してスリープをすると
ほおっておくと強制的にDozeモードに入るらしい?


参考サイト:Android 画面を切るとTimerの間隔が遅くなる問題


ひとまず、電源を抜いた状態でどういう動作をするかを見ないと何とも言えなさそう。
駄目でした。

で、ふと思いついたのですが、特定の秒数ごとにWaleLockで強制的に
点灯させればよいのではと気が付いたので以下のように実装

if(now_sec % 3 == 0) {
    val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
    var wakeLock: PowerManager.WakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK
            or PowerManager.ACQUIRE_CAUSES_WAKEUP
            or PowerManager.ON_AFTER_RELEASE, "disableLock")
    wakeLock.acquire()
    wakeLock.release()
}

PowerManager.ON_AFTER_RELEASEは、このフラグを含むWakeLockがリリースされた時にthe user activity timerがリセットされるらしい。
調べてもいまいち意味が分かっていない為、推測になるがアクティビティごとにタイマーを取得しており、それが一定の値になるごとにライトの明るさを下げているのだと思われる。また、明るさを下げるたびにthe user activity timerがリセットされているのかもしれない。何故かというと、今、30分経つと自動的にスリープになるように設定しているが、now_sec % 10 == 0にすると、明るくなったり暗くなったりするからである。

なお今の設定だと電源ボタンでスリープを入れても、一度は明るく点灯するがほっておくと暗いままの点灯になる。

多分完全に消灯しても動くのが一番良いのだろうが、正直現状では実装できる範囲内でのこれ以上良い実装方法が思いつかないので一度これでリリースしました。


関係ない話になるが、GooglePlayで他の言語での順位などを調べたい場合は
アドレスの最後に、hl=(対応言語)つけると見ることができるのを初めて知った。
PC上で他の言語だとどのように表示されるか確認する際に便利。
また、言語によってアプリの表示順番も違うので、それを調べる際に参考になるかもしれない。
例:https://play.google.com/store/apps?hl=zh_HK

最近、Deploygateという存在を知り、ちょっと使い始めている状況である。
現状では、リモートテストぐらいしか使わなそうだが、わざわざPCにUSBをつながなくても使えるのは便利。

また、Deploygateはリモートログが取れるのだが、その際に
Releaseビルドだとリモートログは特殊な設定をしないと取れないので
リモートログを取りたい場合は、深い理由が無ければDebugビルドをすること。

ただ、使ってみた感想としては、なんだかんだ言ってAndroidStudioの方が見やすい。
ただし、自分のPCのせいかもしれないが、使っていて偶に接続が切れるので
そういう意味合いでは、リモートログの方が便利に感じる。

参考サイト:DeployGate SDKの設定方法
参考サイト:DeployGate SDK does not work or Cannot get DeployGate log or remote logcat

今日はここまで。

0 コメント:

コメントを投稿