从GeofenceTransitionsIntentService实现ResultCallback到MainActivity

时间:2017-03-24 19:53:38

标签: android

我是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) {

}
}

2 个答案:

答案 0 :(得分:0)

我认为你可以使用Intent和putExtra

startService(new Intent(this,MainActivity.class).putExtra("Key","Data));

或CallBack模式查看此答案

What is callback in Android?

答案 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
}

我希望这有助于人们制作更强大的地理围栏应用程序。我注意到几乎所有的样本都集中在发送通知上,而且还有很多可以做的事情。