Handling Runtime Changes in Android

Introduction

In this Article you will learn about the How to Runtime changes in Android.

You have seen that every android device has a functionality to change the orientation of screen at runtime. So when the device changes its orientation the activity will be restarted by calling all its method again. On orientation changes first the activity will be destroyed and again created.

When the Activity is destroyed system calls onPause(), onStop(), and onDestroy() method simultaneously. And now to create activity system calls onCreate(), onStop(), and onResume() simultaneously.

First lets see how you handle the runtime changes in Android

In this i am using a count down timer to show you, The timer will not be affected when the screen orientation changes. I have already explained that the activity restarted when device changes its orientation. So to overcome from this we write the element Android Manifest. xml file  
android:configChanges="orientation|screenSize|keyboardHidden". In java class file we will override the onConfigurationChanged().

onConfiguration change() - This method is called by the system when the device configuration changes while you activity is running

Now when configuration changes the activity will not be restart. So when the device changes its orientation the onConfigurationChanged() method will be called.

Step 1

Create project like this

Step 2

Create an Xml file and write this

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:background="#ff998765"

    android:orientation="vertical" >

 

    <TextView

        android:id="@+id/textView"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_centerHorizontal="true"

        android:layout_centerVertical="true"

        android:paddingRight="10dip"

        android:textSize="50dp" />

 

    <Button

        android:id="@+id/button"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:layout_alignParentBottom="true"

        android:layout_alignParentLeft="true"

        android:text="Start" />

  

</RelativeLayout>

Step 3

In this I have created a timer inside activity which is started on button click. So when you start the timer in portrait mode the timer start counting. When you changes the device orientation the timer will be start from that count.

Create a java class file and write this
 

package com.example.screenorientation;

 

import android.os.Bundle; 

import android.os.CountDownTimer;

import android.app.Activity; 

import android.content.res.Configuration;

import android.util.Log; 

import android.view.Menu; 

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.LinearLayout;

import android.widget.RadioButton;

import android.widget.TextView;

import android.widget.Toast;

 

public class MainActivity extends Activity { 

        private CountDownTimer countDownTimer;

           private boolean timerStarted = false;

           private Button buttonStart;

           public TextView textView;

           private final long startTime = 100 * 100;

           private final long interval = 1 * 100;

 

    @Override 

    protected void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        setContentView(R.layout.activity_main); 

        Log.d("cycle","onCreate wiil be invoke"); 

 

        buttonStart = (Button) this.findViewById(R.id.button);

        textView = (TextView) this.findViewById(R.id.textView);

        countDownTimer = new CountDownTimerActivity(startTime, interval);

        textView.setText(textView.getText() + String.valueOf(startTime/1000));

 

    buttonStart.setOnClickListener(new OnClickListener() {

 

              @Override

              public void onClick(View arg0) {

                     // TODO Auto-generated method stub

 

                  if (!timerStarted) {

                   countDownTimer.start();

                   timerStarted = true;

                   buttonStart.setText("STOP");

               } else {

                   countDownTimer.cancel();

                   timerStarted = false;

                   buttonStart.setText("RESTART");

               }

              }

       });

    } 

    public class CountDownTimerActivity extends CountDownTimer {

        public CountDownTimerActivity(long startTime, long interval) {

            super(startTime, interval);

        }

 

        @Override

        public void onFinish() {

            textView.setText("Time's up!");

        }

 

        @Override

        public void onTick(long millisUntilFinished) {

            textView.setText("" + millisUntilFinished/1000);

        }

    }

    @Override 

    protected void onStart() { 

        super.onStart(); 

         Log.d("cycle","onStart wiil be invoked"); 

    } 

    @Override 

    protected void onResume() { 

 

        super.onResume(); 

         Log.d("cycle","onResume wiil be invoked"); 

    } 

 

 

    @Override 

    protected void onPause() { 

 

        super.onPause(); 

         Log.d("cycle","onPause wiil be invoked"); 

    } 

    @Override 

    protected void onStop() { 

 

        super.onStop(); 

         Log.d("cycle","onStop wiil be invoked"); 

    } 

 

       @Override 

    protected void onRestart() { 

 

        super.onRestart(); 

         Log.d("cycle","onRestart wiil be invoked"); 

    }    

    @Override 

    protected void onDestroy() { 

 

        super.onDestroy(); 

         Log.d("cycle","onDestroy wiil be invoked"); 

    } 

    @Override

    public void onConfigurationChanged(Configuration newConfig) {

        super.onConfigurationChanged(newConfig);

 

        // Checks the orientation of the screen

        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

             } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

            }

    }

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.main, menu);

        return true;

    }

 

} 

Step 4

Android Manifest.xml file
In Android Manifest .xml file you will write the configuration element in <activity>

 

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.screenorientation"

    android:versionCode="1"

    android:versionName="1.0">

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="18"/>

 

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme">

        <activity

            android:name="com.example.screenorientation.MainActivity"

              android:configChanges="orientation|screenSize|keyboardHidden"

            android:label="@string/app_name">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

</manifest>

 

Step 5

After running of activity onCreate(), onStart, onResume() called simultaneuosly

han1

When the Device orientation changes no methods called which means the activity not restarted

han2