передача журналов вызовов в фоновом режиме с помощью службы

#android #service #timer #telephonymanager

#Android #Обслуживание #таймер #telephonymanager

Вопрос:

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

Структура программирования .

     public class BootableService extends Service{
           @Override
           public IBinder onBind(final Intent intent) {

                  return null;
           }
           @Override
           public void onCreate() {

                  super.onCreate();
                  // use this to start my infinite thread here which is initialised inside this service class       
           }                    
           @Override
           public void onStart(final Intent intent, final int startId) {

                 //Use this to start a telophony listener that respond to call state and add the call from the call log to a blocking queue .... 

                 telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

                 // Create a new PhoneStateListener
                 listener = new PhoneStateListener() {

                        @Override
                        public void onCallStateChanged(int state, String incomingNumber) {

                            switch (state) {

                                case TelephonyManager.CALL_STATE_IDLE:
                                     System.out.println("phone IDLE");
                                     // calls a function to add the events to a queue. that have not been sent already. 
                                     addtoQueue();                                    
                                     break;
                                case TelephonyManager.CALL_STATE_OFFHOOK:
                                   System.out.println("Phone in use");
                                   break;
                                case TelephonyManager.CALL_STATE_RINGING:
                                   System.out.println("Phone Ringing");
                                       break;
                            }

                        }
                 };
                 // Register the listener wit the telephony manager
                 telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
          }
          addToQueue()
          {
             //add to the queue add the call log not already transmitted to the server. 
          }

          class handler HandleStuff{

               this handles the data coming from the thread .,,,, the ID of the record sent. straight from the Android call log database.  and store it. 
          }

          Class ThreadRunning extends thread{

                run(){
                     while(true){
                         // This implements take the elements from the queue if present 
                         transmit 1 record/// 
                         sleep(20 seconds.)
                     }
                }
         }
}
 

логика запускается только один раз. при запуске телефона или при установке / открытии приложения. если служба еще не открыта.

Ответ №1:

Почему бы просто не использовать IntentService. Таким образом, вам не придется иметь дело со всеми потоками. Весь ваш код, который вы помещаете в свой метод onHandleIntent(), будет выполняться в отдельном потоке, и вы можете занимать столько времени, сколько захотите.

Комментарии:

1. Верно, но я не хочу, чтобы над несколькими экземплярами логики в onHandleIntent() выполнялась работа… это приведет к засорению сервера запросами данных и после развертывания этого приложения. я не хочу, чтобы это произошло, поэтому я особенно доволен таймером или потоком, который дает полный контроль над происходящим.

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

3. на самом деле я собирался отменить свой комментарий… только что узнал об этом.

4. Я понимаю, что этот метод применяется для удаления потока (в первую очередь, вы считаете это проблемой) из программы, но моя проблема в том, почему некоторые телефоны позволяют потоку работать идеально, а другие нет …. и не могли бы вы перенаправить меня на некоторые примеры кода для реализации intentservice для onHandleIntentсообщение должно работать как поток… Спасибо… Раджеш

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