【问题标题】:Updating Activity with Latitude/Longitude values returned from a Service使用服务返回的纬度/经度值更新活动
【发布时间】:2013-07-17 00:50:56
【问题描述】:

我正在尝试编写一个简单的应用程序,用服务返回的 Lat/Lng 值更新 MainActivity。但它总是返回空值。我已添加权限并将 TheService.java 作为服务添加到 AndroidManifest.xml 文件中...请告诉我哪里出错了。

MainActivity.java

public class MainActivity extends Activity {

TextView tv1, tv2;
IntentFilter filter;
receive rec;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv1 =(TextView)findViewById(R.id.textView1);
    tv2 = (TextView)findViewById(R.id.textView2);
    filter = new IntentFilter("Updated");
    rec = new receive();
    Intent gps_int = new Intent(this,TheService.class);
    startService(gps_int);      

}

@Override
public void onPause()
{
    super.onPause();
    unregisterReceiver(rec);
}

@Override
public void onResume()
{
    super.onResume();
    rec = new receive();
    registerReceiver(rec, filter);      
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public class receive extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        tv1.setText(intent.getExtras().getString("lat"));
        tv2.setText(intent.getExtras().getString("lon"));
        Toast.makeText(getApplicationContext(), "Toast Executed", Toast.LENGTH_SHORT).show();
        Toast.makeText(getApplicationContext(), "BR Latitude "+intent.getExtras().getString("lat"),Toast.LENGTH_SHORT).show();
    }

}}

TheService.java

public class TheService extends Service implements LocationListener {
LocationManager lm;
Location loc;
double lat = 0;
double lon = 0;
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    lm=(LocationManager)getSystemService(LOCATION_SERVICE);
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
    loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    onLocationChanged(loc);
     return START_STICKY;
}
@Override
public void onCreate()
{


}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    updateui(location);
}

private void updateui(Location location) {
    // TODO Auto-generated method stub
    lat = location.getLatitude();
    lon = location.getLongitude();
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Intent gps_intent = new Intent("Updated");
    gps_intent.putExtra("lat", lat);
    gps_intent.putExtra("lon", lon);
    sendBroadcast(gps_intent);
}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}}

【问题讨论】:

  • 在这里查看我的答案是否有帮助。 stackoverflow.com/questions/17669546/…
  • 我看到的是您正在启动服务并立即返回最后一个已知位置。我不确定,但看起来您的服务正在尝试发送广播,甚至在您的活动中的 onResume 被调用之前,所以基本上看起来您的接收器在广播时没有注册。不过不确定。尝试添加日志以查看首先发生的情况。

标签: android service gps android-activity locationlistener


【解决方案1】:
  1. 您应该使用Google Play Services 作为位置,这样更容易处理。
  2. 您还需要服务做什么?在你的 Activity 中有一个位置监听器是完全没问题的。
  3. 如果您想继续使用该服务,则可以通过 bind 将 Activity 发送给它,而不是使用广播。

【讨论】:

  • 4.您可以使用Handler-Messenger 将数据从您的Serivce 发送回Activity
  • 我从服务获取活动更新,但没有获取服务中的位置更新。请提供示例代码以通过服务获取位置更新。
  • 查看上面的 Google Play 服务链接或在此处查看 Android 培训developer.android.com/training/location/index.html 您将从那里获得所需的所有信息。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2012-08-31
  • 2016-09-03
  • 2011-03-11
  • 1970-01-01
  • 2012-12-30
  • 2014-08-25
  • 1970-01-01
相关资源
最近更新 更多