Thực hành 03: Code ứng dụng GoodLife
Yêu cầu:
- Thiết kế ứng dụng GoodLife có giao diện như hình bên dưới.
- Giao diện phần mềm chứa trong file layout actitity_main.xml để thêm một Button (text: “Finish”, id: btnFinish) và một EditText (text: “” và id: txtColorSelect) cho phép nhập vào tên các màu: red, green, blue. Khi người dùng nhập một màu, thì màu nền của ứng dụng thay đổi thành màu tương ứng.
- Sử dụng phương thức onCreate để kết nối Button và Textbox. Thêm dòng cde sau: Toast.makeText(this, “onCreate“, 1).show();
- Sự kiện click của Button gọi phương thức finish(); để kết thúc ứng dụng. Add dòng lệnh của Toast như ở trên để in ra sáu sự kiện chính. Để đơn giản trong việc thêm các phương thức trên, trên giao diện Android Studio vào menu Code > Override Methods… để thêm các phương thức onStart, onResume, onPause, onStop, onDestroy, onRestart.
- Viết code cho các sự kiện: onStart, onResume, onPause, onStop, onDestroy, onRestart để đáp ứng yêu cầu khi đóng ứng dụng hoặc bật ứng dụng khác, thì màu chọn cuối cùng sẽ được chọn lại khi ứng dụng được khôi phục.
Một số kịch bản chạy chương trình để kiểm tra các sự kiện onStart, onResume, onPause, onStop, onDestroy, onRestart hoạt động:
- Chạy mới ứng dụng
- Ấn nút Back trên điện thoại
- Ấn nút Finish trên ứng dụng
- Ấn nút Hom trên điện thoại
- Ấn nút App Tab, rồi chạy lại ứng dụng
- Ứng dụng Goodlife đang mở, có một ứng dụng khác được chạy ví dụ như Có cuộc gọi tới hoặc tin nhắn tới, v.v.

Code tham khảo
Code giao diện
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/myScreen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_dark"
tools:context=".MainActivity">
<Button
android:id="@+id/btnFinish"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="20dp"
android:text="Finish"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtToDo" />
<EditText
android:id="@+id/txtColorSelect"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="1dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="1dp"
android:background="@color/colorAccent"
android:ems="10"
android:hint="Background Color (red, green, blue)"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtHello" />
<TextView
android:id="@+id/txtToDo"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="1dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="1dp"
android:background="@android:color/transparent"
android:textColor="@android:color/background_light"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtColorSelect" />
<TextView
android:id="@+id/txtHello"
android:layout_width="0dp"
android:layout_height="22dp"
android:text="Hello World. Good Life!"
android:textColor="@android:color/background_light"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
Code chức năng
package vn.edu.timoday.goodlife;
import android.content.SharedPreferences;
import android.support.constraint.ConstraintLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.*;
import android.app.Activity;
public class MainActivity extends AppCompatActivity {
private ConstraintLayout myScreen;
private TextView txtToDo;
private EditText txtColorSelect;
private Button btnFinish;
int actMode = 0;
public static String MYPREFSID = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Lấy tên layout
myScreen = (ConstraintLayout)findViewById(R.id.myScreen);
//Lây textbox có tên là txtToDo
txtToDo = (TextView)findViewById(R.id.txtToDo);
String msg = "Instructions: \n "
+ "0. New instance (onCreate, onStart, onResume) \n "
+ "1. Back Arrow (onPause, onStop, onDestroy) \n "
+ "2. Finish (onPause, onStop, onDestroy) \n "
+ "3. Home (onPause, onStop) \n "
+ "4. After 3 > App Tab > re-execute current app \n "
+ " (onRestart, onStart, onResume) \n "
+ "5. Run DDMS > Receive a phone call or SMS \n "
+ " (onRestart, onStart, onResume) \n "
+ "6. Enter some data - repeat steps 1-5 \n ";
//Gắn dữ liệu cho txtToDo
txtToDo.setText(msg);
//Lấy control txtColorSelect
txtColorSelect = (EditText)findViewById(R.id.txtColorSelect);
txtColorSelect.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable s) {
changeBackGroundColor(s.toString());
}
});
//Gắn sự kiện cho nút btnFinish
btnFinish = (Button)findViewById(R.id.btnFinish);
btnFinish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Goi phuong thuc finish
finish();
}
});
//Hien thi ten su kien tren man hinh
Toast.makeText(getApplicationContext(),"onCreate",1).show();
}
//Su kien onPause
@Override
protected void onPause() {
super.onPause();
saveDataFromCurrentState();
Toast.makeText(getApplicationContext(),"onPause",1).show();
}
//Su kien onRestart
@Override
protected void onRestart() {
super.onRestart();
Toast.makeText(getApplicationContext(),"onRestart",1).show();
}
//Su kien onResume
@Override
protected void onResume() {
super.onResume();
Toast.makeText(getApplicationContext(),"onResume",1).show();
}
@Override
protected void onStart() {
super.onStart();
updateFromSavedState();
Toast.makeText(getApplicationContext(),"onStart",1).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
Toast.makeText(getApplicationContext(),"onDestroy",1).show();
}
@Override
protected void onStop() {
super.onStop();
Toast.makeText(getApplicationContext(),"onStop",1).show();
}
private void changeBackGroundColor(String theChosenColor){
if(theChosenColor.contains("red"))
myScreen.setBackgroundColor(0xffff0000);
else if (theChosenColor.contains("green"))
myScreen.setBackgroundColor(0xff00ff00);
else if (theChosenColor.contains("blue"))
myScreen.setBackgroundColor(0xff0000ff);
else {
//reseting user preferences
clearMyPreferences();
myScreen.setBackgroundColor(0xff000000);
}
}
//Cap nha trang thai
protected void updateFromSavedState()
{
SharedPreferences myPrefs = getSharedPreferences(MYPREFSID,actMode);
if((myPrefs != null) && (myPrefs.contains("myBkColor")))
{
String theChosenColor = myPrefs.getString("myBkColor","");
txtColorSelect.setText(theChosenColor);
changeBackGroundColor(theChosenColor);
}
}
//Luu lai trang thai hien tai
protected void saveDataFromCurrentState()
{
SharedPreferences myPrefs = getSharedPreferences(MYPREFSID,actMode);
SharedPreferences.Editor myEditor = myPrefs.edit();
myEditor.putString("myBkColor",txtColorSelect.getText().toString());
myEditor.commit();
}
protected void clearMyPreferences()
{
SharedPreferences myPrefs = getSharedPreferences(MYPREFSID,actMode);
SharedPreferences.Editor myEditor = myPrefs.edit();
myEditor.clear();
myEditor.commit();
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Toast.makeText(getBaseContext(), "onRestoreInstanceState ...BUNDLING", Toast.LENGTH_SHORT).show();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Toast.makeText(getBaseContext(), "onSaveInstanceState ...BUNDLING", Toast.LENGTH_SHORT).show();
}
}
Tải code demo ứng dụng GoodLife
