■はじめに
Android Wear5.0からWatch Faceの作成が可能になり、なんと5.1.1からは、アンビエントモードが通常のアプリでも実装できるようになりました!!
この機能を使用するとアプリを終了することなく、情報を表示し続けることができます。
Apple WatchにはないAndroid Wear独特の機能。
これを利用すれば、面白いアプリが作れるかもしれません!
早速仕組みをご紹介します。
■アンビエントモードって?
アンビエントモードは、液晶(IPSやVA方式の場合)の黒色表示時は、消費電力が減る事を利用し、背景を黒、情報を白色にすることで消費電力を減らす機能です。特に有機ELパネルの場合は顕著な差がでます。
ブラック表示時に電力を消費しないを生かし、LGのG Watch Rの場合、通常消費電力が130mAなのに対し、アンビエントモードでは13mWと1/10になるそうです。
■アンビエントモードを実装する!
それでは実際に実装部分を見ていきます。※今回はandroid-AlwaysOnのソースを使用しています。
AndroidManifestに以下の項目を追加します。
<uses-permission android:name="android.permission.WAKE_LOCK" >
setAmbientEnabledを呼び出すことでアンビエントモードが有効になります。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//アンビエントモードを有効にする
setAmbientEnabled();
}
アンビエントモードになると、onEnterAmbientが呼び出されますので
表示をアンビエントモード用に変更します。
アンビエントモード時の表示には、規則というか決まり事があります。
※詳しくは、DisplayModesをご覧ください。
今回は、文字の色を白くし、アンチエイリアスを無効にしています。
アンビエントモード中は、1分毎にonUpdateAmbientが呼ばれます。
画面の更新が必要な場合は、この処理内に記述します。
アンビエントモードが終了すると、onExitAmbientが呼ばれるので表示を元に戻しましょう。
@Override
public void onEnterAmbient(Bundle ambientDetails) {
super.onEnterAmbient(ambientDetails);
//文字を白くし、アンチエイリアスを無効にします。
mStateTextView.setTextColor(Color.WHITE);
mStateTextView.getPaint().setAntiAlias(false);
}
@Override
public void onExitAmbient() {
super.onExitAmbient();
//表示を元に戻します
mStateTextView.setTextColor(Color.GREEN);
mStateTextView.getPaint().setAntiAlias(true);
}
@Override
public void onUpdateAmbient() {
super.onUpdateAmbient();
}
・実行結果
動かすと以下のような表示になります。電源ボタン、またはF7キー(Windowsの場合)を押すと、アンビエントモードになります。
![]() |
| 実行画面 左が通常時、右がアンビエントモード時 |
・更新間隔
アンビエントモード時は、1分間隔で更新されますがonEnterAmbient発生時から、1分ごとではなく00秒毎に呼び出されます。
そのため、初回時は1分以内に呼び出されることがあります。
![]() |
| onUpdateAmbientの呼び出しタイミング |
・更新間隔を変えたい場合
AlarmManagerを利用すると更新の間隔を変えることができます。※更新間隔が短い場合は、バッテリーの消費も激しくなるので注意が必要です
AndroidManifestに以下の項目を追加します。
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
対象となるActivityのlaunchModeをsingleInstanceにします。
<activity
android:launchMode="singleInstance" />
AlarmMangerを生成します。
private static final long ACTIVE_INTERVAL_MS = TimeUnit.SECONDS.toMillis(1);
private static final long AMBIENT_INTERVAL_MS = TimeUnit.SECONDS.toMillis(20);
private AlarmManager mAmbientStateAlarmManager;
private PendingIntent mAmbientStatePendingIntent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAmbientStateAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent ambientStateIntent = new Intent(getApplicationContext(), MainActivity.class);
mAmbientStatePendingIntent = PendingIntent.getActivity(
getApplicationContext(),
0 /* requestCode */,
ambientStateIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
アンビエントモード開始時に、Alarmをセットします。
@Override
public void onEnterAmbient(Bundle ambientDetails) {
super.onEnterAmbient(ambientDetails);
//Alarmを設定する
setAlerm();
}
priavte void setAlerm(){
long delayMs = AMBIENT_INTERVAL_MS - (timeMs % AMBIENT_INTERVAL_MS);
long triggerTimeMs = timeMs + delayMs;
//Alarmを利用し、20秒ごとに更新を行う
mAmbientStateAlarmManager.setExact(
AlarmManager.RTC_WAKEUP,
triggerTimeMs,
mAmbientStatePendingIntent);
}
更新は、onUpdateAmbientではなく、onNewIntentが呼び出されます。
※ただし、初回時のみonUpdateAmbientも呼び出されているようです。
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
//次のAlarmを設定する
setAlerm();
}
onExitAmbientとonDestroyでAlarmの解除を忘れないように注意しましょう。
@Override
public void onExitAmbient() {
super.onExitAmbient();
//Alartの停止
mAmbientStateAlarmManager.cancel(mAmbientStatePendingIntent);
}
@Override
public void onDestroy() {
//Alartを止めるのを忘れないように
mAmbientStateAlarmManager.cancel(mAmbientStatePendingIntent);
super.onDestroy();
}
・5.1.1以降を対象するに場合
5.1.1以前のAndroid Wearにインストールされたくない場合は、AndroidManifestに以下の項目を追加してください。
<uses-library android:name="com.google.android.wearable" android:required="true" />
■最後に
アンビエントモードどうでしょうか?
思いの外、実装は簡単な気がしませんか?
個人的には実装よりもアンビエントモード時のデザインをどうするか?のほうが難しいと思います。
それでも、この機能を追加することで、ユーザーにとってはかなり使いやすいアプリになるのではないでしょうか。
よかったら一度試してみてください。
ここで紹介しているソースは、Apache License, Version 2.0 のライセンスで配布されている成果物を含んでいます。
記載されている会社名、および商品名等は、各社の商標または登録商標です。




0 コメント:
コメントを投稿