Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to wake up Android Wear when it is in sleep mode?

When Android Wear goes to sleep mode (screen dimmed), some parts of my code are not executed. I use Timer in background service to trigger some actions, such as sending data from wear to mobile, but the data is not sent. It is sent when I tap the screen to wake it up.

I also try to use Timer trigger a notification with vibration when the screen is off, but it doesn't appear until I tap the screen.

In debug mode (either Bluetooth or USB), data sending and notification work fine.

I suspect this is because when Android Wear is in sleep mode, its CPU works at minimum level because the Timer is still running, but not for GoogleApiClient, IntentService, or Notification.

I have tried many ways to wake CPU up such as AlarmManager, PowerManager, Wakelock, but it did not work for Android Wear.

Anyone has encountered this problem? What is the solution?

like image 308
taingmeng Avatar asked Sep 17 '14 09:09

taingmeng


People also ask

How do I make my android not go to sleep?

Enable stay awake mode From the settings page navigate to > About Tablet > Software Information. Then tap the "Build Number" 7 times to enable developer mode. Developers mode is where you'll find the Stay Awake option, toggle to enable.

Why won't My wear OS watch connect to my phone?

If you're having issues connecting your watch and phone, please begin by making sure that your phone's OS version is compatible (Android 6.0+ and iOS 10.0+) and that the Wear OS by Google app is up-to-date. Then, check if you have activated Bluetooth on your phone, disable, and re-enable it.


2 Answers

I'm using PowerManger to wakeup my wearable device each time i receive message from handled device. Do not forget to release 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();
    }
}

And allow WAKE_UP permission in your Manifest.

<uses-permission android:name="android.permission.WAKE_LOCK" />
like image 142
Nasc Avatar answered Sep 30 '22 15:09

Nasc


You should use AlarmManager along with WakefulBroadcastReceiver and startWakefulService(). See this working solution.
You may find answers for your further questions in chat history on that post here.This is the only solution worked for our app.

@SeaDog is successful in making http calls when device in deep sleep mode with this solution. Try it.

like image 43
cgr Avatar answered Sep 30 '22 16:09

cgr