如何在睡眠模式下唤醒 Android Wear?

Posted

技术标签:

【中文标题】如何在睡眠模式下唤醒 Android Wear?【英文标题】:How to wake up Android Wear when it is in sleep mode? 【发布时间】:2014-11-11 06:36:16 【问题描述】:

android Wear 进入睡眠模式(屏幕变暗)时,我的部分代码不会执行。我在后台使用 Timer 来触发一些动作,比如从 Wear 发送数据到手机,但是数据没有发送出去。当我点击屏幕唤醒它时发送它。

我也尝试使用计时器在屏幕关闭时触发带有振动的通知,但直到我点击屏幕时它才会出现。

在调试模式(蓝牙或 USB)下,数据发送和通知工作正常。

我怀疑这是因为当 Android Wear 处于睡眠模式时,它的 CPU 工作在最低水平,因为 Timer 仍在运行,但不适用于 GoogleApiClient、IntentService 或 Notification。

我尝试了多种唤醒 CPU 的方法,例如 AlarmManager、PowerManager、Wakelock,但它不适用于 Android Wear。

有人遇到过这个问题吗?解决办法是什么?

【问题讨论】:

您能否提供更多详细信息,说明您究竟是如何尝试保持设备唤醒的? 试过 ACQUIRE_CAUSES_WAKEUP? 任何消息,我也在寻找类似的东西,但找不到任何解决方案。 我找到了一个使用 AlarmManager 和 AlarmManager.ELAPSED_REALTIME_WAKEUP 发送广播的解决方案。在 onReceive 中启动通知或向手机发送数据。无需使用唤醒锁。注意:AlarmManager.RTC_WAKEUP 不适用于我的情况。 报警管理器和 WakefulBroadcastReceiver 的解决方案似乎是正确的。你在这里有一个具体的例子:github.com/AlexKorovyansky/WearPomodoro 【参考方案1】:

每次我收到来自处理设备的消息时,我都使用PowerManger 唤醒我的可穿戴设备。 不要忘记发布PowerManager.WakeLock

public abstract class WatchFaceActivity extends Activity 

    private PowerManager.WakeLock mWakeLock;
    private Handler mWakeLockHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_clock_watch_face);

        PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        mWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "MyWakelockTag");

        mWakeLockHandler = new Handler();

        IntentFilter messageFilter = new IntentFilter("message-forwarded-from-data-layer");
        MessageReceiver messageReceiver = new MessageReceiver();
        LocalBroadcastManager.getInstance(this).registerReceiver(messageReceiver, messageFilter);
    

    public class MessageReceiver extends BroadcastReceiver 

        @Override
        public void onReceive(Context context, Intent intent) 
            if (!mWakeLock.isHeld()) 
                mWakeLock.acquire();
            
            mWakeLockHandler.removeCallbacksAndMessages(null);
            mWakeLockHandler.postDelayed(mReleaseRunnable, 5000);
        
    

    private Runnable mReleaseRunnable = new Runnable() 

        @Override
        public void run() 
            mWakeLock.release();
        
    ;


    @Override
    protected void onDestroy() 
        super.onDestroy();
        mWakeLockHandler.removeCallbacksAndMessages(null);
        mWakeLock.release();
    

并在您的清单中允许 WAKE_UP 权限。

<uses-permission android:name="android.permission.WAKE_LOCK" />

【讨论】:

你为什么不使用WakefulBroadcastReceiver而不是扩展BroadcastReceiver?【参考方案2】:

您应该将 AlarmManager 与 WakefulBroadcastReceiver 和 startWakefulService() 一起使用。看到这个working solution。 您可以在该帖子 here 的聊天记录中找到更多问题的答案。这是适用于我们应用的唯一解决方案。

@SeaDog 使用此解决方案在设备处于深度睡眠模式时成功进行 http 调用。试试看。

【讨论】:

以上是关于如何在睡眠模式下唤醒 Android Wear?的主要内容,如果未能解决你的问题,请参考以下文章

从睡眠模式唤醒时不会播放音频(android)

哪些事件可以唤醒处于睡眠状态的 Android 设备?

如何将 Mac 置入睡眠状态或唤醒 Mac?

如何将电脑从睡眠模式唤醒?

如何以编程方式避免android手机中的深度睡眠模式?

如果设备已被唤醒或进入睡眠状态,如何检查应用程序