Tuesday, September 15, 2015

Bài 5 - Service trong Android

Tiếp tục loạt bài hướng dẫn Android tutorial.  Hôm nay chúng ta tiếp tục tìm hiểu về Service và cách hoạt động của nó như thế nào .
1. Định nghĩa về Service .
Service là một một thành phần chạy trên nền tảng Android mà không nhất thiết phải tương tác với người dùng . Nó có thể hoạt động ngay cả khi ứng dụng đã bị kết thúc . Nó gồm 2 state chính :
Start : một service được bắt đầu khi một thành phần của ứng dụng , chả hạn như activity gọi tới method startService() . Khi bắt đầu service có thể chạy ở chế độ background vô thời hạn. Ngay cả khi appliction đó destroy.
Bound : Một service bị ràng buộc với các thành phần của activity khi nó gọi tới bindService() . Nó cung cấp 1 interface client - server cho phép các thành phần tương tác với service , send request , get response ...
2. Vòng đời của service
Dưới đây là vòng đời của service
Cụ thể như sau :
onStartCommand()
Hệ thống sẽ gọi tới method này khi một thành phần khác , ví dụ như activity . Request sẽ được started , khi gọi tới startService(). Nếu bạn cài method sau , nó sẽ trả về responsity  khi stop service của quá trình làm việc là done , bằng cách gọi tới các method stopSelf() hoặc stopService()
onBind()
Hệ thống sẽ gọi tới method này khi các thành phần khác muốn lien kết (bind) service bởi cách gọi method bindService() . Nếu bạn implement method này , bạn phải cung cấp một interface client  dung để giao tiếp  với service , bởi việc trả về đối tượng IBinder . Bạn luôn phải implement method này . Tuy nhiên nếu bạn không muốn cho phép binding , thì nó sẽ return về null
onUnbind()
Hệ thống sẽ gọi tới method  khi tất cả client muốn disconnect từ một interface cụ thể đã được pushlish bởi service
onRebind()
Hệ thống sẽ gọi tới method này  khi new client đã connect tới service ,sau đó nó đã disconnect trong onUnbind(Intent)
onCreate()
Hệ thống gọi tới method này khi service đã được tạo lần đầu onStartCommand() hoặc onBind() . Lời gọi yêu cầu một khoảng thời gian đã được setup
onDestroy()
Hệ thống gọi tới method này  khi service không được sử dụng lâu hoặc bị destroy . Service của bạn nên được clean đi để giải phóng các thread , registered linstener , receivers…
Cụ thể như sau :
AndroidMenifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="nosoft.com.demoservice"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <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>
        <service android:name=".MyService" />
    </application>
</manifest>
MainActivity.java
package nosoft.com.demoservice;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
public class MainActivity extends Activity {
@Override
  public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
  }   
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
//      getMenuInflater().inflate(R.menu.activity_main, menu);
  getMenuInflater().inflate(R.menu.main, menu);
     return true;
  }
  // Method to start the service
  public void startService(View view) {
     startService(new Intent(getBaseContext(), MyService.class));
  }
  // Method to stop the service
  public void stopService(View view) {
     stopService(new Intent(getBaseContext(), MyService.class));
  }
}
MyService.java
package nosoft.com.demoservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class MyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Let it continue running until it is stopped.
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
}
Layout
activity_main.xml
<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:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Example services"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />      
      <TextView
         android:id="@+id/textView2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="Android tutorial Nosoft"
         android:textColor="#ff87ff09"
         android:textSize="30dp"
         android:layout_above="@+id/imageButton"
         android:layout_centerHorizontal="true"
         android:layout_marginBottom="40dp" />
    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageButton"
        android:src="@drawable/abc"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button2"
        android:text="Start Services"
        android:onClick="startService"
        android:layout_below="@+id/imageButton"
        android:layout_centerHorizontal="true" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Stop Services"
        android:id="@+id/button"
        android:onClick="stopService"
        android:layout_below="@+id/button2"
        android:layout_alignLeft="@+id/button2"
        android:layout_alignStart="@+id/button2"
        android:layout_alignRight="@+id/button2"
        android:layout_alignEnd="@+id/button2" />
</RelativeLayout>
Các bạn có thể download full code tại đây để tham khảo : here
Các bạn tự code và chạy để cảm nhận sự thay đổi của app ở Log Cat nhé . 

Wednesday, September 2, 2015

Bài 4 : Vòng đời của ứng dụng Android (Life cycle Android)

Chào các bạn , chúng ta tiếp tục loạt bài hướng dẫn Android tutorial .
Hôm nay mình sẽ giới thiệu cho các bạn về hoạt động của một ứng dụng Android.
1. Thế nào là Appliction Android và Activity ?
a . Appliction Android 
Khi chương trình biên dịch thành công sẽ tạo ra một tập tin có đuôi .apk . Tập tin này có thể thi triển được trên các di động dùng hệ điều hành Android của các bạn . Ta gọi đó là một Application Android
b. Activity .
Activity các bạn hiểu nó như một màn hình hay form hiển thị giống như form swing , hay C# ... nhưng hiển thị trên mobile hay các device sài hệ điều hành Android.
2 . Stack Activity .
Stack acitvity : là một dạng hiển thị các activity theo cấu trúc LIFO ( Last in first out) . Không nói đâu xa , khi các bạn sử dụng device của các bạn . Mở 1 app của các bạn lên , sau đó mở liên tiếp nhiều màn hình ( activity) lên . Sau đó các bạn ẩn nút back trở lại . Thì nó sẽ quay lại màn hình trước đó của các bạn .
Áp dụng vào sơ đồ trên thì các bạn sẽ hiểu ngay.
3. Vòng đời ứng dụng (Life cycle Android appliction)
onCreate()
Là method được gọi lại hoặc gọi đầu tiên khi khởi tạo Activity
onStart()
Là method được gọi lại hoặc gọi tới sau onCreate , làm cho user có thể thấy được application
onResume()
Là method gọi tới khi người dùng bắt đầu tương tác ứng dụng
onPause()
Các hoạt động bị tạm dừng và không nhận bất kỳ lệnh nào nữa. Và các hoạt động trước đó sẽ được tiếp tục
onStop()
Được gọi tới khi activity không còn được nhìn thấy nữa
onDestroy()
Method này được gọi tới khi app bị destroy .
onRestart()
Method này được gọi tới khi app đã bị stop.
Chúng ta sẽ vào một ví dụ để các bạn có thể hình dung dễ hơn.
a. activity_main.xml
<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="nosoft.com.demolifecycle.MainActivity" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
</RelativeLayout>
b. AndroidMenifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="nosoft.com.demolifecycle"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <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>
    </application>
</manifest>
c. MainActivity.java
package nosoft.com.demolifecycle;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
/**
 * 
 * @author Nosoft
 *
 */
public class MainActivity extends Activity {
String msg = "Nosoft : ";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(msg, "onCreate() start");
}
/** Called when the activity is about to become visible. */
@Override
protected void onStart() {
super.onStart();
Log.d(msg, "onStart() start");
}
/** Called when the activity has become visible. */
@Override
protected void onResume() {
super.onResume();
Log.d(msg, "onResume() start");
}
/** Called when another activity is taking focus. */
@Override
protected void onPause() {
super.onPause();
Log.d(msg, "onPause() start");
}
/** Called when the activity is no longer visible. */
@Override
protected void onStop() {
super.onStop();
Log.d(msg, "onStop() start");
}
/** Called just before the activity is destroyed. */
@Override
public void onDestroy() {
super.onDestroy();
Log.d(msg, "onDestroy() start");
}
}
d. Results.
Full code example : here
pass extract :https://androidandshare.blogspot.com
Chúng ta có thể tự động gen các method này như sau.
các bạn chuột phải vào MainActivity , hay activity muốn generate  ==> Chọn sources ==> Override/ Implements methods..
Sau đó chọn các method mà mình muốn sử dụng và chọn OK

4. Tasks là gì ?
Tasks là sự trao đổi công việc giữa các ứng dụng với nhau trong Android.
 Ví dụ một ứng dụng invite friend , khi các bạn click vào nó . Nó sẽ gọi tới một app email , hay Facebook khác để thực hiện tiếp công việc mà người dùng muốn làm .
Tạm thời dừng tại đây. Chúng ta sẽ gặp lại nhau trong loạt bài tiếp theo.

Bài 3 - Các cách cơ bản để fix lỗi trong Android.

Hi all , hôm nay mình sẽ giới thiệu cho các bạn cách fix lỗi chương trình Android trong eclipse .
Nếu chương trình của bạn không lỗi source code , không lỗi xml , các bạn không tìm được nguyên nhân của nó thì các bạn có thể thử một số cách dưới đây.
1 . Giải pháp 1.
Các bạn vào Project --> clean.
Có thể clean all tất cả các project đã có trong eclipse , hoặc 1 vài project cần clean.
Sau đó ấn OK.
2. Giải pháp 2.
Chọn project đang bị lỗi , Chuột phải --> Chọn Android Tool --> Fix project properties
3. Giải pháp 3.
Khi các bạn gặp lỗi project không tự tạo ra file R.java . Thì các bạn hãy kiểm tra các thư mục trong res xem có viết hoa , đánh số , hoặc nội dung các file xml có bị lỗi không .
Vì nếu tồn tại lỗi , thì tool sẽ không tự động gen ra file R,java .
Dẫn tới việc gây ra lỗi cho project
4. Giải pháp 4.
Một cách đơn giản khác nữa đó là Restart lại eclipse .
Vì thằng eclipse này nhiều lúc như hấp bởi xung đột các API , SDK hay thậm chí JDK của các bạn khi tích hợp vào eclipse .
Nói chung đây sẽ là giải pháp bất đắc dĩ. Các bạn nếu hết cách thì đừng quên giải pháp này nhé . :D

Bài 2 - Cấu trúc một chương trình Android - eclipse

Hi , hôm nay mình sẽ hướng dẫn các bạn cách tạo và hiểu về cấu trúc chương trình Android khi code trên eclipse.
1. Cách tạo chương trình.
Bước 1: Các bạn chuột phải ==> Chọn new ==>Android Application Project
Bước 2 : Đặt tên cho Application của mình.
Trong đó :
- Application name : Tên app của bạn :
- Project Name : tên project của bạn.
- Package name : tên package name để submit lên Google play
- Minimum Required SDK : App của bạn có thể chạy trên API thấp nhất nào , OS thấp nhất nào.
- Target SDK : App của bạn có thể chạy tốt nhất ở API nào.
- Compile With : Và đang được complier trên target nào.
- Theme ; là theme được sử dụng cho app . Cái này mình sẽ hướng dẫn cụ thể trong loạt bài sau.
Các bạn chọn thông tin đầy đủ rồi  ==> Sau đó chọn next
Bước 3 : Chọn icon cho app ==> Next
Bước 4: Chọn loại activity cho MainActivity cho app của bạn ==> Sau đó chọn Next
Bước 5 : Đặt tên MainActivity và Main layout ==>Chọn finish
2. Cấu trúc một chương trình Android.
Một cấu trúc chương trình Android trong eclipse sẽ có dạng như sau:
Vùng 1 : Chứa các file .java chính là source code của các bạn sẽ được viết tại đây , xử lý các lớp model , control... sẽ được xử lý tại đây.
Vùng 2 : là thư mục gen , trong thư mục này có file BuildConfig.java  và R.java. Thằng R.java là file java SDK Android sẽ tự gen ra nếu các bạn để auto build, nó quy định các id của các thành phần trong app của bạn. Như các bạn có thể thấy ở hình dưới.
Vùng 3 : Chứa các resource cho app của bạn , như các file xml giao diện , ảnh  ...
Vùng 4 : Chứa layout , các file xml quy định các screen .
Vùng 5 : Quy định các loại menu và value cho app của bạn . Cái này các bạn sẽ dần dần sẽ hiểu sâu hơn . Thư mục value: quy định các file strings.xml và file style , theme các kiểu
Vùng 6 : AndroidMenifest.xml . File config cho toàn bộ app của bạn
Cụ thể hơn như sau :
Các bạn chọn thư mục layout . Mở thử một file layout trong thư mục này .
Vùng Plete là các element có thể sử dụng để thiết kế layout cho màn hình ứng dụng của các bạn. Một cửa sổ để hiển thị xem ứng dụng của các bạn được thiết kết thế nào.
Để ý bên dưới ảnh , có 2 phần : Graphical Layout và activity_main.xml
Graphical Layout : các bạn có thể kéo thả và tự do design ở đây , giống như với swing ...Bên activity_main.xml nó sẽ tự gen ra . Hoặc có thể code bên phía activity_main.xml cũng được .
File AndroidMenifest.xml
Vùng 1 : chính là package name các bạn đã đặt khi tạo project
Vùng 2 : là version code và version name . Hai cái này đặc biệt quan trọng khi các bạn update trên playstore . Cụ thể thế nào mình sẽ hướng dẫn các bạn sau .
Vùng 3 : Chính là min target và target SDK cũng mới tạo  . Nếu các bạn muốn sửa thì hãy sử ở đây .
Vùng 4 : Là các Activity dùng cho app . Lưu ý nó phải nằm trong thẻ application nhé . Nằm ngoài là sai luôn đó . Trong thẻ này còn mấy loại khác nữa như meta-data , bla bla . Dần dần các bạn sẽ khám phá hết nó .
OK , tạm thời thế đã .
Hẹn gặp lại các bạn trong loạt bài sau.

Tuesday, August 11, 2015

Share code Android Part I

Hi all .
Như các loạt bài hướng dẫn khác . Mình cũng tạo một thư mục share code để chia sẻ nhưng application mà các bạn đang tìm kiếm , để có thể tham khả cũng như áp dụng vào ứng dụng mà các bạn đang muốn xây dựng.
Mọi đóng góp của các bạn hay comment bên dưới . Nếu thấy hay thì hãy chia sẽ cho bạn bè mình nha.
Thank all.

Wednesday, July 15, 2015

Bài 1 - Tổng quan về Android

Hiện nay , thế giới mobile rất đa dạng , người người dùng di động , nhà nhà dùng di động . Cũng chính vì sự gọn nhẹ (tổ hợp của cả tá thứ tiện ích bên trong) , khiến cho nhiều người sử dụng . Và chính vì vậy nó khiến cho các hệ điều hành của mobile phát triển một cách kinh khủng tới vậy.
Trong thế giới của mobile thì theo mình biết có 2 ông chủ lớn nhất đó là Android và IOS .
Ở đây mình sẽ nói về Android và các cách thức để các bạn có thể xây dựng một application trên hệ điều hành này .
1. Thị phần Android
Tính tới năm 2014 thì thị phần Android đã chiếm 84% thị phần trên nền tảng di động . Con số này đúng là một con số đáng nể . Bởi nó là một hệ điều hành mã nguồn mở , dễ sử dụng , tương thích với nhiều thiết bị di động của nhiều hãng di động . Đối thủ cạnh tranh lớn nhất của Android là IOS , nó cũng là đối thủ hạn chế sự gia tăng thị phần của Android.
Có rất nhiều hãng điện thoại sử dụng hệ điều hành Android này , và customize theo kiểu của mình để tạo ra một hệ điều hành đa dạng chủng loại . Làm cho người tiêu dùng có nhiều sự lựa chọn sử dụng hơn.
2. Những điều cần có khi xây dựng ứng dụng Android
Thì những điều cần để bước vào loạt bài hướng dẫn này đó là các bạn cần nắm được :
- Kiến thức Java basic cơ bản. Phải có kiến thức về em này là tất nhiên rồi . Vì xây dựng các app trên Android thì phải viết bằng Java , các câu lệnh cú pháp các kiểu đều từ Java mà ra . Có chăng thêm các API thì cũng là Java nốt....
- Có khả năng thành thạo eclipse (mình muốn dùng eclipse mà không dùng Android studio bởi vì thằng cha này rất nặng , eclipse tuy thi thoảng lại lỗi nhưng vẫn rất good ). Mình nghĩ là chúng ta cũng hãn tạm học trên tool này trước . Mình sẽ hướng dẫn các bạn làm trên Android studio sau .
- Niềm đam mê với mobile . Tất nhiên có thích thì các bạn mới có thể làm được .