4

我几乎完成了我正在制作的这个玩具应用游戏。

问题: 我的通知总是显示我的计数器为 30000。为什么它没有计时?

我所做的: 我实现了一个简单的服务类和一个自定义计时器来计时。最终,一旦我确定计时器正在工作,我将退出整个游戏。

这是我的代码:

package com.example.redshirtmarblez;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.CountDownTimer;
import android.os.IBinder;
import android.widget.Toast;

public class TimingService extends Service{

    public long counter = 30000;
    private Context ctx;
    private Activity localActivity;


    private NotificationManager nm;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() 
    {
          super.onCreate();
          nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
          declareNotification();
          timer.start();
          //Toast.makeText(this, "Timer is :" + counter, Toast.LENGTH_LONG).show();
          //showNotification();
    }


    public void getActivity(Activity activity)
    {
        localActivity = activity;
    }

    //count to end the game
    public CountDownTimer timer = new CountDownTimer(30000, 1000){

        public void onTick(long millisUntilFinished){
            counter = millisUntilFinished / 1000;
        }

        public void onFinish(){
             counter = 0;


 //Kill the game 
             int i = android.os.Process.myPid();
             android.os.Process.killProcess(i);

        }

    };

    /*
     * Show a notification while this service is running 
     */
    public void declareNotification()
    {
        //Declare a new notification 
        Notification notification = new Notification(R.drawable.ic_launcher, "A New Notification", System.currentTimeMillis());

        notification.flags |= Notification.FLAG_ONGOING_EVENT;
        notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;

        Intent intent = new Intent(this, TimingService.class);
        PendingIntent activity = PendingIntent.getActivity(this, 0, intent, 0);
        notification.setLatestEventInfo(this, "herp", "counter: " + counter, activity);


  //This is clearly not 1337, but a good joke
            startForeground(1337, notification);

    }

}

当它运行时,所有这一切都是显示“新通知”,然后更改为“herp 计数器:30000”。但是,此通知永远不会改变。它只是保持 30000。为什么?我以为我通过使标志持续存在来解决这个问题?

4

3 回答 3

21

https://developer.android.com/reference/android/app/Notification.Builder.html#setUsesChronometer(boolean)

将 when 字段显示为秒表。通知将自动更新显示从何时开始的分钟和秒,而不是将时间显示为时间戳。在显示经过的时间(如正在进行的电话)时很有用。当使用 setChronometerCountDown(boolean) 时,计数器也可以设置为倒计时。

无需更新,不值一setWhen()

NotificationCompat.Builder notification = new NotificationCompat.Builder(context)
        .setSmallIcon(R.mipmap.ic_default_notification)
        .setTicker("Ticker Text")  
        .setWhen(when)  // the time stamp, you will probably use System.currentTimeMillis() for most scenarios
        .setUsesChronometer(true)
        .setContentTitle("Title Text")
        .setContentText("Content Text");
于 2016-07-06T22:37:45.247 回答
4

counter不是参考;除非您明确告知通知,否则通知不会更新其新值。

查看有关更新现有通知的文档。您的 ID 在1337这里,因此您可以使用它来更新它。

实际上,您可能只能declareNotification()从您的onTick()方法中再次调用......但是,如果这不起作用,我建议保留对Notification对象的引用(作为成员变量),然后更新它,并使用nm.notify(1337, /* your notification object */);.

于 2012-12-09T00:56:51.570 回答
1

我不知道你为什么要使用通知。但是您需要不断更新您的通知。对于一个简单的修复添加

declareNotification();

在这条线下面:

counter = millisUntilFinished / 1000;

请注意,这不是编写代码的好方法。确实,您应该传递一种仅更新通知而不是“创建”新通知的方法。但是,只要它们具有相同的 ID,就会替换另一个。也只是为了使用更新的方式来管理通知,使用

NotificationCompat.builder b = new NotificationCompat.Builder(context);
于 2012-12-09T01:15:45.853 回答