【问题标题】:Android Service+ counter not workingAndroid Service+ 计数器不工作
【发布时间】:2014-12-30 12:54:25
【问题描述】:

我正在构建一个可以按时计算屏幕的应用程序。首先,我构建了一个服务来将计数计时器值(如 00:00)发送到MainActivity,这是我的服务实现

public class MyService extends Service {


String time;
Intent io;




@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub


    return START_STICKY;
}


@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();

    try{

        PowerManager power=(PowerManager) getSystemService(POWER_SERVICE);
        boolean isScreenOn=power.isScreenOn();
            while(isScreenOn){
            try{
                StopWatch count=new StopWatch();
                long timer=count.getTime();
                long seconds=timer/1000;
                time = String.format("%02d:%02d", (seconds % 3600) / 60, (seconds % 60));//creating time
            }catch(Exception e){
                e.printStackTrace();
            }
        io=new Intent("COUNTDOWN_UPDATED");
        io.putExtra("countdown",time);
        sendBroadcast(io);// sending time value

        }


    }catch(Exception e){
        e.printStackTrace();
    }
}






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

这里是来自org.apache.commons.lang.time.StopWatch的 StopWatch 类,它可以从 0 开始计数计时器。 这是我的MainActivity 实现

Intent service=new Intent(this,MyService.class);
    startService(service);
    registerReceiver(updateGUI,new IntentFilter("COUNTDOWN_UPDATED"));

private BroadcastReceiver updateGUI=new BroadcastReceiver(){

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        TextView countdown= (TextView)findViewById(R.id.textView1);
        countdown.setText(intent.getExtras().getString("countdown"));
    }

};

当我运行我的应用程序时,计数器没有运行它停留在 00:00

【问题讨论】:

  • 也放上你的logcat,这将有助于我们了解问题的原因。

标签: java android service counter


【解决方案1】:

你的onCreate只是用来初始化事物,使用

@Override public int onStartCommand(Intent i, int flags , int startId){

来自文档:

onStartCommand

每次客户端通过调用显式启动服务时由系统调用 android.content.Context.startService,提供它提供的参数和一个唯一的整数令牌 表示启动请求。不要直接调用此方法。 为了向后兼容,默认实现调用 onStart 并返回 START_STICKY 或 START_STICKY_COMPATIBILITY。 如果您需要您的应用程序在 API 级别 5 之前的平台版本上运行,您可以使用以下 在这种情况下处理旧的 onStart 回调的模型。 handleCommand 方法由你酌情实现

同时:

onCreate()

首次创建服务时由系统调用。不要直接调用此方法。 覆盖:服务中的 onCreate()

如果您只想随时间在文本视图中为值设置动画,为什么不使用值动画器? 示例:

ValueAnimator animator = new ValueAnimator();
                    animator.setObjectValues(0, percentage);
                    animator.addUpdateListener(new AnimatorUpdateListener() {
                        public void onAnimationUpdate(ValueAnimator animation) {
                            prog.setText("Profile Progress: "+String.valueOf(animation.getAnimatedValue())+"%");
                        }
                    });
                    animator.setEvaluator(new TypeEvaluator<Integer>() {
                        public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
                            return Math.round((endValue - startValue) * fraction);
                        }
                    });
                    animator.setDuration(1500);
                    animator.start();

【讨论】:

  • 谢谢。它的工作,但现在计数器没有运行它停留在 00:00。
  • 您可以将其作为单独的问题发布:)
  • 您是否只想在文本视图中更新值?服务不是开销吗?
  • 是的,这是我想在 textview 中更新的唯一值
【解决方案2】:

虽然不是很明显,但在 Android 上,Service 默认在应用程序的 UI 线程上执行。

为了减轻工作负担,工具包中有一个方便的类IntentService,用于启动您想在后台执行的工作。

在你的类扩展 IntentService 之后,重写 onHandleIntent(Intent intent) 方法并将你的广播生成代码放在那里而不是 onCreate

这将释放您的 UI 线程以继续按预期运行。

(P.S. 在您的循环中,您永远不会更新 isScreenOn 的值,因此它将始终保持不变!)

【讨论】:

  • 感谢@sddamico 还有其他方法可以在 android 中计时吗?
  • 是的,我会看看Handler 类,它允许您以所需的毫秒延迟发布Runnable 操作。如果你想做一些每秒滴答作响的事情,你会这样做:handler.postDelayed(new MyRunnable(), 1000);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多