How can repeating AlarmManager start AsyncTask?

前端 未结 2 1714
感动是毒
感动是毒 2021-01-15 18:55

I usually write this code to start a service with AlarmManager.

    intent = new Intent(getActivity(), someservice.class);
    pendingNotificat         


        
相关标签:
2条回答
  • 2021-01-15 19:19

    This is how you can do it:

    1.) Define a static intent (intent1) and use it to pass to AlarmManager when setting time. So now when ever time, will lapse; AlarmManager will notify by sending intent1.

    2.) On onReceive of BroadcastReceiver of intent1, start a AsyncTask. At end end of AsyncTask, set the next time for AlarmManager.

    0 讨论(0)
  • 2021-01-15 19:21

    Based upon munish-katoch's response, I have the following concrete solution.

    Set an alarm:

    Intent intent = new Intent(context, AlarmReceiver.class);
    
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    
    AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime() + 5 * 1000, 60 * 1000, alarmIntent);
    

    The above code configures AlarmManager to fire at AlarmReceiver, which is defined as follows:

    public class AlarmReceiver extends WakefulBroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {  
        new MyAsyncTask.execute();
      }
    }
    

    In the event of an alarm AlarmReceiver starts MyAsyncTask.

    Here be dragons

    There are life cycle issues associated with instantiating an AsyncTask from a WakefulBroadcastReceiver, i.e., the above solution can lead to MyAsyncTask being killed prematurely. Moreover, threading rules are violated.

    0 讨论(0)
提交回复
热议问题