1

我正在尝试根据用户的活动接收位置,即,如果用户仍然是位置更新频率较低,如果他是步行或驾驶更新更快。我编写了一个服务来接收位置更新,并在方法中放置了一个广播接收器,该onCreate()方法接收从主要活动广播的意图。这些广播的意图带有告诉我的广播接收器用户的“活动”的字符串。但是这个接收器永远不会收到意图,所以我无法设置locationRequest时间,据此我会将适当的传递locationRequest给服务。

任何人都可以告诉和帮助为什么onCreate服务中的广播接收器可能不会被调用。谢谢。

public class MyActivityRecognition extends Activity implements
        GooglePlayServicesClient.ConnectionCallbacks,
        GooglePlayServicesClient.OnConnectionFailedListener {

    private ActivityRecognitionClient arclient;
    private PendingIntent pIntent;
    private BroadcastReceiver receiver;
    private TextView tvActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvActivity = (TextView) findViewById(R.id.tvActivity);

        int resp = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (resp == ConnectionResult.SUCCESS) {
            arclient = new ActivityRecognitionClient(this, this, this);
            arclient.connect();

        } else {
            Toast.makeText(this, "Please install Google Play Service.",
                    Toast.LENGTH_SHORT).show();
        }

        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String u = intent.getStringExtra("Activity");
                String v = "Activity :" + intent.getStringExtra("Activity")
                        + " " + "Confidence : "
                        + intent.getExtras().getInt("Confidence") + "\n";
                tvActivity.setText(v);


                Intent activityIntent = new Intent();
                intent.setAction("com.example.useractivity");
                intent.putExtra("ACTIVITY", u);
                sendBroadcast(activityIntent);
            }
        };

服务等级如下:

public class LocationService extends Service implements
        GooglePlayServicesClient.ConnectionCallbacks,
        GooglePlayServicesClient.OnConnectionFailedListener, LocationListener {

    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;

    private static final int MILLISECONDS_PER_SECOND = 1000;

    private static final int FASTEST_INTERVAL_IN_SECONDS = 5;

    private static final long FASTEST_INTERVAL = MILLISECONDS_PER_SECOND
            * FASTEST_INTERVAL_IN_SECONDS;


    LocationRequest mLocationRequest;
    LocationClient mLocationClient;
    boolean mUpdatesRequested;
    String mActivity="Still";
    private BroadcastReceiver myReceiver;

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

        myReceiver = new BroadcastReceiver() {

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

                String action = intent.getAction();
                if(action.equals("com.example.useractivity")){
                    mActivity = intent.getExtras().getString("ACTIVITY");

                }

            }
        };

        IntentFilter filter = new IntentFilter();
        filter.addAction("com.example.useractivity");
        registerReceiver(myReceiver, filter);

        mLocationRequest = LocationRequest.create();
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        if (mActivity.equalsIgnoreCase("Still")
                || mActivity.equalsIgnoreCase("Tilting")
                || mActivity.equalsIgnoreCase("Unknown")) {
            mLocationRequest.setInterval(30*1000);

        } else if (mActivity.equalsIgnoreCase("On Foot")
                || mActivity.equalsIgnoreCase("On Bicycle")) {
            mLocationRequest.setInterval(20*1000);

        } else if (mActivity.equalsIgnoreCase("In Vehicle")) {
            mLocationRequest.setInterval(10*1000);

        }
        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);

        mLocationClient = new LocationClient(getApplicationContext(), this, this);
        mUpdatesRequested = true;

        mLocationClient.connect();
    }

    @Override
    public void onLocationChanged(Location location) {

        String latitude = Double.toString(location.getLatitude());
        String longitude = Double.toString(location.getLongitude());

        String msg = "Updated Location: " + latitude + "," + longitude;
        Toast.makeText(getApplicationContext(), msg,
                Toast.LENGTH_SHORT).show();
        System.out.println(Double.toString(location.getLatitude()) + ","
                        + Double.toString(location.getLongitude()));

        SaveData sd = new SaveData(getApplicationContext());
        sd.save(mActivity, latitude, longitude);
    }

    @Override
    public void onConnected(Bundle arg0) {
        if (mUpdatesRequested) {

            mLocationClient.requestLocationUpdates(mLocationRequest, this);

        }
    }
4

1 回答 1

2

我知道我这个问题很晚了,但我想我还是会回答。

在 MyActivityRecognition 中,您似乎正在使用传递给 onReceive 的“intent”变量,我认为您希望在其中设置动作和额外的 activityIntent。见下文。

Intent activityIntent = new Intent();
intent.setAction("com.example.useractivity");
intent.putExtra("ACTIVITY", u);
sendBroadcast(activityIntent);

也许你的意思是:

Intent activityIntent = new Intent();
activityIntent.setAction("com.example.useractivity");
activityIntent.putExtra("ACTIVITY", u);
sendBroadcast(activityIntent);

通过不使用 activityIntent,您的服务将不会收到额外的操作,因此不会执行您希望它执行的操作。

我希望这会有所帮助,谢谢 :) (这是我的第一次尝试回答,如果是,请将其标记为正确。)

于 2014-01-09T17:07:27.863 回答