我是Android开发的新手,我正在尝试了解地理围栏。我相信我的意图服务正常工作,我可以注册我的地理围栏,理论上接收服务的过渡;但是,我有兴趣从意图服务中获取数据并将其发送回MainActivity.class
,以便可以利用它来执行某些任务。我看到很多创建通知的示例,但我不想要通知,而是简单地将转换类型和触发地理围栏传递回MainActivity类。
我的GeofenceTransitionsIntentService.class位于下面,我假设我需要实现某种方式将结果发送回主类,我假设主类需要某种监听器来接收这些结果
public class GeofenceTransitionsIntentService extends IntentService implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks {
private GoogleApiClient myGoogleApiClient;
public GeofenceTransitionsIntentService(){
super(GeofenceTransitionsIntentService.class.getSimpleName());
}
@Override
public void onCreate(){
super.onCreate();
myGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
@Override
protected void onHandleIntent(Intent intent) {
GeofencingEvent geoFenceEvent = GeofencingEvent.fromIntent(intent);
if (geoFenceEvent.hasError()){
int errorcode = geoFenceEvent.getErrorCode();
Log.e("GeofencingApp", "ERROR: " + errorcode);
} else {
int transitionType = geoFenceEvent.getGeofenceTransition();
if (Geofence.GEOFENCE_TRANSITION_ENTER == transitionType){
myGoogleApiClient.blockingConnect(100, TimeUnit.MILLISECONDS);
String triggeredGeofenceID = geoFenceEvent.getTriggeringGeofences().get(0).getRequestId();
} else if (Geofence.GEOFENCE_TRANSITION_EXIT == transitionType) {
myGoogleApiClient.blockingConnect(100, TimeUnit.MILLISECONDS);
String triggeredGeofenceID = geoFenceEvent.getTriggeringGeofences().get(0).getRequestId();
Toast.makeText(getApplicationContext(), "EXIT: " + triggeredGeofenceID, Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
}
答案 0 :(得分:0)
我认为你可以使用Intent和putExtra
startService(new Intent(this,MainActivity.class).putExtra("Key","Data));
或CallBack模式查看此答案
答案 1 :(得分:0)
我想出了如何成功而简单地完成任务。
我已经为GeofenceTransitionService提供的代码很好,MainActivity的代码很好。
在MainActivity中,向类中添加一个变量,如下所示:
R
然后在MainActivity类中创建两个函数:
private static MainActivity ins;
这样做是为GeofenceTransitionService提供一个公共方法来调用并获取返回给它的MainActivity,然后在MainActivity上执行你想要的任何方法。如果您没有运行runOnUiThread,则会在运行时收到错误消息,表明您不允许与其他线程的视图进行交互。
虽然此处未显示,但您可以轻松地从GeofenceTransitionsIntentService添加信息,并通过将变量放在updateMethod中传递给MainActivity ...例如:
public static MainActivity getInstance(){
return ins;
}
public void updateMethod(){
MainActivity.this.runOnUiThread(new Runnable() {
public void run(){
//Do what you want to do on the MainActivity here
}
});
}
此外,您可以轻松创建多个方法来执行可从意向服务访问的各种任务。
在意向服务方面,代码也很简单:
public void updateMethod(final Boolean didEnter){
// insert the above code here to run on the UI thread
}
我希望这有助于人们制作更强大的地理围栏应用程序。我注意到几乎所有的样本都集中在发送通知上,而且还有很多可以做的事情。