格雷格
根据您的建议,这是我的新代码。那没起效。我收到了一堆“刚刚发送带有coords的短信”。所以它仍然没有睡15秒。
package com.droid.service;
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Timer; import java.util.TimerTask;
import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Looper;
public class DroidService扩展Service {
private LocationManager lm;
private LocationListener locationListener;
private Location location = null;
@Override
public IBinder onBind(Intent arg0)
{
return null;
}
// @Override
// public void onCreate()
// {
// super.onCreate();
// initService();
// }
private static final int PERIOD = 15000;
Handler mHandler;
Runnable mRunnable;
@Override
public void onCreate()
{
super.onCreate();
mHandler = new Handler();
mRunnable = new Runnable()
{
public void run()
{
updateNotification();
mHandler.postDelayed(this, PERIOD);
System.out.println("PAUSE FOR 15 SECONDS..!!");
}
};
}
@Override
public void onStart(final Intent intent, final int startId)
{
super.onStart(intent, startId);
mRunnable.run();
}
// private void initService() // { // System.out.println(“在initService..Droid服务中...... !!”); // int initialDelay = 15000; // 15秒后开始 // // int period = 300000; //每5分钟重复一次 // // int period = 1800000; //每30分钟重复一次 // int period = 15000; //每15秒重复一次测试 //定时器计时器=新的计时器(); // TimerTask task = new TimerTask() // { // public void run() // { // Looper.prepare(); // updateNotification(); // Looper.loop(); //} //}; // timer.scheduleAtFixedRate(task,initialDelay,period); //}
protected void updateNotification()
{
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationlistener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
public static class DateUtils
{
public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
public static String now()
{
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
return sdf.format(cal.getTime());
}
}
private class MyLocationlistener implements LocationListener
{
public void onLocationChanged(Location loc)
{
double lat = loc.getLatitude();
double lon = loc.getLongitude();
String latitude = Double.toString(lat);
String longitude = Double.toString(lon);
String coords = latitude + longitude;
// comment out text message for debug mode
// SmsManager sm = SmsManager.getDefault();
// sm.sendTextMessage("phoneNumber", null, coords, null, null);
System.out.println("Just sent a text message with coords");
}
public void onProviderDisabled(String provider)
{
}
public void onProviderEnabled(String provider)
{
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}
}
这是我的代码
即使我的scheduleAtFixedRate设置为10秒,我也会发送“只是发送带有coords的短信”,就像每秒发送一次。
我让它在正常的程序中工作,但是在Android平台上,他们希望你使用Looper ....而且看起来我的代码被这个Looper所捕获,所以它忽略了我的scheduleAtFixedRate(10秒)
非常感谢任何帮助。
package com.droid.service;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Looper;
public class DroidService extends Service
{
private LocationManager lm;
private LocationListener locationListener;
private Location location = null;
@Override
public IBinder onBind(Intent arg0)
{
return null;
}
@Override
public void onCreate()
{
super.onCreate();
initService();
}
private void initService()
{
System.out.println("In initService..!!");
int initialDelay = 15000; // start after 15 seconds
// int period = 300000; // repeat every 5 minuets
// int period = 1800000; // repeat every 30 minuets
int period = 15000; // repeat every 15 seconds for testing
Timer timer = new Timer();
TimerTask task = new TimerTask()
{
public void run()
{
Looper.prepare();
updateNotification();
Looper.loop();
Looper.myLooper().quit();
}
};
timer.scheduleAtFixedRate(task, initialDelay, period);
}
protected void updateNotification()
{
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationlistener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
private class MyLocationlistener implements LocationListener
{
public void onLocationChanged(Location loc)
{
double lat = loc.getLatitude();
double lon = loc.getLongitude();
String latitude = Double.toString(lat);
String longitude = Double.toString(lon);
String coords = latitude + longitude;
// comment out text message for debug mode
// SmsManager sm = SmsManager.getDefault();
// sm.sendTextMessage("phoneNumber", null, coords, null, null);
System.out.println("Just sent a text message with coords");
}
public void onProviderDisabled(String provider)
{
}
public void onProviderEnabled(String provider)
{
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}
}
答案 0 :(得分:1)
我认为这里的误解并不是Android想要使用Looper,但是你不应该使用Timer来实现你想要的行为。而不是Timer,你必须操纵一个Looper。我有一段时间没有直接使用过Looper,因为还有其他组件可以抽象出它的很多细微差别。但是我认为Looper.loop()不应该返回,直到外部实体中断你的线程或退出你的looper。所以我认为这不会起作用,但我可能错了。
如果要创建脉冲,可以使用处理程序。 Handler允许您在Looper线程上进行操作。 所以,举个例子,
private static final int PERIOD = 15000;
Handler mHandler;
Runnable mRunnable;
@Override
public void onCreate() {
super.onCreate();
mHandler = new Handler();
mRunnable = new Runnable() {
public void run() {
updateNotication();
mHandler.postDelayed(this, PERIOD);
}
};
}
我将从这里承认,我只是猜测我知道您申请的理想结果。我假设您不需要双向通信,因为您的IBinder为空。
@Override
public void onStart() {
mRunnable.run();
}
// The rest of your code.
..
答案 1 :(得分:0)
尝试从onStart()调用initService。
答案 2 :(得分:0)
基本上我最好的选择就是打电话给我。现在它正在做我想要它做的事情。感谢您的所有投入.. !!这有助于我解决问题。