计时器内部服务

时间:2014-01-13 11:11:01

标签: android chronometer

我有一个以下计时器实现。我想在Service中使用它,然后将其输出发送到我的片段。问题是Service没有findViewById(),因为很明显它根本没有View。有什么方法可以让计时器在Service内工作,如果没有,我可以使用什么呢?

代码:

Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer);
    chronometer.setBase(SystemClock.elapsedRealtime());

    chronometer.setOnChronometerTickListener(
            new Chronometer.OnChronometerTickListener() {

                @Override
                public void onChronometerTick(Chronometer chronometer) {
                    // TODO Auto-generated method stub
                    long myElapsedMillis = SystemClock.elapsedRealtime() - chronometer.getBase();
                    String strElapsedMillis = String.valueOf(myElapsedMillis);

                    //  Toast.makeText(AndroidChronometer.this, strElapsedMillis, Toast.LENGTH_SHORT).show();
                    TextView tw5 = (TextView) findViewById(R.id.textView2);
                    tw5.setText(strElapsedMillis.format("%d min : %d sec",
                            TimeUnit.MILLISECONDS.toMinutes(myElapsedMillis),
                            TimeUnit.MILLISECONDS.toSeconds(myElapsedMillis) -
                                    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(myElapsedMillis))));
                }
            }
    );


    chronometer.start();

1 个答案:

答案 0 :(得分:0)

一种选择就是使用

postDelayed(Runnable r, long milliseconds)

在不使用服务的情况下触发更新周期的可运行更新方法。然后在更新方法中更新UI。

另一种选择是使用AsyncTask而不是Service,如果您打算在后台执行某些操作。 AsyncTask可以通过onProgressUpdate()方法访问用户界面,你可以在那里做你的工作。

如果您必须使用服务,则必须从服务广播到UI活动,并让UI活动进行视图更新:

这在您的主要活动中:

private StatusReceiver mReceiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ...

    mReceiver = new StatusReceiver();

    ...
}


@Override
protected void onStart() {
    // Register the broadcast receiver
    IntentFilter filter = new IntentFilter();
    filter.addAction(getString(R.string.ACTION_UPDATE_CHRONO));
    filter.addCategory(Intent.CATEGORY_DEFAULT);
    registerReceiver(mReceiver, filter);

    ...
}

@Override
protected void onStop() {
    ...
    unregisterReceiver(mReceiver);
    ...
}

public class StatusReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if( action.equals(getString(R.string.ACTION_UPDATE_CHRONO)) ) {
             // Do your UI stuff here
        } 
    }
}

在服务类中:

private void broadcast(String status, Exception error) {
    Intent broadcastIntent = new Intent((Intent) getText(R.string.ACTION_UPDATE_CHRONO));
    broadcastIntent.putExtra("STATUS", status);
    broadcastIntent.putExtra("ERROR", error);
    sendBroadcast(broadcastIntent);
}

如果您想要向主要活动传达某些“状态”,请调用此方法,例如"Time for update""set chrono to " + x + "milli"