Gimbal PlaceEventListener Api удобство использования, когда приложение находится в фоновом режиме?

Я использую Gimbal SDK для функциональности геозоны в моем приложении для Android. Приведенный ими пример кода меня удивляет. Пример кода приведен ниже. Package com.gimbal.hello_gimbal_android;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.gimbal.android.CommunicationManager;
import com.gimbal.android.Gimbal;
import com.gimbal.android.PlaceEventListener;
import com.gimbal.android.PlaceManager;
import com.gimbal.android.Visit;


public class MainActivity extends ActionBarActivity {

    private PlaceManager placeManager;
    private PlaceEventListener placeEventListener;
    private ArrayAdapter<String> listAdapter;
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1);
        listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(listAdapter);

        listAdapter.add("Setting Gimbal API Key");
        listAdapter.notifyDataSetChanged();
        Gimbal.setApiKey(this.getApplication(), "YOUR_API_KEY_HERE");

        placeEventListener = new PlaceEventListener() {
            @Override
            public void onVisitStart(Visit visit) {
                listAdapter.add(String.format("Start Visit for %s", visit.getPlace().getName()));
                listAdapter.notifyDataSetChanged();
            }

            @Override
            public void onVisitEnd(Visit visit) {
                listAdapter.add(String.format("End Visit for %s", visit.getPlace().getName()));
                listAdapter.notifyDataSetChanged();
            }
        };

        placeManager = PlaceManager.getInstance();
        placeManager.addListener(placeEventListener);
        placeManager.startMonitoring();

        CommunicationManager.getInstance().startReceivingCommunications();
    }

}

Их пример приложения GitHub ссылку.

Теперь их реализация слушателя событий места делает меня удивлением. Я ожидаю ожидаемого намерения на обслуживание или какой-либо передачи намерения прослушать эти события места, так как большинство таких библиотек используются для уведомления приложения. Что хорошо для очевидного. Потому что такие события должны запускаться, даже если приложение находится в отключенном состоянии. Но здесь PlaceEventListener - это просто абстрактный класс, и мы создаем его экземпляр, используя новый оператор и предоставляя неполную функциональность абстрактных методов.

Поэтому, когда моя деятельность будет уничтожена, их SDK не предполагает возможность обратного вызова в методах onVisitStart() и PlaceEventListener (), так как экземпляр placeEventListener должен быть уничтожен или равен нулю.

Мое беспокойство

  1. Gimabl SDK предотвращает уничтожение экземпляра основного класса активности из сборщика мусора только для хранения placeEventListner
    ссылка на экземпляр? Если это так, я думаю, что это плохой дизайн, так как если мы можем использовать новый placeEventListner из очень многих действий, и все это помешает GC.
  2. Также запуск фонового сервиса только для прослушивания этих событий не кажется мне подходящим. Их SDK должен заставить какой-то компонент моего приложения для Android родиться (например, запустить какую-либо службу или вызвать приемник вещания, передавая событие места).

* Редактировать: один из возможных способов - реализовать интерфейс слушателя в классе приложений приложения Android, но я пытаюсь избежать этого по ряду других причин. Итак, где я должен это реализовать?

1 ответ

Почему бы вам не поместить слушателя непосредственно в Службу и не уведомлять свою Активность, когда она становится видимой о входящих событиях?

Другие вопросы по тегам