Search code examples
javaandroidtimerchronometer

Don't stop the Chronometer when I change the activity


For example: in the Activty A I have a Chronometer, I click on play to start it and when it arrives at 00:00:10 I decide to go to Activity B. I stay on it for 30 seconds before returning to A. I would find the timer paused still displaying 00:00:10, but I'd like to see it still running and then at 00:00:40. How can I do this? How can I avoid the timer pausing on the change of Activity?


Solution

  • (Based on the answer given for Get time of chronometer widget, with code for and extra activity added.)

    The main activity:

    package com.so.chilledrat.chronoexample;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.SystemClock;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Chronometer;
    import android.widget.LinearLayout;
    import android.widget.Toast;
    
    public class ChronoExampleActivity extends Activity {
        Chronometer mChronometer;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            LinearLayout layout = new LinearLayout(this);
            layout.setOrientation(LinearLayout.VERTICAL);
    
            mChronometer = new Chronometer(this);
            layout.addView(mChronometer);
    
            Button startButton = new Button(this);
            startButton.setText("Start");
            startButton.setOnClickListener(mStartListener);
            layout.addView(startButton);
    
            Button stopButton = new Button(this);
            stopButton.setText("Stop");
            stopButton.setOnClickListener(mStopListener);
            layout.addView(stopButton);
    
            Button resetButton = new Button(this);
            resetButton.setText("Reset");
            resetButton.setOnClickListener(mResetListener);
            layout.addView(resetButton);
    
            Button switchButton = new Button(this);
            switchButton.setText("Switch Activity");
            switchButton.setOnClickListener(mSwitchListener);
            layout.addView(switchButton);
    
            setContentView(layout);
        }
    
        private void showElapsedTime() {
            long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase();
            Toast.makeText(this, "Elapsed milliseconds: " + elapsedMillis, Toast.LENGTH_SHORT).show();
        }
    
        View.OnClickListener mStartListener = new OnClickListener() {
            public void onClick(View v) {
                mChronometer.start();
                showElapsedTime();
            }
        };
    
        View.OnClickListener mStopListener = new OnClickListener() {
            public void onClick(View v) {
                mChronometer.stop();
                showElapsedTime();
            }
        };
    
        View.OnClickListener mResetListener = new OnClickListener() {
            public void onClick(View v) {
                mChronometer.setBase(SystemClock.elapsedRealtime());
                showElapsedTime();
            }
        };
    
        View.OnClickListener mSwitchListener = new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent myIntent = new Intent(ChronoExampleActivity.this.getBaseContext(), OtherActivity.class);
                startActivityForResult(myIntent, 0);
            }
        };
    }
    

    The other activity to switch to:

    package com.so.chilledrat.chronoexample;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.LinearLayout;
    
    public class OtherActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            LinearLayout layout = new LinearLayout(this);
            layout.setOrientation(LinearLayout.VERTICAL);
    
            Button switchButton = new Button(this);
            switchButton.setText("Switch Back");
            switchButton.setOnClickListener(mSwitchListener);
            layout.addView(switchButton);
    
            setContentView(layout);
        }
    
        View.OnClickListener mSwitchListener = new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // Intent myIntent = new Intent(OtherActivity.this.getBaseContext(),
                // ChronoExampleActivity.class);
                // startActivityForResult(myIntent, 0);
                finish();
            }
    
        };
    }
    

    And finally the manifest:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.so.chilledrat.chronoexample"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7" />
    
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" >
            <activity
                android:name=".ChronoExampleActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name="OtherActivity"></activity>
        </application>
    
    </manifest>