private final class ProviderHandler extends Handler {
@Override
public void handleMessage(Message msg) {
int message = msg.what;
switch (message) {
case ENABLE:
if (msg.arg1 == 1) {
handleEnable();
} else {
handleDisable();
}
break;
是用第一個 argument 來通知 Enable/Disable。
Enable 時,執行的是:
private void handleEnable() {
if (DEBUG) Log.d(TAG, "handleEnable");
if (mEnabled) return;
mEnabled = native_init();
也就是 call native_init -- jni 的 function。
Disable 時,執行的是:
private void handleDisable() {
if (DEBUG) Log.d(TAG, "handleDisable");
if (!mEnabled) return;
mEnabled = false;
stopNavigating();
// do this before releasing wakelock
native_cleanup();
也就是 call native_cleanup()
這兩個 native function 分別是:
static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj)
{
const GpsInterface* interface = GetGpsInterface(env, obj);
就是 GetGpsInterface( ),沒有 call Open( )..所以在 GetGpsInterface( ) 就要 open ..
然後 cleanup 是..
static void android_location_GpsLocationProvider_cleanup(JNIEnv* env, jobject obj)
{
const GpsInterface* interface = GetGpsInterface(env, obj);
if (interface)
interface->cleanup();
}
所以知道這是一個類似 Sigletone 的 code,每次 call interface api 時,都要由 GetGpsInterface( ) 取得 handle 後,再判斷是否OK, 再 call ref function。
static const GpsInterface* sGpsInterface = NULL;
static const GpsInterface* GetGpsInterface(JNIEnv* env, jobject obj) {
// this must be set before calling into the HAL library
if (!sGpsInterface) {
sGpsInterface = get_gps_interface();
if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0) {
sGpsInterface = NULL;
return NULL;
}
}
return sGpsInterface;
}
GetGpsInterface function 其實是確保在第一次 new interface 時,會 call init( )
簡單的說,
- Enable -- init
- Disable -- cleanup
所以只要在 這兩個 native function 上實做 open, cloase com port 就可以
.. 但是看起來..又像是 start, stop.
這兩個分別對應到 startNavigating(), stopNavigating().
應該是作在 start(), stop()
沒有留言:
張貼留言