簡體   English   中英

片段BroadCast接收器不起作用

[英]Fragment BroadCast receiver not working

我正在制作一個需要從片段上的服務獲取恆定位置更新的應用程序,問題是片段沒有獲取更新,我不確定是什么問題,這是服務:

public class GPService extends Service
{
 private LocationManager locMan;
 private Boolean locationChanged;
 private Handler handler = new Handler();
 static final int REQUEST_LOCATION = 1;

public static Location curLocation;
public static boolean isService = true;
public LocalBroadcastManager broadcast;


LocationListener gpsListener = new LocationListener() {
    public void onLocationChanged(Location location) {
        if (curLocation == null) {
            curLocation = location;
            locationChanged = true;
            Intent intent= new Intent("GPSLocationUpdates");
            intent.putExtra("latitud",curLocation.getLatitude());
            intent.putExtra("latitud",curLocation.getLongitude());
            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

        }else if (curLocation.getLatitude() == location.getLatitude() && curLocation.getLongitude() == location.getLongitude()){
            locationChanged = false;
            return;
        }else
            locationChanged = true;

        curLocation = location;

        if (locationChanged)
            locMan.removeUpdates(gpsListener);

    }
    public void onProviderDisabled(String provider) {
    }

    public void onProviderEnabled(String provider) {
    }

    public void onStatusChanged(String provider, int status,Bundle extras) {

    }

};

@Override
public void onCreate() {
    super.onCreate();

    curLocation = getBestLocation();

    if (curLocation == null)
        Toast.makeText(getBaseContext(),"Unable to get your location", Toast.LENGTH_SHORT).show();
    else{
        //Toast.makeText(getBaseContext(), curLocation.toString(), Toast.LENGTH_LONG).show();
    }

    isService =  true;
    broadcast= LocalBroadcastManager.getInstance(this);

}
final String TAG="LocationService";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return super.onStartCommand(intent, flags, startId);
}
@Override
public void onLowMemory() {
    super.onLowMemory();
}

@Override
public void onStart(Intent i, int startId){
    handler.postDelayed(GpsFinder,1);
}

@Override
public void onDestroy() {
    handler.removeCallbacks(GpsFinder);
    handler = null;
    Toast.makeText(this, "Stop services", Toast.LENGTH_SHORT).show();
    isService = false;
}

public IBinder onBind(Intent arg0) {
    return null;
}

public Runnable GpsFinder = new Runnable(){
    public void run(){

        Location tempLoc = getBestLocation();
        if(tempLoc!=null)
            curLocation = tempLoc;
        tempLoc = null;
        handler.postDelayed(GpsFinder,1000);
    }
};

private Location getBestLocation() {
    Location gpslocation = null;
    Location networkLocation = null;

    if(locMan==null){
        locMan = (LocationManager) getApplicationContext() .getSystemService(Context.LOCATION_SERVICE);
    }
    try {
        if ( ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION)
                        != PackageManager.PERMISSION_GRANTED) {

            //ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION);
        }
        else {
            if(locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)){


                locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 1, gpsListener);
                gpslocation = locMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                Intent intent= new Intent("GPSLocationUpdates");
                intent.putExtra("latitud",gpslocation.getLatitude());
                intent.putExtra("longitud",gpslocation.getLongitude());
                Log.wtf("COORDENATES TO SEND",gpslocation.getLatitude()+" "+gpslocation.getLongitude());
                LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

            }
            if(locMan.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
                locMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1000, 1, gpsListener);
                networkLocation = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                Intent intent= new Intent("GPSLocationUpdates");
                Log.wtf("LAS COORDENADAS a enviar SON",networkLocation.getLatitude()+" "+networkLocation.getLongitude());

                intent.putExtra("latitud",networkLocation.getLatitude());
                intent.putExtra("longitud",networkLocation.getLongitude());
                LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
            }
        }

在這樣的活動中啟動服務

 startService(new Intent(this, GPService.class));

在片段中,這就是我創建和注冊它的方式

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    receiver= new GPSReceiver();
    //this.getActivity().registerReceiver(receiver, new IntentFilter());

    db=Database.getInstance(this.getContext());


}
@Override
public void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter("GPSLocationUpdates");
    getActivity().registerReceiver(receiver,filter);
}

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

最后,這是Fragment中的接收者,我無法從服務中獲取信息,有什么想法嗎? 我不知道我在做什么錯。

private class GPSReceiver extends BroadcastReceiver {


    private LatLng changed;

    public GPSReceiver()
    {
        changed= new LatLng(0,0);
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.wtf("RECIEVE", "IT IS IN BROADCAST");
        if (intent.getAction().equals("GPSLocationUpdates"))
        {
            Log.wtf("RECIEVE1", "INTENT ARRIVES");
            double lat= intent.getDoubleExtra("latitud",1);
            double longi= intent.getDoubleExtra("longitud",1);
            changed= new LatLng(lat,longi);

        }
       // String text = intent.getStringExtra("position");

    }
    public LatLng getChanged()
    {
        return changed;
    }
}

該服務似乎運行良好,我可以看到正在發送的控制台中的坐標。

您沒有將BroadcastReceiver注冊到LocalBroadcastManager。 您正在將其注冊到全局廣播管理器,但在本地發送。

更改:

@Override
public void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter("GPSLocationUpdates");
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver,filter);
}

@Override
public void onPause() {
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(receiver);
    super.onPause();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM