Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中的Service組件詳解

Android中的Service組件詳解

編輯:關於Android編程

Service與Activity的區別在於:Service一直在後台運行,他沒有用戶界面,絕不會到前台來。

一,創建和配置Service

開發Service需要兩個步驟:1,繼承Service子類,2,在Manifest.xml文件中配置Service

Service中的方法:

 

public class FirstService extends Service
{
	// 必須實現的方法,返回一個IBinder對象,應用程序可通過該對象與Service組件通信
	@Override
	public IBinder onBind(Intent arg0)
	{
		return null;
	}
	// Service被創建時回調該方法。
	@Override
	public void onCreate()
	{
		super.onCreate();
		System.out.println("Service is Created");
	}
	// Service被啟動時回調該方法
	@Override
	public int onStartCommand(Intent intent, int flags, int startId)
	{
		System.out.println("Service is Started");
		return START_STICKY;
	}
	// Service被關閉之前回調。
	@Override
	public void onDestroy()
	{
		super.onDestroy();
		System.out.println("Service is Destroyed");
	}
}
Manifest.xml中配置service

		
			
				
				
			
		

 

 

二,啟動和停止Service

1,startService 啟動的服務:主要用於啟動一個服務執行後台任務,不進行通信,訪問者與Service沒有關聯,即使訪問者退出了,Service仍然運行。停止服務使用stopService
bindService 啟動的服務:該方法啟動的服務要進行通信。停止服務使用unbindService

public class StartServiceTest extends Activity
{
	Button start, stop;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 獲取程序界面中的start、stop兩個按鈕
		start = (Button) findViewById(R.id.start);
		stop = (Button) findViewById(R.id.stop);
		// 創建啟動Service的Intent
		final Intent intent = new Intent();
		// 為Intent設置Action屬性
		intent.setAction("org.service.FIRST_SERVICE");
		start.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View arg0)
			{
				// 啟動指定Serivce
				startService(intent);
			}
		});
		stop.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View arg0)
			{
				// 停止指定Serivce
				stopService(intent);
			}
		});
	}
2,綁定本地Service並與之通信

 

如果訪問者和Service之間需要進行方法調用或者數據傳遞,則應該使用bindService和unbindService方法啟動關閉Service

boolean bindService(Intent service, ServiceConnection conn,int flags)方法:

service:這個參數通過Intent指定要啟動的Service

conn:ServiceConnection 對象,該對象用於監聽訪問者與Service之間的連接情況。當訪問者與Service之間連接成功時將會回調ServiceConnection對象的onServiceConnected(ComponentName name, IBinder service);當Service所在的宿主中止,導致Service與訪問者之間斷開時會回調ServiceConnection對象的onServiceDisconnected(ComponentName name)方法

flags:綁定時是否自動創建Service。0或BIND_AUTO_CREATE

 

ServiceConnection對象的onServiceConnected方法中有一個IBinder對象,該對象即可與被綁定Service之間的通信

 

通信原理:當開發Service是。該Service類必須提供一個IBinder onBind(Intent intent)方法,在綁定本地Service的情況下,onBind(Intent intent)方法所返回的IBinder對象會傳給ServiceConnection對象的onServiceConnected的(ComponentName name, IBinder service)的service參數。這樣訪問者就可使用該IBinder對象與Service進行通信了

BindService.java

public class BindService extends Service//繼承Service
{
	private int count;
	private boolean quit;
	// 定義onBinder方法所返回的對象,此binder會傳給訪問者
	private MyBinder binder = new MyBinder();
	// 通過繼承Binder來實現IBinder類
	public class MyBinder extends Binder //①
	{
		public int getCount()
		{
			// 獲取Service的運行狀態:count
			return count;
		}
	}
	// 必須實現的方法,綁定該Service時回調該方法
	@Override
	public IBinder onBind(Intent intent)
	{
		System.out.println("Service is Binded");
		// 返回IBinder對象
		return binder;
	}
	// Service被創建時回調該方法。
	@Override
	public void onCreate()
	{
		super.onCreate();
		System.out.println("Service is Created");
		// 啟動一條線程、動態地修改count狀態值
		new Thread()
		{
			@Override
			public void run()
			{
				while (!quit)
				{
					try
					{
						Thread.sleep(1000);
					}
					catch (InterruptedException e)
					{
					}
					count++;
				}
			}
		}.start();
	}
	// Service被斷開連接時回調該方法
	@Override
	public boolean onUnbind(Intent intent)
	{
		System.out.println("Service is Unbinded");
		return true;
	}
	// Service被關閉之前回調該方法。
	@Override
	public void onDestroy()
	{
		super.onDestroy();
		this.quit = true;
		System.out.println("Service is Destroyed");
	}
}
配置Service組件:

		
			
				
				
				
		

BindServiceTest.java
public class BindServiceTest extends Activity
{
	Button bind, unbind, getServiceStatus;
	// 保持所啟動的Service的IBinder對象
	BindService.MyBinder binder;
	// 定義一個ServiceConnection對象
	private ServiceConnection conn = new ServiceConnection()
	{
		// 當該Activity與Service連接成功時回調該方法
		@Override
		public void onServiceConnected(ComponentName name
			, IBinder service)
		{
			System.out.println("--Service Connected--");
			// 獲取Service的onBind方法所返回的MyBinder對象
			binder = (BindService.MyBinder) service; //①
		}

		// 當該Activity與Service斷開連接時回調該方法
		@Override
		public void onServiceDisconnected(ComponentName name)
		{
			System.out.println("--Service Disconnected--");
		}
	};

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 獲取程序界面中的start、stop、getServiceStatus按鈕
		bind = (Button) findViewById(R.id.bind);
		unbind = (Button) findViewById(R.id.unbind);
		getServiceStatus = (Button) findViewById(R.id.getServiceStatus);
		// 創建啟動Service的Intent
		final Intent intent = new Intent();
		// 為Intent設置Action屬性
		intent.setAction("org.crazyit.service.BIND_SERVICE");
		bind.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View source)
			{
				// 綁定指定Serivce
				bindService(intent, conn, Service.BIND_AUTO_CREATE);
			}
		});
		unbind.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View source)
			{
				// 解除綁定Serivce
				unbindService(conn);
			}
		});
		getServiceStatus.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View source)
			{
				// 獲取、並顯示Service的count值
				Toast.makeText(BindServiceTest.this,
					"Serivce的count值為:" + binder.getCount(),
					Toast.LENGTH_SHORT).show(); //②
			}
		});
	}
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved