2015-07-18 2 views
1

Я прочитал несколько тем о повторных асинхронных задачах в фоновом режиме, я сначала использовал этот способ: https://stackoverflow.com/a/6532298, но по некоторым причинам кажется, что через некоторое время (несколько часов) он остановился.Android: повторите задачи в фоновом режиме. Правильно ли мой подход?

Итак, теперь я использую этот путь, но я не знаю, если это хороший способ продолжить:

BroadcastReceiver

public class RetrieveDataTaskBroadcast extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     SharedPreferences mSharedPreferences = context.getSharedPreferences(MY_PREF, 0); 
     int delayInMs = mSharedPreferences.getInt("set_delay_refresh", 20)*60*1000; 
     AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     Intent i = new Intent(context, RetrieveDataService.class); 
     PendingIntent pi = PendingIntent.getService(context, 0, i, 0); 
     am.cancel(pi); 
     if (delayInMs > 0) { 
      am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
        SystemClock.elapsedRealtime() + delayInMs, 
        delayInMs, pi); 
     } 
    } 

} 

Мой класс обслуживания:

public class RetrieveDataService extends Service implements OnRefreshInterface { 

    private Context context; 
    private PowerManager.WakeLock mWakeLock; 
    private static final String TAG = "REFRESH_SERVICE"; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    private void handleIntent(Intent intent) { 
     PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); 
     mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); 
     mWakeLock.acquire(); 

     //do the work 
     callAsynchronousTask(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     handleIntent(intent); 
     return START_NOT_STICKY; 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
     mWakeLock.release(); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     context = this; 
     callAsynchronousTask(); 
    } 

    public void callAsynchronousTask() { 
     //My asynchronous task => execute a class that extends AsyncTask 
     [...] 
    } 

    @Override 
    public void onRefreshInterface(int cb_val1, int cb_val2) { 
     //Callback when refresh is done 
     [...] 
    } 
} 

androidmanifest.xml:

<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

... 
    <service 
     android:name="com.example.package.RetrieveDataService" 
     android:enabled="true" 
     android:label="Refresh Data"> 
    </service> 

    <receiver 
     android:name="com.example.package.RetrieveDataTaskBroadcast" 
     android:enabled="true" 
     android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 
     </intent-filter> 
    </receiver> 

Я также добавил способ запуска службы при запуске приложения: MainActivity:

@Override 
    protected void onResume() { 
     super.onResume(); 
     Thread t = new Thread(){ 
      public void run(){ 
       SharedPreferences mSharedPreferences = getSharedPreferences(PREF, 0); 
       int delayInMs = mSharedPreferences.getInt("set_delay_refresh", 20)*60*1000; 
       AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
       Intent i = new Intent(MainBaseActivity.this, RetrieveDataService.class); 
       PendingIntent pi = PendingIntent.getService(MainBaseActivity.this, 0, i, 0); 
       am.cancel(pi); 
       am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
          SystemClock.elapsedRealtime() + delayInMs, 
          delayInMs, pi); 
      } 
     }; 
     t.start(); 
    } 

Спасибо за вашу помощь и советы.

+0

Почему вы создаете сервис, когда вы можете выполнять задачи асинхронных неоднократно с менеджером сигнализации – Passiondroid

+0

я не знаю, как приступить к запуску повторного задания при запуске устройства. Вот почему я использую услугу, которая вызывается BroadcastReceiver. – Thomas

ответ

1

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

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

Проверить это - https://developer.android.com/training/scheduling/alarms.html

+0

Благодарим вас за помощь. Я буду работать на этом пути. – Thomas

Смежные вопросы