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 должен быть уничтожен или равен нулю.
Мое беспокойство
- Gimabl SDK предотвращает уничтожение экземпляра основного класса активности из сборщика мусора только для хранения placeEventListner
ссылка на экземпляр? Если это так, я думаю, что это плохой дизайн, так как если мы можем использовать новый placeEventListner из очень многих действий, и все это помешает GC. - Также запуск фонового сервиса только для прослушивания этих событий не кажется мне подходящим. Их SDK должен заставить какой-то компонент моего приложения для Android родиться (например, запустить какую-либо службу или вызвать приемник вещания, передавая событие места).
* Редактировать: один из возможных способов - реализовать интерфейс слушателя в классе приложений приложения Android, но я пытаюсь избежать этого по ряду других причин. Итак, где я должен это реализовать?
1 ответ
Почему бы вам не поместить слушателя непосредственно в Службу и не уведомлять свою Активность, когда она становится видимой о входящих событиях?