當前位置:九游会j9娱乐平台-九游ag登录中心网址 » 安卓系統 » androidlocal

androidlocal-九游会j9娱乐平台

發布時間: 2024-07-12 20:26:34

❶ 如何給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();

}

}

}

熱點內容
matlab命令窗口和新建腳本 發布:2024-07-17 15:51:26 瀏覽:374
建ftp文件夾 發布:2024-07-17 15:51:26 瀏覽:954
魔獸撿物腳本 發布:2024-07-17 15:27:56 瀏覽:129
開發ip伺服器 發布:2024-07-17 15:24:42 瀏覽:387
安卓系統視頻製作哪個好用 發布:2024-07-17 15:10:47 瀏覽:210
androidapk結構 發布:2024-07-17 15:10:43 瀏覽:945
c語言指針的例子 發布:2024-07-17 15:08:01 瀏覽:768
linuxzcat 發布:2024-07-17 15:02:09 瀏覽:901
賓士編程嗎 發布:2024-07-17 14:57:08 瀏覽:853
硬碟加密硬體 發布:2024-07-17 14:51:05 瀏覽:836
网站地图