【问题标题】:Starting countdown timer in background on receiving push notification接收推送通知时在后台启动倒数计时器
【发布时间】:2014-12-16 13:53:50
【问题描述】:

我想在收到推送通知时启动倒计时。

我可以成功收到通知。

现在我想问一下,当收到通知并且我的应用程序处于后台或前台时,是否可以在 BroadcastReceiver 的 onReceive 中启动倒数计时器?

简单地说,无论应用程序是否在前台,计时器都应该启动。 当计时器完成时,它应该向服务器发送一些数据。 而且我需要在倒计时期间应用程序进入前台后立即在文本视图中显示剩余时间。

我正在添加一些代码,请帮助我。

这是启动计时器的代码,该函数在 onReceive 中调用。

void startOrderCountDown() {
    CountDownTimer orderCountDown = new CountDownTimer(40000, 1000) {

        public void onTick(long millisUntilFinished) {
            Constant.remainingTimeOfOrder = millisUntilFinished / 1000;
            Log.v("Timer", "Time left: " + millisUntilFinished
                    / 1000);
        }

        public void onFinish() {
            new Thread(new Runnable() {

                @Override
                public void run() {

                    String dr_id = myPreferences.getDRIVERID();
                    String res = new ServerConnection()
                            .updateOrderMissedRejected(
                                    Constant.UPDATE_MISSED_REJECTED_ORDER,
                                    dr_id, "", "0");
                    Log.e("Timer", "finished..." + res);
                }
            }).start();
        }
    };
    orderCountDown.start();
}

但是当通知到达时,它只是在 logcat 中打印“剩余时间:39”。

提前致谢。

【问题讨论】:

  • @MichaelShrestha 正如我发布的那样,我也在做类似的事情,但问题是计时器只调用一次 onTick 方法。并且logcat中只打印了一行。
  • 尝试调试你的接收器类...
  • 您需要使用不会被操作系统停止的计时器来启动服务
  • @SpyZip 没有别的办法吗?

标签: android countdowntimer


【解决方案1】:

不需要倒计时。

只需按照步骤操作即可。

1) 创建AlarmManagerBroadcastReceiver.java

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver implements IjoomerSharedPreferences {
    @Override
    public void onReceive(Context context, Intent intent) {
            // Call your sever task.
    }
}

2) 在收到推送通知时从当前时间设置闹钟。

long INTERVAL = 40000;
AlarmManager am=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmManagerBroadcastReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 1010, intent, 0);

try{
    am.cancel(pi);
}catch (Exception e){
}
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL, pi);

2) 清单.xml

<receiver  android:process=":remote" android:name="com.XXX.ZZZZ.AlarmManagerBroadcastReceiver"></receiver>

【讨论】:

  • 感谢您的回复。是否可以让闹钟中剩余的时间结束?
  • 为此你需要一些编程的东西。您只需在设置闹钟时将时间戳存储在共享偏好中,当您想要获取剩余时间时,只需从共享偏好中读取时间戳并获取当前时间戳和存储时间戳的差异。
  • 太好了。非常感谢。
  • 收到广播后这个闹钟会自动取消吗?还是我们必须在 AlarmManagerBroadcastReceiver 类中显式取消它?
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多