androidlocal-ag真人国际官网
❶ 如何給android應用創建本地服務
本文通過代碼向大家詳細介紹和演示這兩種的服務的創建過程,代碼適用於android2.3.3以後的版本。
1. 定義清單文件(androidmanifest.xml)
4. 創建服務啟動界面(localserviceactivities.java)
package my.android.test;
import android.app.activity;
import android.content.componentname;
import android.content.context;
import android.content.intent;
import android.content.serviceconnection;
import android.os.bundle;
import android.os.ibinder;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.toast;
/**
* 該類中包含兩種類型服務的客戶端:
* 啟動類型服務客戶端:controller
* 綁定類型服務客戶端:binding
*/
publicclass localserviceactivities {
/**
* controller類是啟動類型服務的客戶端,它包含兩個按鈕:
* start:點擊該按鈕時,啟動服務。
* stop: 點擊該按鈕時,終止服務。
*/
publicstaticclass controller extends activity{
/**
* activity被首次啟動時,調用該方法。
*/
@override
protectedvoid oncreate(bundle savedinstancestate){
super.oncreate(savedinstancestate);
//填充布局
setcontentview(r.layout.local_service_controller);
//查找布局中的啟動服務按鈕,並設置點擊事件監聽器。
button button = (button)findviewbyid(r.id.start);
button.setonclicklistener(mstartlistener);
//查找布局中的終止服務按鈕,並設置點擊事件監聽器。
button = (button)findviewbyid(r.id.stop);
button.setonclicklistener(mstoplistener);
}
/**
* start按鈕的點擊事件監聽器實現。
*/
private onclicklistener mstartlistener = new onclicklistener(){
publicvoid onclick(view v){
//啟動localservice服務。
startservice(new intent(controller.this, localservice.class));
}
};
/**
* stop按鈕的點擊事件監聽器實現。
*/
private onclicklistener mstoplistener = new onclicklistener(){
publicvoid onclick(view v){
//終止localservice服務。
stopservice(new intent(controller.this, localservice.class));
}
};
}
/***************************************************************
*以下是綁定型服務客戶端的實現
***************************************************************/
/**
* binding類是綁定類型服務的客戶端,它包含兩個按鈕:
* bind:點擊該按鈕時,調用bindservice()方法綁定並啟動服務;
* unbind:點擊該按鈕時,調用unbindservice()方法解除綁定並終止服務。
*/
publicstaticclass binding extends activity{
//用於保存服務的綁定狀態,true:綁定,false:未綁定
privatebooleanmisbound;
//用於保存被綁定的本地服務實例。
private localservice mboundservice;
/**
* 實現監視被綁定服務狀態的介面:serviceconnection
* 綁定類型服務都要實現這個介面,以便監視服務的狀態,這個介面中的方法會在
* 應用的主線程中被調用。
*/
private serviceconnection mconnection = new serviceconnection(){
/**
* 當連接的服務被創建時,android系統會調用這個方法,用ibinder對象跟服務建立通信通道。
* @param classname:被連接的具體的服務組件的名稱
* @param service:服務的通信通道ibinder對象。
*/
publicvoid onserviceconnected(componentname classname, ibinder service){
//從ibinder對象中獲取服務實例。
mboundservice = ((localservice.localbinder)service).getservice();
//顯示activity已經與服務建立了連接的提示消息。
toast.maketext(binding.this, r.string.local_service_connected, toast.length_short).show();
}
/**
* 當服務被終止時,android系統會調用這個方法。
*/
publicvoid onservicedisconnected(componentname classname){
//清除客戶端服務實例
mboundservice = null;
//顯示服務被終止的提示消息。
toast.maketext(binding.this, r.string.local_service_disconnected, toast.length_short).show();
}
};
/**
* 綁定並啟動服務,bind按鈕點擊時會調用這個方法。
*/
void dobindservice(){
//綁定並啟動服務。
bindservice(new intent(binding.this, localservice.class), mconnection, context.bind_auto_create);
misbound = true;
}
/**
* 解除與服務的綁定,unbind按鈕被點擊時會調用這個方法
*/
void dounbindservice(){
//如果服務被綁定,則解除與服務綁定。
if(misbound){
unbindservice(mconnection);
misbound = false;
}
}
/**
* 當activity被銷毀時,調用解除綁定服務的方法,解除被綁定的服務。
*/
@override
protectedvoid ondestroy(){
super.ondestroy();
//解除被綁定的服務。
dounbindservice();
}
/**
* bind按鈕的點擊事件監聽器介面實現。
*/
private onclicklistener mbindlistener = new onclicklistener(){
publicvoid onclick(view v){
//綁定並啟動服務。
dobindservice();
}
};
/**
* unbind按鈕的點擊事件監聽器介面實現。
*/
private onclicklistener munbindlistener = new onclicklistener(){
publicvoid onclick(view v){
//解除被綁定的服務。
dounbindservice();
}
};
/**
* activity被首次啟動時,會調用這個方法。
*/
@override
protectedvoid oncreate(bundle savedinstancestate){
super.oncreate(savedinstancestate);
//填充activity
setcontentview(r.layout.local_service_binding);
//查找布局中的bind按鈕,並設置點擊事件的監聽器
button button = (button)findviewbyid(r.id.bind);
button.setonclicklistener(mbindlistener);
//查找布局中的unbind按鈕,並設置點擊事件的監聽器
button = (button)findviewbyid(r.id.unbind);
button.setonclicklistener(munbindlistener);
}
}
}
5. 創建服務(localservice.java)
package my.android.test;
import android.app.service;
import android.content.intent;
import android.os.binder;
import android.os.handlerthread;
import android.os.ibinder;
import android.os.handler;
import android.os.looper;
import android.os.message;
import android.os.process;
import android.util.log;
import android.widget.toast;
/**
* localservice基礎android的service類,實現應用的本地服務組件。
* 該服務使用handlerthread類創建了服務自己的線程和消息循環,
* 因此,不會因為服務中的長時處理,而阻塞界面的刷新,影響用戶體驗。
*/
publicclass localservice extends service {
//用於保存本服務自己的消息循環對象looper
private looper mservicelooper;
//用於保存內部類servicehandler的對象實例,它繼承了android的handler類,
//用於處理發送給服務的消息。
private servicehandler mservicehandler;
/**
* 這個類用於給客戶端提供綁定對象,因為本示例的服務與客戶端運行在同一個
* 主進程中,所以不需要處理進程間通信(ipc)
*/
publicclass localbinder extends binder{
localservice getservice(){
//返回本服務的實例。
return localservice.this;
}
}
/**
* 服務被首次創建時,系統調用這個方法。
* android服務組件必須覆寫這個方法
*/
@override
publicvoid oncreate(){
//創建線程對象,並啟動線程。
handlerthread thread = new handlerthread("servicestartarguments", process.thread_priority_background);
thread.start();
//獲取線程的消息循環對象
mservicelooper = thread.getlooper();
//用線程的消息循環對象創建消息處理對象。
mservicehandler = new servicehandler(mservicelooper);
}
/**
* 啟動類型服務必須實現這個方法,客戶端每次調用startservice()方法時,
* 系統都會調用這個方法。
* @param intent:它是傳遞給startservice()方法的intent對象。
* @param flags:有關啟動請求的附加數據,可以是:0、start_flag_redelivery或start_flag_retry.
* @param startid:一個唯一的整數,代表一次具體的請求,用於stopselfresult(int)方法。
*/
@override
publicint onstartcommand(intent intent, int flags, int startid){
log.i("localservice", "received star id" startid ":" intent);
//顯示服務啟動的提示信息
toast.maketext(this, "service starting", toast.length_short).show();
//獲取要傳遞給服務消息循環的message對象。
message msg = mservicehandler.obtainmessage();
//初始化message對象的成員變數。
msg.arg1 = startid;
msg.obj = "message processing......" startid;
//把消息發送給服務線程的消息循環。
mservicehandler.sendmessage(msg);
returnstart_sticky;
}
/**
* 必須覆寫這個方法,服務被終止時要調用這個方法,清理服務所佔用的資源。
*/
@override
publicvoid ondestroy(){
//退出服務線程的消息循環。
mservicelooper.quit();
//顯示服務被退出的提示信息。
toast.maketext(this, r.string.local_service_stopped, toast.length_short).show();
}
/**
* 綁定型服務必須覆寫這個方法,啟動型服務也可覆寫這個方法,只要返回null即可。
*/
@override
public ibinder onbind(intent intent){
//返回本服務對象實例。
returnmbinder;
}
privatefinal ibinder mbinder = new localbinder();
/**
* 該類繼承android的handler類,為線程的消息循環提供發送和處理消息的功能,
* 本示例覆寫了handlemessage()方法,用來處理發送給服務消息循環的消息。
*/
privatefinalclass servicehandler extends handler{
//類實例化時,需要傳入服務線程的消息循環對象
public servicehandler(looper looper){
super(looper);
}
/**
* 覆寫handler類的handlemessage()方法,當服務線程的消息循環接收到外部
* 發送的消息時,會調用這個方法來處理對應的消息,本示例只是簡單的向用戶提示消息被處理的信息。
*/
@override
publicvoid handlemessage(message msg){
long endtime = system.currenttimemillis() 5 * 1000;
while (system.currenttimemillis() < endtime){
synchronized(this){
try{
wait(endtime - system.currenttimemillis());
charsequence cs = msg.obj.tostring();
toast.maketext(localservice.this, cs, toast.length_short).show();
//shownotification();
}catch(exception e){
//
}
}
}
//消息被處理之後,終止本服務。
localservice.this.stopself();
}
}
}