Как я повторяю метод каждые 10 минут после нажатия кнопки и завершения ее на другой кнопке
Я пишу приложение для Android, которое извлекает текущее местоположение телефона и отправляет его также веб-серверу.
Я хочу, чтобы можно было нажать кнопку "Пуск", и приложение продолжает извлекать и отправлять местоположение в заданный интервал (скажем, каждые 10 минут), а затем останавливать его нажатием другой кнопки.
Вот код для моих кнопок:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startButton.setOnClickListener(new OnClickListener() {
@Override
//When the button is clicked
public void onClick(View v) {
finishButton.setEnabled(true);
startButton.setEnabled(false);
//Loops every 10mins
pingCurrentLocation();
}
});
finishButton.setOnClickListener(new OnClickListener() {
@Override
//When the button is clicked
public void onClick(View v) {
startButton.setEnabled(true);
finishButton.setEnabled(false);
pingCurrentLocation();
}
});
}
pingCurrentLocation - это функция, которая получает местоположение и отправляет его.
Я знаю, что использование AlarmManager, вероятно, достигнет того, чего я хочу, но я не смог понять ничего из этого. Есть ли какие-либо четкие шаги или шаблоны, которые будут работать в моей ситуации.
Ответы
Ответ 1
Создайте BroadcastReceiver
public class AlarmReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
//get and send location information
}
}
и добавьте то же самое к вашему AndroidManifest
, чтобы зарегистрировать приемник
<receiver
android:name="com.coderplus.AlarmReceiver"
android:exported="false">
</receiver>
Теперь вы можете установить повторяющийся сигнал тревоги из вашего Activity
, который будет вызывать приемник каждые 10 минут:
AlarmManager alarmManager=(AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),600000,
pendingIntent);
и для отмены будильника вызовите cancel()
на AlarmManager
, используя эквивалент PendingIntent
AlarmManager alarmManager=(AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
alarmManager.cancel(pendingIntent);
или если вы не хотите использовать AlarmManager
/BroadcastReceiver
, то что-то вроде этого поможет вам. Прежде чем идти на это, проверьте - разницу между таймером и будильником
private class MyTimerTask extends TimerTask {
@Override
public void run() {
//get and send location information
}
}
инициализируйте задачу Timer
и Timer
:
Timer myTimer = new Timer();
MyTimerTask myTimerTask= new MyTimerTask();
Остановка или запуск Timer
//to Stop
myTimer.cancel();
//to start
myTimer.scheduleAtFixedRate(myTimerTask, 0, 600000); //(timertask,delay,period)
См
http://developer.android.com/reference/java/util/TimerTask.html
http://developer.android.com/reference/java/util/Timer.html
Ответ 2
Используйте Android-TimerTask или Android-AlarmManager для отправки данных о местоположении каждые 10 минут. Посмотрите на этот вопрос SO Track Gps Каждые 10 минут с использованием таймера в android также этот Хороший способ получить местоположение пользователя в Android
TimerTask:
Класс TimerTask
представляет задачу, выполняемую в указанное время. Задача может выполняться один или несколько раз.
Ответ 3
Вот что я сделал.
сначала создал объект диспетчера аварийных сообщений и установил повторяющийся таймер
AlarmManager alarmMgr = alarmMgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = alarmIntent = new Intent("AlarmIntentReceiver");
PendingIntent pendingAlarmIntent = pendingAlarmIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, alarmIntent, 0);
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 30*1000, 3*60*1000, pendingAlarmIntent); //start in 30 secs and rest in 3 mins interval
Создал действие, основанное на этом имени намерения, которое захватит намерение и выполнит его код в указанном интервале, вы также можете создать широковещательный приемник, если хотите.
Чтобы отменить его в событии нажатия кнопки. Напишите это
alarmMgr.cancel(pendingAlarmIntent);
Ответ 4
Вы можете запустить сервис, который будет проверять местоположение пользователя и отправить его на указанный вами веб-адрес, как указано ниже.
вы можете получить дополнительную информацию об услуге здесь
public class TaxiLocationUpdator extends Service{
Location location;
Timer timer = new Timer();
private final Handler handler = new Handler();
Intent intent;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
public void onCreate(){
super.onCreate();
updateNotification();
}
//int onStartCommand(Intent intent, int flags, int startId)
public void onStart(Intent intent,int startId){
super.onStart(intent, startId);
handler.removeCallbacks(sendUpdatesToUI);
handler.postDelayed(sendUpdatesToUI, 1000); // 1 second
Log.v("Location Servics", "Start Service");
}
private Runnable sendUpdatesToUI = new Runnable() {
public void run() {
DisplayLoggingInfo();
handler.postDelayed(this, 15000); // 60 seconds here you can give your time
}
};
public void onDestroy(){
super.onDestroy();
Log.v("Location Servics", "Destroy Service");
}
public boolean isOnline(){
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
boolean isconnected;
if (netInfo==null || !netInfo.isConnected())
isconnected=false;
else
isconnected=true;
Log.v("isOnliNe",isconnected+"");
return isconnected;
}
protected void updateNotification() {
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new MyLocationlistener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, normallocationwait, 0.250f, locationListener);
location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
private class MyLocationlistener implements LocationListener {
public void onLocationChanged(Location location){
if(location!=null){
if(location.hasAccuracy()){
dumpLocation(location);
}else{
dumpLocation(location);
}
}
}
public void onProviderDisabled(String provider){
Log.v("Loc Update","\nProvider disabled: " + provider);
}
public void onProviderEnabled(String provider){
Log.v("Loc Update","\nProvider enabled: " + provider);
}
public void onStatusChanged(String provider, int status, Bundle extras){
Log.v("Loc Update","\nProvider status changed: " + provider + ", status="
+ status + ", extras=" + extras);
}
private void dumpLocation(Location location) {
if (location == null)
Log.v("Loc Update","\nLocation[unknown]");
else{
Log.v("Loc Update","\n" + location.toString());
Log.v("Demo", location.toString());
String url = Your url;
Toast.makeText(getBaseContext(), "Location Update", Toast.LENGTH_SHORT).show();
if(isOnline()){
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
try {
HttpResponse response = httpclient.execute(httppost);
Log.v("Message", response.toString());
} catch (ClientProtocolException e) {
Log.e("Sending Message",e.getMessage().toString());
} catch (IOException e) {
Log.e("Sending Message",e.getMessage().toString());
}
}
}
}
public boolean isOnline(){
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
boolean isconnected;
if (netInfo==null || !netInfo.isConnected())
isconnected=false;
else
isconnected=true;
Log.v("isOnliNe",isconnected+"");
return isconnected;
}
}
}
Ответ 5
Используйте поток и обработчик
Handler alarmCheckHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
System.out.println("getting message from alarm thread");
//Call your function for ping
};
Thread alarmCheckThread = new Thread() {
public void run() {
int i = 0;
synchronized (this) {
while (checkflag) {
i++;
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (i == 600) {
alarmCheckHandler.sendMessage(alarmCheckHandler
.obtainMessage());
i = 0;
}
}
System.out.println("End of unlimited while loop reched");
}
}
};
Для начала вызова
alarmCheckThread.start();
Для остановки вызова
alarmCheckThread.interrupt();