使用AlarmManager计划任务

问题描述 投票:1回答:2

我正在尝试安排任务“祝酒消息”显示在用户选择的时间内,但是此后没有显示任何内容,我看不到代码中有什么问题。那是我的代码

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();
    }
}

如果有更好的方法来安排此类任务,请继续进行介绍。

android alarmmanager
2个回答
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
投票

在您的代码中使用它而不是如下的manager.setExact方法:

manager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), interval, pendingIntent);
© www.soinside.com 2019 - 2024. All rights reserved.