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