2016-05-30 6 views
0

Я пытаюсь написать службу, которая будет проверять каждую полночь на новые данные с сервера и будет загружать ее.В ожидании намерения Причины mainactivity для перезагрузки, почему?

Но когда я запустил приложение, экран mainActivity перезагрузится через несколько секунд. Я обманул его, и это случилось из-за этой службы, Почему это происходит?

Ее являются файлы:

MainActivity: i'v создали объект AlarmManager установить pendingIntent:

//Set alarm 
    /* Retrieve a PendingIntent that will perform a broadcast */ 
    Intent alarmIntent = new Intent(getApplicationContext(), AlarmReciever.class); 
    pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0); 
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    int interval = 1000 * 24 * 60 * 60; 

    /* Set the alarm to start at 10:30 AM */ 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, 00); 
    calendar.set(Calendar.MINUTE, 00); 
    manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent); 

AlarmReciever:

public class AlarmReciever extends BroadcastReceiver { 
    private Data newData = null; 
    public SharedPreferences settings; 
    ConnectivityManager cm = null; 
    NetworkInfo netInfo = null; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     newData = new Data(context); 

     // TODO Auto-generated method stub 
     newData.cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     newData.netInfo = newData.cm.getActiveNetworkInfo(); 
     newData.settings = PreferenceManager.getDefaultSharedPreferences(context); 
//  System.out.print("-----------------" + newData.netInfo); 
     newData.checkOnline(); 
    } 
} 

Data.java :

public void checkOnline(){ 
    if (isOnline()){ 
     System.out.print("**************** YES Internet"); 
     firstAsyncTask task = new firstAsyncTask(this); 
     try { 
      Object dobj = task.execute("par1", "par 2", "par 3").get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 

    }else{ 
     System.out.print("**************** NO Internet"); 
    } 
} 

data.java файл большой, чтобы размещать здесь, но мне кажется, что метод «checkOnline» в в результате чего приложение, чтобы перезагрузить страницу MainActivity, я должен отправить услуги по-разному?

Thanx для чтения & ответ.

ответ

0

Похоже, вы написали эту линию по ошибке

pendingIntent = PendingIntent.getService(getApplicationContext(), 0, alarmIntent, 0);

Это должно быть, как это

pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0);

Поскольку вы используете BroadcastReciever.

+0

Да, извините, я исправил его и все еще продолжаю – Eli

+0

В соответствии с вашим кодом нет подсказки, почему это происходит –

0

Запрашивает следующий сетевой доступ к сети?

Object dobj = task.execute("par1", "par 2", "par 3").get(); 

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

0

В вашей Activity вы это делаете:

manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent); 

Это приводит к тому, BroadcastReceiver быть вызваны немедленно, так как вы определили System.currentTimeMillis() как время, чтобы вызвать в первый раз.

Возможно, вы используете calendar.getTimeInMillis() в качестве первого запуска будильника. Но даже если вы измените его на это, будет по-прежнему запускаться сразу, потому что вы установили время в своем календаре до 00:00 текущего дня, который уже прошел! Вам необходимо либо использовать calendar.getTimeInMillis() + interval (который будет 00:00 на следующий день, или вы можете добавить 1 день к своему календарю, прежде чем использовать calendar.getTimeInMillis().