我在android应用程序中使用Gimbal SDK实现地理围栏功能。他们提供的示例代码让我大吃一惊。示例代码如下软件包com.gimbal.hello_imbal_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();
}
}
他们的示例App github链接。
现在他们的位置事件监听器实现让我大吃一惊。我期待着一个悬而未决的服务意向或某种收听这些地方事件的意向广播,因为大多数这样的图书馆过去都会通知申请。这对显而易见来说很好。因为即使应用程序处于终止状态,也应该触发此类事件。但在这里,PlaceEventListener只是一个抽象类,我们正在使用新的Operator创建它的实例,并提供抽象方法的不完整功能。
因此,当我的活动将被销毁时,他们的SDK无法在onVisitStart()和PlaceEventListener()方法中进行回调,因为PlaceEventListener实例应该被销毁或为null。
我关心的是
- Gimabl SDK防止从垃圾收集器仅用于保存placeEventListner
实例引用?如果是这样的话,我认为这是一个糟糕的设计,因为如果我们可以从这么多活动中使用新的placeEventListner,所有这些都会阻止GC - 此外,运行后台服务只是为了监听这些事件我觉得不太好。他们的SDK应该让我的android应用程序的某些组件诞生(例如通过广播启动某些服务或调用广播接收器地点事件)
*编辑:一种可能的方法是在Android应用程序的Application类中实现侦听器接口,但由于其他一些原因,我试图避免它。那么,我想在哪里实现它呢?
为什么不将侦听器直接放入服务中,并在看到传入事件时通知"活动"?