如何捕捉一次GPS广播?

时间:2015-06-29 18:48:07

标签: android broadcastreceiver

我上网了,但我找不到解决问题的方法。

在我的Android应用程序中,每次用户关闭gps时,我都必须捕获并向服务器发送通知。这时我已经写了这段代码

在Android中最明显:

    <receiver android:name="proguide.prosegur.scr.BL.receivers.GPSStatusBroadcastReceiver">
        <intent-filter>
            <action android:name="android.location.PROVIDERS_CHANGED" />
        </intent-filter>
    </receiver>

在GPSStatusBroadcastReceiver类中:

public class GPSStatusBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context arg0, Intent arg1) {
    if (arg1.getAction().matches("android.location.PROVIDERS_CHANGED")) {
        // here I have to send the notification
    }
}

问题在于,每次用户放下GPS时,我都会使用相同的Context和Intent参数调用此函数两次(我一次只能发送1个通知)。

重要提示:它必须在API级别8下工作。

那么,为什么会发生两次?我能做什么(做得对,而不是弄乱代码)一次只发送1个通知?谢谢,抱歉我的英文。

2 个答案:

答案 0 :(得分:2)

试试这个:

Executors#newCachedThreadPool()

此外,您应该使用Android提供的变量public class GpsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) { final String action = intent.getAction(); if (action.equals(LocationManager.PROVIDERS_CHANGED_ACTION)) { // GPS is switched off. if (!context.getSystemService(Context.LOCATION_SERVICE).isProviderEnabled(LocationManager.GPS_PROVIDER)) { // Do something. } } } } } ,而不是硬编码"android.location.PROVIDERS_CHANGED"

不是在LocationManager.PROVIDERS_CHANGED_ACTION文件中设置GPS接收器,而是通过AndroidManifest.xml注册GPS接收器,如下所示:

Service

答案 1 :(得分:0)

您可以使用共享首选项和线程来避免此问题 但这不是克服这个问题的正确方法

我的方法如下

 @Override
    public void onReceive(Context context, Intent intent) {

boolean flage=MainActivity.getpreference();

if(!flage){
    MainActivity.putPreferens(true);
    Log.e("gpssss","gpssss");

    Thread thread = new Thread() {
        @Override
        public void run() {
            try {




                    sleep(2000);

                    MainActivity.putPreferens(false);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    thread.start();


     }}

}

到主类我创建一个共享首选项并存储布尔值false  广播演员将工作一次。