2

Цели: Я хочу разработать приложение к UI, который запускает сервис/задачи/метод периодически для обновления базы данных. Эта служба должна запускаться после периодически, даже если мое приложение не активно/видимо/пользователь выходит из приложения . Подобно an Android Service.Лучшего метод для периодической фоновой службы в Java ежевике

Я использую плагин eclipse для BlackBerry Java 7.1 SDK.

В варианты я наткнулся на следующие:

1) How to run BlackBerry application in Background

Эта ссылка предполагает, что я расширяю Application вместо UIApplication. Но я не могу этого сделать, поскольку мое приложение имеет пользовательский интерфейс.

2) Make application go in background

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

3) Run background task from MainScreen in BlackBerry?

Эта ссылка предлагает запустить I нить, но я не думаю, что если пользователь выходит из моего приложения, то поток будет работать в фоновом режиме

4) Blackberry Install background service from UI application?

Это предполагает использование CodeModuleManager, использование которого я не могу понять.

Просьба предложить наилучший способ достижения этой цели или предложить другой лучший метод.

Я новичок в ежевике, поэтому, пожалуйста, простите мое невежество.

ответ

3

Чтобы расширить Ответ Петра:

  1. Вам нужно будет создать два класса:

    class BgApp extends Applicaton 
    class UiApp extends UiApplication 
    

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

  2. Затем создайте класс, который расширяет TimerTask и реализует его метод выполнения для вызова метода, который обновляет базу данных.

    class UpdateDatabaseTask extends TimerTask 
    
  3. В конструкторе BgApp создайте таймер. И планируйте UpdateDatabaseTask с использованием метода schedule(TimerTask, long, long).

  4. Определите альтернативные точки входа, установите флажки «Не показывать на главном экране» и «Автоматический запуск при запуске» для точки входа bgapp.

  5. Проще всего использовать встроенный механизм сохранения (PersistentStore и Persistable) для хранения данных. Даже если вы используете любые другие средства, такие как RecordStore или SQLDb, оба UiApp и BgApp могут использовать доступ к той же базе данных. Значения, обновленные bgapp, будут доступны с помощью uiapp и наоборот, автоматически.

  6. Если вы хотите отправить сигнал из bgapp в uiapp (например, когда bgapp загружает новые данные, вы хотите, чтобы uiapp мгновенно загружала данные), после завершения загрузки вы можете отправить сообщение Global Event (ApplicationManager.postGlobalEvent()) и прослушать это на экране, отображающем данные (интерфейс GlobalEventListener).

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

+0

Спасибо за ответ: можете ли вы предоставить некоторую ссылку или информацию о том, как приложение UIApplication и non UI может использовать одну и ту же базу данных? –

+0

@ RachitaNanda Это происходит автоматически. Вам ничего особенного не нужно делать. Время выполнения BlackBerry не будет различать приложения Ui и non Ui, поэтому к одной базе данных можно получить доступ из обоих приложений. Оформить заказ http://docs.blackberry.com/en/developers/deliverables/29299/Storing_objects_persistently_1554312_11.jsp для получения информации о том, как создавать и использовать постоянство. – adwiv

+0

@ adwiv Спасибо, но у меня есть большая реляционная база данных, поэтому я буду использовать sqlite. Возможно, это совместное использование базы данных для sqllite? –

3

Хорошее исследование, много интересных мыслей.

Я думаю, что лучше всего попробовать простые стандартные подходы и только сделать что-то более сложное, если вам нужно.

Вот два варианта, которые будут рассматриваться как «стандарт», с краткими преимуществами и недостатками:

а) Сделайте UIApplication перейти на фоне

Вместо того, чтобы выходить, когда пользователь нажимает кнопку «Закрыть ', ваш UiApplication будет «requestBackground()». он будет автоматически загружен на передний план, когда пользователь нажимает на значок или выбирает ваше приложение из переключателя задач. Затем вы можете запускать поток каждый раз, когда захотите, или фактически оставить один запуск обновления базы данных.

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

б) Alternate запись

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

Это выглядит как более элегантное решение, но представляет некоторые возможные проблемы с коммуникацией, и его сложнее отлаживать.

В вашем случае, поскольку вы относительно новичок в BB, я бы предположил, что вы используете опцию a, и если вы обнаружите, что это не сработает для вас, вы не найдете этого сложного для замены на вариант b.

А комментировать варианты вы уже представили:

  1. Сорт покрыты вариант б
  2. Вариант А
  3. Вы правильно - Если выход из приложения, все нити убивают
  4. Лишает проблему создания приложения в первую очередь, а затем отлаживает его. Это не решение для вас, а скорее метод реализации.

Вышеприведенное краткое изложение, пожалуйста, спросите, не ясно ли это. Это может помочь с Ь: http://supportforums.blackberry.com/t5/Java-Development/Set-up-an-alternate-entry-point-for-an-application/ta-p/444847

Edit:

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

Чтобы ответить на второй вопрос, я согласен с другим ответом, в котором говорится, что альтернативная запись (фон) и приложение переднего плана могут совместно использовать базу данных SQLite.

Что касается того, как эти два человека взаимодействуют, хотя они работают очень хорошо, я лично не являюсь большим поклонником глобальных событий, потому что они распространяются на все приложения на BlackBerry. Вы можете добиться схожих вещей многими альтернативными способами - трюк заключается в том, чтобы найти то, что является общим для обоих приложений, чтобы они могли общаться. С этой целью я рекомендую использовать RuntimeStore. Смотрите эту статью KB:

http://supportforums.blackberry.com/t5/Java-Development/Create-a-singleton-using-the-RuntimeStore/ta-p/442854

касается того, как вы будете продолжать свою базу данных, мне нравится PersistentStore, потому что он присутствует на всех устройствах. Но если у вас действительно есть база данных, а не постоянные объекты, то SQLite кажется идеальной практикой. Лично я бы не использовать RecordStore, но здесь идет обсуждение вариантов:

http://supportforums.blackberry.com/t5/Java-Development/Introduction-to-Persistence-Models-on-BlackBerry/ta-p/446810

И только уточнение - в данном примере, у вас есть два приложения, BgApp и UiApp. У вас будет только один метод main(). Этот основной метод будет использовать аргументы, которые вы указываете, чтобы определить, какой из них будет запускаться, который он будет создавать, и заставить его «войти в диспетчер». Если бы я мог сделать рекомендацию - используйте «gui» в качестве аргумента, чтобы указать, что вы запустите свой UiApplication. Я столкнулся с тем обстоятельством, что ОС пыталась запустить мое альтернативное приложение Ui с этой строкой, независимо от того, что я на самом деле указал. Возможно, это было одно, но я с тех пор придерживаюсь этого.

Наконец, два комментария к использованию таймеров и Timertask для обеспечения инициированных событий. Первый комментарий, который вы делаете, - это то, что вы запускаете в TimerTask, не должно длиться так долго, поэтому вы должны просто использовать TimerTask, чтобы инициировать загрузку Thread (что может занять много времени). Во-вторых, для меня в этой ситуации я бы не использовал Timer/TimerTask. Я бы предпочел только один поток, который «ждет», а затем обрабатывает. Преимущество для меня в том, что это может быть адаптивным. Например, если вы не можете подключиться, вы можете сократить время до следующей попытки подключения. Или, если это происходит через несколько часов, вы можете увеличить время между соединениями, чтобы уменьшить потребление батареи. Или вы можете полностью отключиться, когда батарея будет очень низкой.

Надеюсь, что это поможет.

+0

Я хочу использовать опцию b, но как можно использовать связь между приложением и приложением ui? и могут ли они использовать общую базу данных? –