Android:如何在清单中注册被动LocationListener?

Android:如何在清单中注册被动LocationListener?,android,gps,locationlistener,Android,Gps,Locationlistener,我需要使用AdnRoid接收gps位置修正,但我不希望设备在活动代码中明确注册LocationListener等等。。。i、 我想直接在清单文件中注册LocationListener 不幸的是,这不起作用:(这是我的代码: <uses-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <receiv

我需要使用AdnRoid接收gps位置修正,但我不希望设备在活动代码中明确注册LocationListener等等。。。i、 我想直接在清单文件中注册LocationListener

不幸的是,这不起作用:(这是我的代码:

<uses-sdk android:minSdkVersion="8" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<receiver android:name=".GPSLocationListener" android:enabled="true">
    <intent-filter>
        <action android:name="android.location.LocationManager.KEY_LOCATION_CHANGED" />
    </intent-filter>
</receiver>
但无论我做什么,我都不会让模拟器捕捉我通过DDMS推送的新(模拟)位置…:(


有人知道如何使其工作吗?

位置管理器不会广播位置更新。您必须以编程方式请求位置更新

除了清单中的receiver声明是针对
BroadcastReceiver
,您的
LocationListener
不是
BroadcastReceiver
。这意味着如果有人发送与您的筛选器匹配的braodcast,则当类加载器尝试实例化
BroadcastReceiver
时,您将得到类型不匹配>.

看一看a。Reto Meier解释了如何通过PendingEvent将服务注册为被动位置更新的接收器

重要的一点是不要使用接收侦听器对象的requestLocation更新方法,而是使用接收的方法。这样,即使在收到gps定位或网络位置时所有活动都已完成,也会触发PendingEvent并启动服务。

Reto Meier使用android.intent.action.BOOT_的广播接收器检查应用程序是否应在后台进行位置更新,然后使用PendingEvent请求位置更新。

尝试向LocationManager注册挂起的意图。requestLocationUpdates()方法:


另外,声明接收“唯一广播消息”的接收器。

如果要使用库,请检查此项。它使用被动位置提供程序,并为每个广播接收器提供。非常易于使用


所以没有办法“睡觉”应用程序,它不经常在后台运行,但在每次接收到位置修复时都会触发一些功能。您可以考虑使用后台服务,它请求位置更新,然后以一些有用的方式作出反应。不需要为此打开一个活动。但是请确保您的DE。当用户未通过设置WakeLock与设备进行交互时,vice的CPU未关闭。这正是我不想这样做的方式!我想侦听自己未请求的位置更新。更准确地说,每次,用户(或其他应用程序)激活gps并请求定位,我希望我的应用程序变为活动状态,并以某种方式对此做出反应。在其他时候,我希望我的应用程序保持被动状态,或者更好:完全不活动。因此:唤醒锁定不是一个选项。后台服务可能会做到这一点,但这需要一些努力才能使其保持运行,等等。这就是您是否有办法捕捉到一个意图,告诉我gps功能已激活?在这种情况下,我可以监听该意图以进行广播,并在广播接收器中注册被动定位侦听器…如果gps被激活,您可以注册GpsStatusListener以接收事件。但是,它与locati具有相同的限制在listener上。您还可以使用AlarmManager定期检查GPS是否打开,并启动注册LocationListener的服务。也许我不太了解被动定位提供商的原理。我希望这能让我找到注册被动定位提供商的方法,然后被动地等待其他应用程序检索位置更新…现在我正尝试这样做:我有一个远程服务,它再次注册被动位置侦听器。不幸的是,从未调用onLocationChanged:(阅读我文章中链接的博客文章,这里解释了所有内容。注册侦听器对象的问题是,你的应用程序需要保持活动状态才能使侦听器工作。我猜你的服务在侦听器注册后会自动终止,然后java垃圾回收会声明侦听器。如果你注册一个挂起的意图,位置管理器将在新位置可用时启动您的服务。
public class GPSLocationListener implements LocationListener
{
    public void onLocationChanged(Location location)
    {
        Log.d(Config.LOGTAG, "GPSLocationListener.java: GPS LOCATION UPDATE CAUGHT");
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}
    public void onProviderEnabled(String provider) {}
    public void onProviderDisabled(String provider) {}
}
LocationManager mgr = (LocationManager) getSystemService(LOCATION_SERVICE);
Intent intent = new Intent("Unique_Broadcast_Message");       
PendingIntent launchIntent = PendingIntent.getBroadcast(your activity, 0, intent, 0);
mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, launchIntent);