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

时间:2014-09-17 09:30:57

标签: android alarmmanager sleep wear-os wakelock

当Android Wear进入睡眠模式(屏幕变暗)时,我的代码的某些部分不会被执行。我在后台服务中使用Timer来触发某些操作,例如将数据从磨损发送到移动设备,但数据不会被发送。当我点击屏幕将其唤醒时发送。

当屏幕关闭时,我也尝试使用Timer触发振动通知,但直到我点击屏幕才会显示。

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

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

我已经尝试了很多方法来唤醒CPU,例如AlarmManager,PowerManager,Wakelock,但它不适用于Android Wear。

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

2 个答案:

答案 0 :(得分:3)

每次我从处理设备收到消息时,我都会使用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" />

答案 1 :(得分:1)

您应该使用AlarmManager以及WakefulBroadcastReceiver和startWakefulService()。见working solution 您可以在该帖子here的聊天记录中找到有关您的其他问题的答案。这是我们的应用程序唯一有效的解决方案。

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