有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android服务+计数器不工作

我正在开发一个可以按时计算屏幕的应用程序。首先,我构建了一个服务,将计数计时器值(如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的秒表类,它可以从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


共 (2) 个答案

  1. # 1 楼答案

    你的onCreate只用于初始化东西,使用

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

    从文件中:

    onStartCommand

    每次客户端通过调用 安卓所容纳之物上下文startService,提供它提供的参数和唯一的整数标记 表示启动请求。不要直接调用这个方法。 为了向后兼容,默认实现调用onStart并返回START\u 或者开始兼容。 如果需要应用程序在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();
    
  2. # 2 楼答案

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

    为了减轻工作量,工具箱中有一个方便的类IntentService,用于启动您希望在后台执行的工作

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

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

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