Saturday 23 August 2014

Tìm hiểu về Activity và Intent cơ bản trong Android

Nếu hiểu thì chúng ta có thể coi Activity như là View nó hiện thị những gì đang diễn ra trong lúc bạn làm thao tác với giao diện của người dùng vậy. Mọi activity khi bạn tạo ra trong Android đều kế thừa lớp Activity này. Ngoài Activity mặc định ngoài ra Goolge còn cung cấp nhưng gói hộ trợ khác như android support v4, android support compat v7 nhưng có lẽ khi nào cần thì các bạn sẽ tìm hiểu với nó. Mình chỉ giới thiệu qua cho các bạn biết mà thôi.
Trong file MainActiviy.java mở ra và các bạn sẽ thấy

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


Khi tạo ra một Activity thì bạn sẽ thấy phương thức onCreate sẽ được sinh ra. Nhìn nó các bạn có thể thấy có 1 đối số kiểu Bundle dùng để chứa dữ liệu. Tiếp đến là hàm setContentView(R.layout.activity_main) được gọi cái dùng để hiện thị file xml trong thư mục layout là R.layout.activity_main. Như trong bài trước đó mà mình đã nói thì nó sẽ truy xuất các phần tử trong file XML thông qua việc truy xuất các hằng số được sinh ra trong thư mục gen và nằm ở file R.java. Nếu mở ra bạn sẽ thấy bằng cách giữ phím CTRL + nhấn chuột trái vào R.layout.activity_main. Đó là lý do vì sao mình phải viết trước bài cấu trúc thư mục của một chương trình Android là vậy.

Còn trong file AndroidManifest.xml các bạn sẽ thấy một activity được khai báo

<activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>
Nếu sử dụng activity mà không khai báo trong file Manifest này thì bạn sẽ không thể sử dụng được nó. Khi chương trình của bạn gọi start một activity có thể là nguyên nhân gây ra lỗi không mong muốn.

Tiếp đến với một Activity thì nó có gì. Cái đầu tiên có lẽ các bạn cần học chính là vòng đời của một chương trình Android. Oh việc này có nhanh quá không, mới học mà, nhưng thực chất là cần rất rất các các bạn ạ. Nó không phải là dành cho những người đã làm việc với Android lâu ngày nhé, nhưng đa phần mọi người lại bỏ qua nó. Nếu không nắm được những kiến thức cơ bản thì bạn khó có thể làm việc một cách chính xác với chương trình của bạn về sau, chỉ khi hiểu rõ vòng đời của một chương trình Android thì bạn mới có thể làm việc với nó.
Một bài viết rất chi tiết và đầy đủ về vòng được Lifecycle của một chương trình Android các bạn có thể đọc và nghiên cứu Activity Lifecycle. Nhưng tự dưng đi đọc nó thì khó hiểu quá, vậy hãy đọc nó sau khi mình hướng dẫn những điều cơ bản về nó giúp các bạn



Giờ mình sẽ đi giải thích những điều cơ bản về nó
Đầu tiên chúng ta hãy quan tâm một vài phương thức chính ở đây
  1. onCreate() được gọi đầu tiên khi activity bắt đầu tạo
  2. onStart() được gọi khi activity bắt đầu hiện cho người dùng thấy(view giao diện người dùng UI)
  3. onResum() khi activity bắt đầu có sự tương tác với người dùng
  4. onPause() được gọi khi activity tạm dừng và trước đó là đã được resumed
  5. onStop() được gọi khi activity không không còn hiện cho người dùng, tức việc tương tác của người dùng với chương trình sẽ không còn(ví dụ chuyển activity khác, nhấn phím home)
  6. onDestory() khi activity bị hủy
  7. onRestart() khi activity bị hủy và được gọi lại restarting again
Tất cả những phương thức trên đều sẽ được gọi một cách tự động và đương nhiên các bạn có thể Override chúng để phục vụ cho mục đích của bạn.

Nói như trên thật sự khó hiểu vậy để hiểu nó các bạn hãy mở project Hello world hôm trước và chúng ta sẽ Override những phương thức này để thấy chúng làm việc ra sao

Các bạn hãy mở file java MainActivity.java ra và chúng ta thêm các phương thức đó

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

    @Override
    protected void onStart() {
    // TODO Auto-generated method stub
    Log.i("LifeCycle", "In the onStart() event");
    super.onStart();
    }
    
    @Override
    protected void onPause() {
    // TODO Auto-generated method stub
    Log.i("LifeCycle", "In the onPause() event");
    super.onPause();
    }
    
    @Override
    protected void onStop() {
    // TODO Auto-generated method stub
    Log.i("LifeCycle", "In the onStop() event");
    super.onStop();
    }
    
    @Override
    protected void onDestroy() {
    // TODO Auto-generated method stub
    Log.i("LifeCycle", "In the onDestroy event");
    super.onDestroy();
    }

Nếu ecllipse báo lỗi thiếu thư viện và gạch chân chỗ lỗi màu đỏ các bạn hãy sử dụng quick import library bằng cách nhấn tổ hợp phim Ctrl + Shift + O để chữa lỗi này, không các bạn hãy trỏ chuột xuống dưới chỗ lỗi nó sẽ hiện ra việc hướng dẫn import giúp các bạn chỉ cần click là OK.


OK muốn biết nhiều phím tắt hơn nữa các bạn có thể nhấn tổ hợp phím Ctrl + Shift + L để thấy bảng phím tắt nhiều hơn. Dùng phím tắt nhiều giúp bạn cải thiện tốc độ. và giỡ hãy bật máy ảo lên chúng ta chạy chương trình và xem nó hoạt động ra sao.
Nếu bạn thấy quá chậm chạp trong việc chờ đợi sử dụng máy ảo thì các bạn có thể sử dụng genymontion để làm điều này mình sẽ có 1 bài tổng hợp video cài đặt nó cho các bạn sau bài này.

Sau khi chạy xong chương trình, tiếp đến hãy mở logcat của eclipse ra và bạn sẽ thấy onCreate và onStart sẽ được gọi đầu tiên và nhấn nút back trên thiết bị bạn sẽ thấy những hàm kế tiếp được gọi ngay sau nó. 

Mọi việc đã OK theo đúng gì chúng ta đã nói ở trên. Nếu bạn không thấy logcat đâu thì có thể làm theo hướng dẫn sau trên thanh menu chọn Window->Show View->Other




Để làm những thứ khác muốn khôi phục mặc giao diện định trong window bạn có thể chọn Reset Perspective  OK.

Rồi tiếp tục chúng ta sẽ đi tìm hiểu Intent trong Android. Nếu theo mình Android giống như một cái cái thuyền giúp bạn di chuyển tới nơi khác, một số quan điểm lại cho nó như là chất kết dính "glue" nếu bạn đang đọc cuốn Begining Android 4 Application Development.

Intent tiếng anh là mục đích đúng như tên gọi của nó bạn có thể dùng Intent cho việc chuyển từ activity này tới activity khác(chuyển giao diện này tới giao diện khác), hay bạn có thể dùng nó để mở những ứng dụng khác trong chương trình. Nhưng trong bài này mình chỉ giới thiệu cơ bạn mà thôi. Trước tiên Intent thường sử dụng nhất là dùng để chuyển Activity này sang Activity khác các bạn hãy tạo thêm một activity bằng tay hoặc có thể sử dụng này công cụ trong ecllipse cho tiện lợi các bước như sau





Mở file AndroidManifest.xml bạn sẽ thấy một new activity với tên SecondActity đã được tạo ra android:name=".SecondActivity".

Mở file activity_main.xml và chúng ta sẽ thêm 1 button như sau

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.firstproject.MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
<!--Thêm một button có tên là button1(tên khi truy cập trong java là R.id.button1-->
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="92dp"
        android:layout_toRightOf="@+id/textView1"
        android:text="Change activity" />

</RelativeLayout> 

Trong file activity_second.xml các bạn có thể thấy trong thư mục layout tự động được tạo ra, thay đổi thuộc tính android:text của textView như dưới để chốc nữa quan sát

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Second Actity" />

</RelativeLayout>

Bên trong file MainActiviy.java các bạn viết thêm câu lệnh như sau

public class MainActivity extends Activity {
private Button btn;//Khai báo một button nên đặt trùng tên với id của file xml để dễ làm việc
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i("LifeCycle", "In the onCreate() event");
        setContentView(R.layout.activity_main);
        this.btn = (Button) findViewById(R.id.button1);

        //Đăng kí một sự kiện click cho button khi người dùng click vào button
        this.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//Để chuyển tới activity 2 tạo một intent và start nó
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
    }

Sau khi chạy chương trình và nhấn vào button các bạn sẽ thấy kết quả.
Vậy là bài giới thiệu cơ bản tới đây là kết thúc, ở bài sau mình sẽ viết nhiều hơn về Intent cho các bạn.

Hãy nhớ tìm hiểu thêm nhé, đây chỉ là những bước đầu giúp các bạn dễ tiếp cận với Android mà thôi. Bởi nó không chỉ có vậy đâu.

No comments :

Post a Comment