gpt4 book ai didi

Android Wear 表盘关闭屏幕振动

转载 作者:搜寻专家 更新时间:2023-11-01 07:51:33 25 4
gpt4 key购买 nike

我有一个 Android Wear 表盘,我正试图让它在整点时振动。除了 watch 屏幕关闭的情况外,它都在工作。根据日志语句,处理程序方法每分钟调用一次,而 chime 方法则在整点调用。如果我使用 Moto 360 通过蓝牙进行调试,它甚至可以在屏幕关闭的情况下工作。如果我安装一个发布 apk,它只会在屏幕打开时振动。如果屏幕在整点时关闭,它将不会振动,直到屏幕重新亮起。我曾尝试在振动之前获取唤醒锁,但没有成功。我认为如果我在 onCreate 中获取唤醒锁并在 onDestroy 中释放它可能会起作用,但我宁愿不这样做以节省电量。另一个有趣的花絮是,我有另一个功能,当可穿戴数据 api 中的某些数据发生变化时,它会振动,并且在屏幕关闭的情况下工作。也许 WearableListenerService 唤醒 watch 足够长的时间让振动发生。我的逻辑有问题还是这是某些 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");
}
}

更新有效的解决方案是创建一个 AlarmManager 并在表盘 onCreate 中使用广播接收器注册它,然后在 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();
}

最佳答案

当 watch 进入环境模式时,它会进入深度 sleep 。结果,用 Handler 编写的代码不会运行。因此,您应该使用 AlarmManager .有关如何实现这一点的详细信息,您应该引用 this page about the always-on functionality of Android Wear 上的“更频繁地更新”部分。 .

关于蓝牙 Debug模式,我怀疑它可以工作,因为 watch 永远不会进入深度 sleep 。当我在 watch 插接时开发应用程序时也会发生同样的情况。

最后,关于唤醒频率,我认为您的功能很好,因为它每小时只触发一次。对于阅读本文的其他人,请避免每分钟唤醒 watch 超过一次,因为这会严重影响电池生命周期。在上传到 Play 商店之前,请务必测试您的表盘的电池生命周期。

关于Android Wear 表盘关闭屏幕振动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com