Service-Activity Коммуникационная обработка данных во время сна

Заявление проекта:

У меня есть простое приложение счетчик, в котором есть 6 вещей, которые я считаю. на моем носителе есть группа радиокнопок, которая выбирает, какую из тех вещей я хочу считать. Затем он отображает текущий счет для элемента на часах, а затем я могу либо добавить или вычесть 1 из него из часов. Часы являются только интерфейсом и устройством взаимодействия. это не обработка. Вся обработка информации и хранение информации осуществляется на мобильном телефоне. поэтому часы просто отправляют сообщения и отображают информацию.

Как это устроено:

Изнашивание отправляет сообщения на мобильный телефон через Wearable.MessageApi.sendMessage(), и телефон отвечает Wearable.DataApi.putDataItem(). Часы отправляют несколько форм информации, таких как add / subtract / countRequest, в дополнение к тому элементу, на который они ссылаются. мобильный телефон отвечает только запрошенным количеством предметов, и часы должны изменять отображение только в том случае, если значение отличается от того, что отображается.

Это общий вопрос понимания мессенджера. я имею

public class MyListenerService extends WearableListenerService{
    @Override
    public void onMessageReceived(MessageEvent me){
        showToast();
    }
}

Слушатель работает. Теперь я хочу сделать что-то полезное со слушателем, потому что он на самом деле отправляет данные, которые мне нужны. Но у меня возникают проблемы при общении между Сервисом и Деятельностью из-за моего ограниченного опыта. Я прочитал о приеме сообщений и трансляции. и ищу идеи о том, как реализовать, чтобы получить мой результат или лучшее понимание.

Судя по тому, что я пытаюсь написать, сервис не может напрямую взаимодействовать с моим интерфейсом, поэтому мне нужно каким-то образом общаться с моей деятельностью. Я прочитал 2 способа: обмен сообщениями (обработчики) и широковещательные приемники.

каждый из этих методов будет выполнять свою функцию, однако имеет свои недостатки, в которых я ищу лучшее понимание или помощь.

для обработчика: несмотря на то, что я могу создать статический класс обработчика и выполнить код внутри класса обработчика, потому что он статический, я не могу вызывать нестатические объекты, что означает, что если я попытаюсь это сделать, то это не удастся.

Обслуживание:

public class MyListenerService extends WearableListenerService{
    @Override
    public void onMessageReceived(MessageEvent me){
        Activity.mHandler.sendEmptyMessage(MyConstants.COMMAND);
    }
}

Деятельность:

public static Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        doThis(msg.what);
    }
}; 

private void doThis(int command){
    processCommand();
    updateUserInterface();  
}

Есть ли способ, которым я могу реализовать вышеупомянутый обработчик, потому что, когда я обрабатываю сообщение, если я просто делаю тост, он работает, поэтому я могу получить сообщение. Я просто не могу назвать нестатический объект из статического. поэтому я предполагаю, что не могу обновить объект интерфейса, даже если я просто бросил код doThis() в обработчик, так как я просто использую его в качестве промежуточного элемента. Когда я использовал LiveListeners, а onMessageReceived() был в моей деятельности, а не в отдельной службе, я просто вызвал doThis() напрямую, и он отлично работал. для BroadcastReceiver: есть много кода для показа, так что вместо этого я просто объясню свою проблему и вы сможете ответить на него. очевидно, вы должны зарегистрироваться / отменить регистрацию в onResume()/onPause(). Это лишит меня возможности обрабатывать информацию, когда телефон переходит в режим сна. весь смысл работы службы заключается в том, чтобы я мог что-то делать, когда телефон спит или активность не на переднем плане.

Раньше я делал "LiveListeners", и он работал нормально, пока активность была на переднем плане, а телефон не спал. Единственный способ заставить его работать во время сна - это задействовать службу для работы в фоновом режиме.

Поэтому мой вопрос заключается в том, как лучше всего справиться с этой ситуацией, чтобы я мог обрабатывать информацию, которую носитель отправляет на мобильный телефон, пока мобильный телефон спит. или есть другой способ отправить данные, которые я не нашел?

2 ответа

Решение

Если вы продлите WearableListenerServiceВы создаете специальный Service который работает как часть процесса вашего приложения. Вы можете использовать это, чтобы общаться с другим Service в вашем приложении, которое выполняет всю обработку или использует широковещательные сообщения (как вы отметили). В любом случае Service выполняется в контексте вашего процесса и в главном потоке - поэтому, если вам нужно выполнить какую-либо тяжелую обработку, вам нужно выгрузить ее в фоновый поток.

Так как ваш WearableListenerService объявлен в манифесте, а его жизненный цикл управляется Android Wear (по умолчанию), проще всего будет создать вторичный Service или использовать BroadcastReceiver сделать вашу обработку. Просто отметьте, что "обработка" должна быть легкой, если в БР. Если вы используете BR, посмотрите на использование LocalBroadcastManager так как это более эффективно, чем отправка трансляции через обычный Context.sendBroadcast(), Это примерно то же самое, что отправка сообщения в ваше приложение. Intent форма.

Я, конечно, не хочу сильно упрощать, но мне нравится легкий путь. Имея намерение, я просто пробуждаю мобильный или носимый от сна, а затем другие потоки также выполняют пробуждение и обрабатывают данные.

   @Override
    protected void onHandleIntent(Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.

        String tmp = " ";
        PowerManager.WakeLock wakeLock = null;
       // wakeLock.acquire();
        if (intent.getAction() != null) {
             tmp=intent.getAction();
            PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

            wakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), TAG);
            wakeLock.setReferenceCounted(true);
            if(! wakeLock.isHeld()) {
                wakeLock.acquire();
            }

Фрагмент кода из https://github.com/NickZt/E52/blob/master/wear/src/main/java/ua/zt/mezon/e52/core/MySpcIntentService.java

Другие вопросы по тегам