在Android上的后台运行GPS监听器

时间:2011-09-12 11:42:31

标签: android service gps

我想知道当Android应用在后台时如何接收GPS。是否有完整的教程来解释它?

4 个答案:

答案 0 :(得分:5)

您需要使用AlarmManager激活待处理的意图(通过广播接收器)以启动后台服务。

一些示例代码

在您的MainActivity中

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent notifyintent = new Intent(this, OnAlarmReceiver.class);
notifyintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
notifyintent.setAction("android.intent.action.NOTIFY");
PendingIntent notifysender = PendingIntent.getBroadcast(this, 0, notifyintent,
        PendingIntent.FLAG_UPDATE_CURRENT);
am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 20 * 1000,
        notifysender);

AlarmReceiver类

public class OnAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    // PullPendingRequests.acquireStaticLock(context)
    try {
        lock = getLock(context);
        lock.acquire();
        context.startService(new Intent(context, UpdateCustomerRequests.class));
    } finally {
        if (lock.isHeld()) {
            lock.release();
        }
    }
}

BroadcastReceiver

private static final String NAME = "com.commonsware.cwac.wakeful.WakefulIntentService";
private static volatile PowerManager.WakeLock lockStatic = null;
private static PowerManager.WakeLock lock;

// Needed since network will to work when device is sleeping.
synchronized private static PowerManager.WakeLock getLock(Context context) {
    if (lockStatic == null) {
        PowerManager mgr = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

        lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, NAME);
        lockStatic.setReferenceCounted(true);
    }

    return (lockStatic);
  }
}

后台服务。在这里你会注意到2个要点

  1. WakeLock,以确保您的设备唤醒并在后台使用网络
  2. 使用LocationManager进行工作。我不得不调试这个约2周,相信我,你需要这个。 requestLocationUpdates和getLastKnownLocation将不会在您需要时提供您的位置。因此AlarmManager(运行得比java TimerTask好得多)。
  3. 所有这些都适用于Play商店的制作应用。

    public class UpdateCustomerRequests extends IntentService implements LocationListener {
    private static Context mainContext;
    
    public UpdateCustomerRequests() {
        super("UpdateCustomerRequests");
        mHandler = new Handler();
        me = this;
    }
    
    public static UpdateCustomerRequests getService() {
        if (me == null)
            me = new UpdateCustomerRequests();
        return me;
    }
    
    @Override
    final protected void onHandleIntent(Intent intent) {
        mainContext = getApplicationContext();
        Location myLocation;
    
        if (HomeScreen.getLocationManager() != null) {
            // this is needed to trigger a background location change. Since LocationManager does not work on Samsung phones. Its a hack needed.
            HomeScreen.getLocationManager().requestLocationUpdates(
                    LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
                    @Override
                    public void onStatusChanged(String provider, int status, Bundle extras) {
                    }
                    @Override
                    public void onProviderEnabled(String provider) {
                    }
                        @Override
                    public void onProviderDisabled(String provider) {
                    }
                    @Override
                    public void onLocationChanged(final Location location) {
                }
            });
            myLocation = HomeScreen.getLocationManager().getLastKnownLocation(
                    LocationManager.NETWORK_PROVIDER);
            if (myLocation != null)
                onLocationChanged(myLocation);
            else {
                God.notifications.setSpeedNotification();
            }
        } else
            Log.e("Taxeeta:PullPendingRequets", "Not activated");
    
    }
    
    @Override
    public void onLocationChanged(final Location location) {
        // Do your background stuff
    }
    
    }
    

    最后,不要忘记你的明显事物。

     <service
            android:name="com.taxeeta.UpdateCustomerRequests"
            android:enabled="true"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Light.NoTitleBar" />
    
        <receiver
            android:name="com.taxeeta.support.OnAlarmReceiver"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.NOTIFY" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="com.taxeeta.HomeScreen$ResponseReceiver"
            android:exported="true" >
            <intent-filter>
                <action android:name="com.taxeeta.intent.action.GET_SCREEN_UPDATES" />
            </intent-filter>
        </receiver>
    

答案 1 :(得分:1)

您需要使用服务概念而不是活动。 http://developer.android.com/guide/components/services.html

这是一个很好的样本: Background service needs to send GPS location on server

答案 2 :(得分:0)

您可以使用始终在后台运行的服务。在后台服务中,您可以获得当前的纬度和经度,并且您可以使用Android地理编码器类将这些lats和longs进一步转换为正确的位置... 检查以下链接:

http://www.codeproject.com/KB/android/GPSLocator.aspx

答案 3 :(得分:0)

你将在Activity中做的事情也可以在服务的onStart()中服务....