我有一个安卓 Wear 手表,我正尝试在小时内震动手表。 除了屏幕关闭的情况外,它工作正常。 根据日志语句,每分钟调用处理程序方法,并在小时调用chime方法。 如果我用 Moto 360在蓝牙上调试,即使屏幕关闭也能正常工作。 如果我安装一个版本的apk,它只在屏幕上的时候振动。 如果屏幕在一个小时的顶部关闭,直到屏幕回来,它才会振动。 我曾尝试在没有luck的情况下获得wake锁。 我认为,如果我获得了一个尾锁锁,然后在onDestroy中释放它,但我宁愿不要保留电池。 另一个有趣的小消息是,当可以穿戴数据api中的某些数据更改和使用屏幕时,我有另一。 也许WearableListenerService把手表唤醒足够长的时间让振动发生。 我的逻辑有什么问题或者是某些 Android Wear 设备的限制?
时间更改处理程序:final Handler mUpdateTimeHandler = new Handler() {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case MSG_UPDATE_TIME:
MyLog.d("Time Tick Message Handler");
doTimeTickStuff();
long timeMs = System.currentTimeMillis();
long delayMs = mInteractiveUpdateRateMs - (timeMs % mInteractiveUpdateRateMs);
mUpdateTimeHandler.sendEmptyMessageDelayed(MSG_UPDATE_TIME, delayMs);
break;
}
}
};
doTimeTickStuff()private void doTimeTickStuff()
{
MyLog.d("timetickstuff");
try {
mCalendar = Calendar.getInstance();
int currMin = mCalendar.get(Calendar.MINUTE);
if (currMin == 0) {
hourlyChime();
}
}
catch(Exception ex)
{
MyLog.e(ex,"Error occurred in time tick handler");
}
if (mIsVisible) {
invalidate();
}
}
hourlyChime()private void hourlyChime(){
Vibrator v = (Vibrator) getBaseContext().getSystemService(VIBRATOR_SERVICE);
if (v.hasVibrator()) {
MyLog.d("vibrating");
v.vibrate(1000);
}
else {
MyLog.d("No vibrator");
}
}
这个解决方案是用在监视面板中创建一个和 register,然后在onDestroy中取消注册接收器。
onCreate()@Override
public void onCreate(SurfaceHolder holder) {
super.onCreate(holder);
mChimeAlarmManager =
(AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent ambientStateIntent = new Intent("packagename.HOURLY_CHIME");
mChimePendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
1234, ambientStateIntent, PendingIntent.FLAG_UPDATE_CURRENT);
WeatherTime.this.registerReceiver(chimeReceiver,
new IntentFilter("packagename.HOURLY_CHIME"));
long alarmMs = getMsTillNextHour() + System.currentTimeMillis();
mChimeAlarmManager.setExact(
AlarmManager.RTC_WAKEUP,
alarmMs,
mChimePendingIntent);
}
广播接收器private BroadcastReceiver chimeReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent) {
hourlyChime();
mChimeAlarmManager.setExact(
AlarmManager.RTC_WAKEUP,
getMsTillNextHour() + System.currentTimeMillis(),
mChimePendingIntent);
}
};
onDestroy()@Override
public void onDestroy() {
mChimeAlarmManager.cancel(mChimePendingIntent);
super.onDestroy();
}