2016-01-09 3 views
1

Я пытаюсь запланировать задачу «тост-сообщение» для отображения в выбранное пользователем время, но после этого ничего не отображается, и я не вижу, что не так в коде. Вот мой кодПланирование задачи с помощью AlarmManager

public class TimePickerFragment extends DialogFragment implements 
     TimePickerDialog.OnTimeSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     final Calendar c = Calendar.getInstance(); 
     int hour = c.get(Calendar.HOUR_OF_DAY); 
     int minute = c.get(Calendar.MINUTE); 

     return new TimePickerDialog(getActivity(), this, hour, minute, 
       DateFormat.is24HourFormat(getActivity())); 
    } 


    @Override 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 

     //set The Calendar to to the wanted time! 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); 
     calendar.set(Calendar.MINUTE, minute); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.AM_PM, Calendar.AM); 

     Intent setMsg = new Intent(MainActivity.this, TaskReceiver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, setMsg, 0); 
     AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 

     manager.setExact(AlarmManager.ELAPSED_REALTIME, calendar.getTimeInMillis(), pendingIntent); 

    } 
} 


public class TaskReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "it is working!", Toast.LENGTH_SHORT).show(); 
    } 
} 

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

ответ

0
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.widget.Toast; 

import com.yourcomp.yourapp.R; 

import java.lang.ref.WeakReference; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 
import java.util.concurrent.TimeUnit; 


public class TestAct extends Activity { 

    private static class MyHandler extends Handler{ 
     private WeakReference<Activity> activityWr; 

     public MyHandler(Activity activityMain){ 
      activityWr = new WeakReference<>(activityMain); 
     } 

     @Override 
     public void handleMessage(Message inputMessage) { 
      if (activityWr.get() != null){ 
       Toast.makeText(activityWr.get(),"Your text",Toast.LENGTH_LONG).show(); 
      } 

     } 
    } 
    private MyHandler mHandler; 
    private Future<?> mToastTaskRef; 
    private static int NUMBER_OF_CORES = 
      Runtime.getRuntime().availableProcessors(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mHandler = new MyHandler(this); 
     /** 
     * initialize UI & take input from user && call method 
     */ 

    } 

    private void showToastAfterUserSpecifiedDelay(int seconds){ 
     mToastTaskRef = Executors.newScheduledThreadPool(NUMBER_OF_CORES).scheduleAtFixedRate(new Runnable() { 
      @Override 
      public void run() { 
       mHandler.sendMessage(new Message()); 
      } 
     },  /**initial delay*/60 
       ,/**time*/seconds 
       ,/**time unit*/ TimeUnit.MILLISECONDS); 

    } 

    private void stopToastTask(){ 
     if (mToastTaskRef != null && !mToastTaskRef.isCancelled() && !mToastTaskRef.isDone()){ 
      mToastTaskRef.cancel(true); //tru -- >interrupt even if it's running 
     } 
    } 
} 
+0

Когда я даю функции showToastAfterUserSpecifiedDelay определенное время int как «60», оно не появляется на самом деле через 60 секунд, но оно просто продолжает показывать с 0 секунд. – kendhia

+0

@kendhia Я изменил начальную задержку на 60 секунд. Это видно из кода –

+0

. Я хотел, чтобы отложенное время должно быть параметром, заданным для функции, поэтому изменение начальной задержки на «секунды», а время, равное 60, должно сделать правду – kendhia

0

Используйте это в вашем коде Вместо manager.setExact Methode

manager.setRepeating (AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), интервал, pendingIntent);

+0

Интервал будет любой величиной в миллисекундах, например 3000 в течение 3 секунд –

+0

Не могли бы вы объяснить, почему вы сделали это изменение? – kendhia

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