Android在后台运行一个计时器

时间:2015-04-13 10:47:06

标签: android

我有一个应用程序可以进行小规模调查,只要应用程序处于打开状态,它就会每隔2分钟播放一次声音(提醒用户)。但是一旦屏幕变暗/应用程序进入后台。它再也不会播放声音了。

即使应用程序在后台,我如何让它重复声音?我尝试在onStop()中调用计时器功能,但这不起作用

 private MediaPlayer mp;
    Timer timer;
    TimerTask timerTask;
    final Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mood);
        addListenerOnNext();
       mp =  MediaPlayer.create(MoodActivity.this,R.raw.sound);

      radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
      nextbutton = (Button) findViewById(R.id.nextbutton);

        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                if (radioGroup.getCheckedRadioButtonId() != -1)
                {
                    nextbutton.setEnabled(true);
                }
            }
        });



    }

    @Override
    public void onStart()
    {
        super.onStart();
        startTimer();


    }

    @Override
    public void onStop(){
        super.onStop();

    }

    @Override
    protected void onResume(){
        super.onResume();
        startTimer();
    }

    public void startTimer(){
        //set a new Timer
        timer = new Timer();

        //initialize the timer task
        initializeTimerTask();

        timer.schedule(timerTask,500,120000);

    }

    public void stopTimerTask(){
        if(timer != null){
            timer.cancel();
            timer = null;
        }
    }

    private void initializeTimerTask() {

        timerTask = new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    @Override
                    public void run() {

                        mp.start();
                    }
                });
            }
        };

    }

2 个答案:

答案 0 :(得分:1)

查看this链接。 它描述了在应用程序运行时如何保持屏幕清醒。

我建议使用定期运行的背景资料服务。 看看这个链接

Run Service periodically

答案 1 :(得分:0)

我从哪里开始?

当您的应用程序不在前台时,您有2种可接受的方法可以继续执行操作(特别是对于定期任务); (已开始)ServiceAlarmManager

启动(而不是bount)服务有自己的进程,即使你的应用程序不在前台也意味着你可以使用Thread,Handler等,它将保持活着状态。( * NOT TimerTask

无论您的应用程序是否存在,AlarmManager都使用系统服务来启动PendingIntent

至于TimerTask,网上有很多帖子说明为什么它不适合Android开发,这里只有一个example,请使用IntentService,AsyncTask,Loaders,Handlers或其他任何东西。