在android中以固定的时间间隔启动我的位置活动

时间:2012-09-06 12:35:33

标签: android android-activity broadcastreceiver alarmmanager

public class LocUpdator extends Activity implements LocationListener {

 private TextView latituteField;
  private TextView longitudeField;
  private LocationManager locationManager;
  private LocationManager service;
  private String provider;


/** Called when the activity is first created. */

  @Override
  public void onStart() {
    super.onStart();
    //setContentView(R.layout.main);


    // Get the location manager
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    // Define the criteria how to select the locatioin provider -> use
    // default
    service = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean enabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER);

            // Check if enabled and if not send user to the GSP settings
            // Better solution would be to display a dialog and suggesting to 
            // go to the settings
            if (!enabled) {
              Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
              startActivity(intent);
            } 
    Criteria criteria = new Criteria();
    //criteria.setAccuracy(Criteria.ACCURACY_FINE);
    //criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
    provider = locationManager.getBestProvider(criteria,true);
    Location location = locationManager.getLastKnownLocation(provider);

    // Initialize the location fields
    if (location != null) {
      System.out.println("Provider " + provider + " has been selected.");
      Toast.makeText(this, "Provider " + provider + " has been selected." ,Toast.LENGTH_SHORT).show();
      onLocationChanged(location);
    } else {
      latituteField.setText("Is GPS ON ?");
      longitudeField.setText("Sorry! No GPS");
    }
  }

  /* Request updates at startup */
  @Override
  protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(provider, 400, 1, this);
  }

  /* Remove the locationlistener updates when Activity is paused */
  @Override
  protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
  }

  @Override
  public void onLocationChanged(Location location) {
    double lat = (double) (location.getLatitude());
    double lng = (double) (location.getLongitude());
    //Http Post method to send data to srver Php document
    Toast.makeText(this, "Transfered location: "+lat+" "+lng ,Toast.LENGTH_SHORT).show();
    Toast.makeText(this, "Currently using " + provider + " technology." ,Toast.LENGTH_SHORT).show();
    //latituteField.setText(String.valueOf(lat));
    //longitudeField.setText(String.valueOf(lng));
  }

  @Override
  public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub
      Toast.makeText(this, "Location Change Notification !!" ,Toast.LENGTH_SHORT).show();


  }

  @Override
  public void onProviderEnabled(String provider) {
    Toast.makeText(this, "Enabled new provider " + provider,
        Toast.LENGTH_SHORT).show();

  }

  @Override
  public void onProviderDisabled(String provider) {
    Toast.makeText(this, "Disabled provider " + provider,
        Toast.LENGTH_SHORT).show();
  }
} 

我希望我的这个活动以固定的时间间隔启动,我尝试了Alarm Manager和BroadcastReciever但是...我找不到任何方法从广播接收器开始这个...

public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    //Toast.makeText(context, "Location Cordinates Updating!!!!.",Toast.LENGTH_LONG).show();

    Toast.makeText(context, "Current Location :",Toast.LENGTH_LONG).show();
    Intent startIntent = new Intent(context, LocUpdator.class);
    context.startActivity(startIntent);
    startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

以上是BroadcastReciever

AlarmActivity低于

公共类AlarmActivity扩展Activity {     /** 在第一次创建活动时调用。 * /

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

public void startAlert(View view) {
    //EditText text = (EditText) findViewById(R.id.time);
    int i = 20;//Integer.parseInt(text.getText().toString());
    //int i= 10;
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    Intent intent = new Intent(this, MyBroadcastReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            this.getApplicationContext(), 234324243, intent, 0);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ (i * 1000), pendingIntent);
    //long timerInterval= i*1000;
    //alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), timerInterval, pendingIntent); 
    //finish();  
    Toast.makeText(this, "DB Update Interval set as " + i + " seconds",
            Toast.LENGTH_LONG).show();
}

}

请在这里帮助我: - )


日志Cat错误低于

09-10 09:50:15.368: E/AndroidRuntime(671): FATAL EXCEPTION: main
09-10 09:50:15.368: E/AndroidRuntime(671): java.lang.RuntimeException: Unable to start activity ComponentInfo{twin.geolocator/twin.geolocator.insideActivity}: java.lang.IllegalArgumentException: provider==null
09-10 09:50:15.368: E/AndroidRuntime(671):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
09-10 09:50:15.368: E/AndroidRuntime(671):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
09-10 09:50:15.368: E/AndroidRuntime(671):  at android.app.ActivityThread.access$600(ActivityThread.java:130)
09-10 09:50:15.368: E/AndroidRuntime(671):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
09-10 09:50:15.368: E/AndroidRuntime(671):  at android.os.Handler.dispatchMessage(Handler.java:99)
09-10 09:50:15.368: E/AndroidRuntime(671):  at android.os.Looper.loop(Looper.java:137)
09-10 09:50:15.368: E/AndroidRuntime(671):  at android.app.ActivityThread.main(ActivityThread.java:4745)
09-10 09:50:15.368: E/AndroidRuntime(671):  at java.lang.reflect.Method.invokeNative(Native Method)
09-10 09:50:15.368: E/AndroidRuntime(671):  at java.lang.reflect.Method.invoke(Method.java:511)
09-10 09:50:15.368: E/AndroidRuntime(671):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-10 09:50:15.368: E/AndroidRuntime(671):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-10 09:50:15.368: E/AndroidRuntime(671):  at dalvik.system.NativeStart.main(Native Method)
09-10 09:50:15.368: E/AndroidRuntime(671): Caused by: java.lang.IllegalArgumentException: provider==null
09-10 09:50:15.368: E/AndroidRuntime(671):  at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1153)
09-10 09:50:15.368: E/AndroidRuntime(671):  at twin.geolocator.insideActivity.onCreate(insideActivity.java:32)
09-10 09:50:15.368: E/AndroidRuntime(671):  at android.app.Activity.performCreate(Activity.java:5008)
09-10 09:50:15.368: E/AndroidRuntime(671):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
09-10 09:50:15.368: E/AndroidRuntime(671):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
09-10 09:50:15.368: E/AndroidRuntime(671):  ... 11 more

public class insideActivity extends Activity implements LocationListener{

private LocationManager locationManager;
private String provider;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   // setContentView(R.layout.main);

    // Get the location manager
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    // Define the criteria how to select the locatioin provider -> use
    // default
    Criteria c = new Criteria();
    c.setAccuracy(Criteria.ACCURACY_FINE);
    c.setAltitudeRequired(false);
    c.setBearingRequired(false);
    c.setSpeedRequired(false);
    c.setCostAllowed(true);
    c.setPowerRequirement(Criteria.POWER_HIGH);
    provider = locationManager.getBestProvider(c,true);
    Location location = locationManager.getLastKnownLocation(provider);

    // Initialize the location fields
    if (location != null) {
      System.out.println("Provider " + provider + " has been selected.");
      onLocationChanged(location);
    } else {
      Log.d("Location not available", "inside");
      Log.d("Location not available", "inside ");
    }
    Log.d("Inside onCreate", "1");
  }


@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    Log.d("Inside onLocationChanged", "2");


}

@Override
public void onProviderDisabled(String arg2) {
    // TODO Auto-generated method stub
    Log.d("Inside onProviderDisabled", "3");

}

@Override
public void onProviderEnabled(String arg3) {
    // TODO Auto-generated method stub
    Log.d("Inside onProviderEnabled", "4");
}

@Override
public void onStatusChanged(String arg1, int status, Bundle extras) {
    // TODO Auto-generated method stub
    Log.d("onStatusChanged", "");
}

}

1 个答案:

答案 0 :(得分:0)

阅读我的评论,然后将其用于延迟...

重复任务:

new Timer().scheduleAtFixedRate(task, after, interval);

对于单次任务:

new Timer().schedule(task, after);

任务是要执行的方法 在初始执行之后 (间隔重复执行的时间)