㈠ java與安卓是什麼關系
Java,是由Sun
Microsystems公司於1995年5月推出的Java程序設計語言和Java平台的總稱。用Java實現的HotJava瀏覽器(支持Java
applet)顯示了Java的魅力:跨平台、動態的Web、Internet計算。從此,Java被廣泛接受並推動了Web的迅速發展,常用的瀏覽器現在均支持Java
applet。 android以Java為編程語言,使介面到功能,都有層出不窮的變化,其中Activity等同於J2ME的MIDlet,一個
Activity
類(class)負責創建視窗(window),一個活動中的Activity就是在
foreground(前景)模式,背景運行的程序叫做Service。兩者之間通過由ServiceConnection和AIDL連結,達到復數程序同時運行的效果。如果運行中的
Activity
全部畫面被其他
Activity
取代時,該
Activity
便被停止(stopped),甚至被系統清除(kill)。
View等同於J2ME的Displayable,程序人員可以通過
View
類與「XML
layout」檔將UI放置在視窗上,Android
1.5的版本可以利用
View
打造出所謂的
Widgets,其實Widget只是View的一種,所以可以使用xml來設計layout,HTC的Android
Hero手機即含有大量的widget。至於ViewGroup
是各種layout
的基礎抽象類(abstract
class),ViewGroup之內還可以有ViewGroup。View的構造函數不需要再Activity中調用,但是Displayable的是必須的,在Activity
中,要通過findViewById()來從XML
中取得View,Android的View類的顯示很大程度上是從XML中讀取的。View
與事件(event)息息相關,兩者之間通過Listener
結合在一起,每一個View都可以注冊一個event
listener,例如:當View要處理用戶觸碰(touch)的事件時,就要向Android框架注冊View.OnClickListener。另外還有Image等同於J2ME的BitMap。
㈡ android程序設計基礎中service的基本原理是什麼
1. 說明
android的後台運行在很多service,它們在系統啟動時被SystemServer開啟,支持系統的正常工作,比如MountService監聽是否有SD卡安裝及移除,ClipboardService提供剪切板功能,PackageManagerService提供軟體包的安裝移除及查看等等,應用程序可以通過系統提供的Manager介面來訪問這些Service提供的數據,以下將說明他們的工具流程
2. 舉例說明基本流程
以android系統支持sensor(感測器)實例來說明框架層的service和manager是如何配合工作的
1) 什麼是sensor
sensor是感測器, 比如控制橫豎屏切換利用的就是重力感測器(gsensor), 還有accelerator sensor可取得x, y, z三個軸上的加速度(應用如平衡球, 小猴吃香蕉等)
2) 應用程序調用(以下為關鍵代碼)
sensorManager=(SensorManager)getSystemService(context.SENSOR_SERVICE);
lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
sensorManager.registerListener(sensorListener, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
3) Manager層
a) 提供給應用程序調用的介面,同實與Service交互,實現功能
frameworks/base/core/java/android/hardware/SensorManager.java
4) Service層
a) 開機時就運行的管理Sensor的後台服務
frameworks/base/services/java/com/android/server/SensorService.java
b) snesor後台服務需要的JNI,通過它與系統級交互
frameworks/base/services/jni/com_android_server_SensorService.cpp
5) 系統層
a) 感測器的頭文件,硬體提供商按此文件的定義實現其功能
hardware/libhardware/include/hardware/sensors.h
b) 感測器的系統層實現,與內核交互,此處通常是硬體提供商提供的
hareware/libsensors
6) 內核及硬體層
內核訪問硬體,同時以設備文件等方式提供給上層控制介面和感測器數據
3. 系統層實現
1) frameworks/base/core/java/android/*Manager.java 對應用的介面
2) frameworks/base/core/jni/ 對應用的介面的JNI
3) frameworks/base/services/java/com/android/server/ 後台服務
4) frameworks/base/services/jni/ JNI與系統層介面
5) hardware/libhardware/include/ 系統層頭文件
6) hardware/libxxx 系統庫支持
7) 內核支持
4. 應用程序如何使用
1) 查看系統提供哪些服務
find frameworks/base/core/java/android/ -name *Manager.java
此處可以看到調用系統提供服務的入口
2) 一般register listener,事件發生時都收到回調
5. 新建一個service(以froyo為例)
1) 介面:介面供應用調用
frameworks/base/core/java/android/app/ContextImpl.java 加服務名與Manager對應
frameworks/base/core/java/android/content/Context.java 加服務名定義
2) Manager:提供服務對應的調用介面
frameworks/base/core/java/android/app/StartXXXXManager.java 實現調用介面
frameworks/base/core/java/android/app/IXXXXManager.aidl 定義調用介面
frameworks/base/Android.mk 加入aidl的編譯
3) service:提供後台服務支持
frameworks/base/services/java/com/android/server/XXXXService.java 服務實現
frameworks/base/services/java/com/android/server/SystemServer.java 啟動服務
㈢ 怎樣在android的service中調用Activity中的getWindow函數
GetWindow 函數功能:該函數返回與指定窗口有特定關系(如Z序或所有者)的窗口句柄。 函數原型:HWND GetWindow(HWND hWnd,UNIT nCmd); 參數: hWnd:窗口句柄。要獲得的窗口句柄是依據nCmd參數值相對於這個窗口的句柄。 nCmd:說明指定窗口與要獲得句柄的窗口之間的關系。該參數值可以是下列之一: GW_CHILD:如果指定窗口是父窗口,則獲得的是在Z序頂端的子窗口的句柄,否則為NULL。函數僅檢查指定父窗口的子窗口,不檢查繼承窗口。 GW_ENABLEDPOUP:(WindowsNT 5.0)返回的句柄標識了屬於指定窗口的處於使能狀態彈出式窗口(檢索使用第一個由GW_HWNDNEXT 查找到的滿足前述條件的窗口);如果無使能窗口,則獲得的句柄與指定窗口相同。 GW_HWNDFIRST:返回的句柄標識了在Z序最高端的相同類型的窗口。如果指定窗口是最高端窗口,則該句柄標識了在Z序最高端的最高端窗口;如果指定窗口是頂層窗口,則該句柄標識了在z序最高端的頂層窗口:如果指定窗口是子窗口,則句柄標識了在Z序最高端的同屬窗口。 GW_HWNDLAST:返回的句柄標識了在z序最低端的相同類型的窗口。如果指定窗口是最高端窗口,則該柄標識了在z序最低端的最高端窗口:如果指定窗口是頂層窗口,則該句柄標識了在z序最低端的頂層窗口;如果指定窗口是子窗口,則句柄標識了在Z序最低端的同屬窗口。 GW_HWNDNEXT:返回的句柄標識了在Z序中指定窗口下的相同類型的窗口。如果指定窗口是最高端窗口,則該句柄標識了在指定窗口下的最高端窗口:如果指定窗口是頂層窗口,則該句柄標識了在指定窗口下的頂層窗口;如果指定窗口是子窗口,則句柄標識了在指定窗口下的同屬窗口。 GW HWNDPREV:返回的句柄標識了在Z序中指定窗口上的相同類型的窗口。如果指定窗口是最高端窗口,則該句柄標識了在指定窗口上的最高端窗口;如果指定窗口是頂層窗口,則該句柄標識了在指定窗口上的頂層窗口;如果指定窗口是子窗口,則句柄標識了在指定窗口上的同屬窗口。 GW_OWNER:返回的句柄標識了指定窗口的所有者窗口(如果存在)。 返回值:如果函數成功,返回值為窗口句柄;如果與指定窗口有特定關系的窗口不存在,則返回值為NULL。 若想獲得更多錯誤信息,請調用GetLastError函數。 備註:在循環體中調用函數EnumChildWindow比調用GetWindow函數可靠。調用GetWindow函數實現該任務的應用程序可能會陷入死循環或退回一個已被銷毀的窗口句柄。 速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;頭文件:winuser.h;庫文件:user32.lib。
㈣ android和java webservice RSA處理的不同
android和java webservice RSA處理的不同如下:
1.最近做RSA加密用於增強android客戶機與伺服器(JavaEE)數據傳輸的安全性。發現在andorid機器上生成的(密鑰對由伺服器在windows xp下生成並將公鑰發給客戶端保存)密碼無法在伺服器通過私鑰解密。
2.為了測試,在伺服器本地加解密正常,另外,在android上加解密也正常,但是在伺服器中加密(使用相同公鑰)後的密碼同樣無法在android系統解密(使用相同私鑰)。
3.由於對RSA加密演算法不了解,而且對Java RSA的加密過程也不清楚、谷歌一番,才了解到可能是加密過程中的填充字元長度不同,這跟加解密時指定的RSA演算法有關系。
4.比如,在A機中使用標准RSA通過公鑰加密,然後在B系統中使用「RSA/ECB/NoPadding」使用私鑰解密,結果可以解密,但是你會發現解密後的原文前面帶有很多特殊字元,這就是在加密前填充的空字元;如果在B系統中仍然使用標準的RSA演算法解密,這在相同類型的JDK虛擬機環境下當然是完全一樣的,關鍵是android系統使用的虛擬機(dalvik)跟SUN標准JDK是有所區別的,其中他們默認的RSA實現就不同。
5.更形象一點,在加密的時候加密的原文「abc」,你直接使用「abc」.getBytes()方法獲得的bytes長度可能只有3,但是系統卻先把它放到一個512位的byte數組里,new byte[512],再進行加密。但是解密的時候你使用的是「加密後的密碼」.getBytes()來解密,解密後的原文自然就是512長度的數據,即是在「abc」之外另外填充了500多位元組的其他空字元。
㈤ 關於在Android框架中增加service
照葫蘆畫瓢唄,你看看framework/base/services/java/com/android/server/下的例子。一般一個server由xxxxService.java xxxxManager.java IxxxxManager.aidl組成。Manager和aidl在frameworks/base/core/java/android/。如果是要系統啟動時就運行,則需要在SystemServer.java中加上啟動你的Service的代碼。
㈥ 如何在Android源碼中加入Java層系統服務
1. 在android/app/目錄下創建介面文件IServiceTest.aidl
package android.app;
oneway interface IServiceTest
{
void show();
}
2. 在Android.mk文件中的變數LOCAL_SRC_FILES中加入core/java/android/app/IServiceTest.aidl
如果要在sdk中發布這個服務就在變數aidl_files中加入一樣的路徑。
3. 通過aidl編譯器編譯IServiceTest.aidl,會生成一個IServiceTest.java文件。
4. 創建服務類ServiceTestSerice
class ServiceTestSerice extends IServiceTest.Stub{
private static final String TAG = 「ServiceTestSerice」;
Context mContext;
public ServiceTestSerice(Context context){
mContext = context;
}
public void show() throws RemoteException {
System.out.println(「My ServiceTestSerice」);
}
}
.5. 注冊服務
Java系統服務在ServerThread類的run()方法中生成並注冊到android平台,生成ServiceTestSerice實例對象,通過ServiceManager的addService方法將服務注冊到系統中。
try{
serviceTestSerice = new ServiceTestSerice(context);
ServiceManager.addService(Context.SERVICE_TEST, serviceTestSerice);
} catch (Throwable t) {
}
ServiceTestSerice serviceTestSerice;
以上代碼在ServerThread類的run()方法中。
在Context類中加入:
public static final StringSERVICE_TEST = 「servicetest」
ServiceTestManager sServiceTestManager;
6. 使用系統服務
編寫一個ServiceTestManager類,為包裝類。
public class ServiceTestManager{
private final IServiceTest mService;
ServiceTestManager(IServiceTest service){
mService = service;
}
public void test(){
try{
mService. show()
} catch (RemoteException ex){
}
}
}
7 提供應用層開發介面
在ContextImpl類中的getSystemService()方法中加入如下代碼:
else if (SERVICE_TEST.equals(name)){
return getServiceTestManager();
}
private ServiceTestManager getServiceTestManager(){
synchronized(sSync) {
if (sServiceTestManager == null){
IBinder b = ServiceManager.getService(SERVICE_TEST);
IServiceTest service = IServiceTest.Stub.asInterface(b);
sServiceTestManager = new ServiceTestManager(service);
}
}
調用過程如下:
ServiceTestManager manager= (ServiceTestManager) getSystemService(Context. SERVICE_TEST);
manager.show();
8. 測試
make
make update-api 更新current.xml文件
生成system.imz文件,放到<ANDROID_SDK>/platform/android-20/images/目錄下,
adb shell
service list
㈦ android 怎麼利用service
1、要使用Service,首先就是在配置文件里嗎添加Service,如果不填加,你的Service是不能夠使用的。目前學到的方法有兩種
方法一:<service android:enabled="true" android:name=".PlayService" />
方法二:<service android:name=".PlayService" />
點後面是Service類的名字。
2、工程包括兩個類:
ServiceActivity.java
PlayService.java
其中:ServiceActivity.java定義了兩個按鈕,分別控制音樂的播放與停止。
用startService和stopService完成Activity與Service之間的切換,啟動Service以及取消Service
㈧ 如何在Android中添加系統服務
在android中添加系統服務,下面以SurfaceComposer這個service為例,
① 首先提供介面文件ISurfaceComposer.h
//frameworks\native\include\gui\ISurfaceComposer.h
//首先是介面,c++實現是虛函數
class ISurfaceComposer: public IInterface {
public:
DECLARE_META_INTERFACE(SurfaceComposer);
// flags for setTransactionState()
enum {
eSynchronous = 0x01,
eAnimation = 0x02,
};
enum {
eDisplayIdMain = 0,
};
/* create connection with surface flinger, requires
* ACCESS_SURFACE_FLINGER permission
*/
virtual sp<ISurfaceComposerClient> createConnection() = 0;
}
② 建立BnSurfaceComposer
建立BnSurfaceComposer,需要重寫BBinder的onTransact函數。
class BnSurfaceComposer: public BnInterface<ISurfaceComposer> {
public:
enum {
// Note: BOOT_FINISHED must remain this value, it is called from
// Java by ActivityManagerService.
BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION,
CREATE_CONNECTION,
CREATE_GRAPHIC_BUFFER_ALLOC,
CREATE_DISPLAY_EVENT_CONNECTION,
CREATE_DISPLAY,
DESTROY_DISPLAY,
GET_BUILT_IN_DISPLAY,
SET_TRANSACTION_STATE,
AUTHENTICATE_SURFACE,
BLANK,
UNBLANK,
GET_DISPLAY_INFO,
CONNECT_DISPLAY,
CAPTURE_SCREEN,
};
virtual status_t onTransact(uint32_t code, const Parcel& data,
Parcel* reply, uint32_t flags = 0);
};
③ Bpxxx的實現
frameworks\native\libs\gui\ISurfaceComposer.cpp中,
//Bp實現,代理端
class BpSurfaceComposer : public BpInterface<ISurfaceComposer>
{
public:
BpSurfaceComposer(const sp<IBinder>& impl)
: BpInterface<ISurfaceComposer>(impl)
{
}
//代理介面
virtual sp<ISurfaceComposerClient> createConnection()
{
uint32_t n;
Parcel data, reply;
data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
}
}
④ Bnxxx的實現
//Bn端,即server端
status_t BnSurfaceComposer::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code) {
case CREATE_CONNECTION: {
CHECK_INTERFACE(ISurfaceComposer, data, reply);
//createConnection就是server端的實現函數
sp<IBinder> b = createConnection()->asBinder();
reply->writeStrongBinder(b);
return NO_ERROR;
}
default: {
return BBinder::onTransact(code, data, reply, flags);
}
}
// should be unreachable
return NO_ERROR;
}
⑤ 注冊service
通過上面幾步已經完成了service的建立,我們需要將service注冊到service manager中。
class SurfaceFlinger : public BnSurfaceComposer,
//在frameworks\native\services\surfaceflinger\main_surfaceflinger.cpp中,
// publish surface flinger
sp<IServiceManager> sm(defaultServiceManager());
sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);
⑥ 使用service
//首先獲取代理端BpSurfaceComposer
sp<ISurfaceComposer> composer(ComposerService::getComposerService());
//直接調用代理BpSurfaceComposer的介面
sp<IGraphicBufferAlloc> alloc(composer->createGraphicBufferAlloc());
其中getComposerService()的實現為,
/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
ComposerService& instance = ComposerService::getInstance();
Mutex::Autolock _l(instance.mLock);
if (instance.mComposerService == NULL) {
ComposerService::getInstance().connectLocked();
assert(instance.mComposerService != NULL);
ALOGD("ComposerService reconnected");
}
return instance.mComposerService;
}
void ComposerService::connectLocked() {
const String16 name("SurfaceFlinger");
//獲取service,返回的mComposerService是BpSurfaceComposer,有了Bp就能直接調用代理介面了
while (getService(name, &mComposerService) != NO_ERROR) {
usleep(250000);
}
assert(mComposerService != NULL);
// Create the death listener.
class DeathObserver : public IBinder::DeathRecipient {
ComposerService& mComposerService;
virtual void binderDied(const wp<IBinder>& who) {
ALOGW("ComposerService remote (surfaceflinger) died [%p]",
who.unsafe_get());
mComposerService.composerServiceDied();
}
public:
DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
};
mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
mComposerService->asBinder()->linkToDeath(mDeathObserver);
}
java添加service
Android為了方便開發人員,提供了AIDL工具,簡化了編寫service的難度。下面以添加TestService這個服務為例,
① 編寫AIDL文件
package android.app;
interface ITestService {
boolean enableWifi(boolean enabled);
}
TestService的AIDL文件提供了一個介面,enableWifi()。
② 創建TestService服務
TestService 服務需要繼承ITestService.Stub類,這個類就是通過AIDL工具對①中的AIDL文件處理後產生的,
class TestService extends ITestService.Stub {
//實現介面
public boolean enableWifi(boolean enabled)
{
......
}
}
③ Context.java中添加service名字字元串
// Context.java中添加service名字字元串
public static final String TEST_SERVICE = "my_test";
④ 向ServiceManager中注冊service
java中大部分的系統service都是在SystemServer中去向service manager注冊的,
//ServiceManager注冊service
// 在SystemServer.java中,模仿其他向ServiceManager添加service的方法
try {
TestService myService = new TestService(context);
ServiceManager.addService(Context.TEST_SERVICE, myService);
} catch (Throwable e) {
reportWtf("register my test service fail", e);
}
⑤創建服務對應的Manager
對於每一個service而言,通常會有一個相關的Manager。 Managers提供API給app使用,成為SDK的一部分,是apps和remote service的中間橋梁。Manager中的介面和Service中的介面必須一一對應。
public class TestServiceManager{
private final ITestService mService;
private final Context mContext;
//構造函數中傳入的service,其實就是BpTestService
TestServiceManager(Context context,ITestService service) {
mContext = context;
mService = service;
}
public boolean enableWifi(boolean enabled) {
try {
return mService.enableWifi(enabled);
} catch (RemoteException ex) {
}
return false;
}
}
到目前為止,我們只是完成了Service的注冊,但是還沒有使用,該如何使用?
⑥ contextImpl中注冊Manager
一旦我們實現了service和對應的Manager,需要有一種方法在app中調用他們。前面說過,Manager會成為SDK的一部分,供我們調用,那麼Manager和Service是如何聯系起來的?首先需要將我們的service和mangager注冊到execution context,即contextImpl中,
registerService(TEST_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
IBinder b = ServiceManager.getService(TEST_SERVICE);
//asInterface(BpBinder)後就是BpTestService
ITestService service = ITestService.Stub.asInterface(b);
//創建TestServiceManager,第二個參數為BpBpTestService
return new TestServiceManager(ctx.getOuterContext(), service);
}});
registerService的第二個參數是一個ServiceFetcher對象,這里直接在調用時,新建了一個ServiceFetcher類,重寫了createService方法。
ContextImpl.java中的registerService()方法,其核心就是把servicename和ServiceFetcher對象放到一個Hash的鍵值對中。
private static void registerService(String serviceName, ServiceFetcher fetcher) {
if (!(fetcher instanceof StaticServiceFetcher)) {
fetcher.mContextCacheIndex = ++;
}
SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
}
⑦ app如何使用service
那麼app是如何調用的呢?
import android.app.TestServiceManager;
import android.content.Context;
TestServiceManager mTestServiceManager;
mTestServiceManager=(TestServiceManager)context.getSystemService(Context.TEST_SERVICE);
然後直接調用TestServiceManager中的方法即可,其中的奧秘需要分析下getSystemService函數。
ContextImpl.java中,
@Override
public Object getSystemService(String name) {
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
//從ServiceFetcher 中獲取service
return fetcher == null ? null : fetcher.getService(this);
}
getService()函數的核心就是上面重寫的createService()函數,返回的就是TestServiceManager對象,所以通過context.getSystemService返回的是Manager對象。
public Object getService(ContextImpl ctx) {
ArrayList<Object> cache = ctx.mServiceCache;
Object service;
synchronized (cache) {
if (cache.size() == 0) {
// Initialize the cache vector on first access.
// At this point
// is the number of potential services that are
// cached per-Context.
for (int i = 0; i < ; i++) {
cache.add(null);
}
} else {
service = cache.get(mContextCacheIndex);
if (service != null) {
return service;
}
}
//調用重載的createService函數,返回的就是TestServiceManager對象
service = createService(ctx);
cache.set(mContextCacheIndex, service);
return service;
}
}
㈨ 用eclipse做Android開發,怎麼新建一個service類new裡面沒有service
一、用 eclipse 創建一個 WebService 伺服器端
1、 首先新建一個動態 web 工程,選擇 File->New->Dynamic Web Project,命名為 axis。
2、 創建一個包, 再新建一個類,右擊 src,選擇 New->Class,命名為 AddService 添加方法 add: public class AddService { public int add(int a, int b) { return a+b; } }
3、右擊 AddService.java 文件,選擇 Web Services->Create Web Service。
4、點擊 next,選擇方法 add,點擊 next->Start server->Finish。這時可以看到 WebContent 目 錄下多了個 wsdl 文件夾,axis 插件自動為我們生成了 AddService.wsdl。
5、我們可以對 AddService 的方法進行測試。右擊 AddService.wsdl,選擇 Web Services->Test with Web Services Explorer。選擇 add 就可以該方法進行測試。
6、將 AddService.java 復制到 WebContent 目錄下,並改名為 AddService.jws。
7、啟動 tomcat,在瀏覽器中輸入 http://localhost:8080/axis/AddService.jws,應該會看到提示: There is a Web Service here,點擊 Click to see the WSDL,看到一個 xml 文件就成功了。
8、將 workspace 下的 axis 工程里的 WebContent 復制到了 tomcat 的 webapps 目錄下,並改 名為 axis,方便訪問。 啟動 tomcat 伺服器,在瀏覽器中輸入:
http://localhost:8080/axis/AddService.jwswsdl
至此,WebService 服務端成功發布。
二、用 eclipse 創建一個 WebService 客戶端 1、 新建一個動態 Web 工程 addTest,再創建 WebService 客戶端: File->New->Other..->Web Services->Web Service Client。 (必須有 Web 工程才能創建 Web Service Client)
2、在 Service definition 輸入框中輸入地址: http://伺服器 ip 地址:8080/axis/services/AddServicewsdl,單擊下一步,選擇輸出文件夾,點 擊 Finish。可以看到 src 下生成了一個包 DefaultNameSpace,裡面有五個 java 文件。 (注意 輸入地址跟前面的不一樣) AddService.java 定義了 Web 服務介面; AddServiceService.java 定義了用於獲取 Web 服務介面的方法; AddServiceServiceLocator.java 介面 AddServiceService 的具體實現; AddServiceSoapBindingStub.java Web 服務客戶端樁,通過該類與伺服器交互。
3、新建一個測試類 TestAddService,為了方便,這個類和剛剛產生的五個類在一個包下。 內容如下:
package DefaultNamespace; public class TestAddService {
public static void main(String[] args) throws Exception{
try{
AddServiceService service = new AddServiceServiceLocator(); AddService add = service.getAddService(); System.out.println(add.add(1, 1)); }catch(Exception e){ e.printStackTrace(); } } }
4、右擊 TestAddService.java,Run As->Java Application。便可以控制台看到輸出結果。
㈩ 關於android的service 和廣播的問題(java相關)
廣播發送了,應該是沒有返回值,傳遞的參數都在intent中。
service可以有回調函數。