在我的应用中,用户会请求位置更新。发生这种情况时,主要活动会启动一个服务,该服务将启动位置请求。
我的问题是,如果服务启动,比如说在两分钟内完成3次,那么它就无法正常运行。
所以,基本上,我需要服务将启动请求置于保持状态,直到当前启动完成。
每次启动我的服务时,它最多可能需要十分钟才能完成,服务会根据传递给它的意图数据以不同的方式响应每个启动请求。
我很满意(实际上更喜欢)在两分钟时间内发生的三个启动请求中的每一个都有一个位置请求,但意图数据可能与三个启动请求中的每一个都不同。
所以,我尝试使用IntentService克服这个问题并一次处理一个请求,但是
LocationManager.requestLocationUpdates(...)
未被调用。我理解这可能是由于onHandleIntent(...)几乎立即完成并且基本上没有给位置请求时间来响应。我有一个处理程序,在7分钟后停止位置请求(3分钟进行测试),然后将位置信息传递给其他向用户返回UI更新的方法。 UI更新返回,它们只是null,因为位置更新失败。
我想我可以在IntentService中使用onHandleIntent来启动我的服务并将意图数据传递给它,但这似乎是一种非常糟糕的做法,而且可能有更好的方法。 编辑:这肯定是行不通的,因为onHandleIntent会立即启动我的locationService,所以没有等待期。
此外,在onHandleIntent中调用的任何Toast都没有显示,尽管我的onCreate()中的所有东西都应该像它应该的那样工作。
我很难找到任何答案,任何帮助都会非常感激。这是我的代码的要点:
public class myService extends IntentService {
public findMyDroidService() {
super("findMyDroidService");
}
@Override
protected void onHandleIntent(Intent intent){
intent.getExtras();
fromIntentString = intent.getStringExtra("toIntentStringExtra");
Toast.makeText(this, fromIntentString, Toast.LENGTH_SHORT).show();
Toast.makeText(this, "Intent Handled", Toast.LENGTH_SHORT).show();
locMan.requestLocationUpdates(locListener,...);
}
@Override
public void onCreate(){
super.onCreate();
locListener = new LocationListener(){
//code goes here
}
}
}
此外,我的位置监听器在onCreate();
中实例化答案 0 :(得分:0)
我绝对会过度思考它。
在我的情况下,问题是我需要将所有数据分开,因此字符串fromIntentString不会被新的启动请求覆盖。我用一个数组就足够了。
public class myClass extends Service {
int arrayInt;
ArrayList<String> arrayStringList;
int myInt;
@Override
public void onCreate() {
super.onCreate()
arrayStringList = new ArrayList<String>();
myInt = 0;
// additional code not important for this example
}
@Override
public void onStart(...){
handleCommand(intent);
}
@Override
public void onStartCommand(...){
handleCommand(intent);
return START_STICKY;
}
//I call both onstart and onStartCommand for backwards compatibility
public void handleCommand(Intent intent){
intent.getExtras();
arrayStringList.add(intent.getStringExtra("fromIntentString"));
// so I know it worked
Toast.makeText(this, arrayStringList.get(arrayInt).toString(),
Toast.LENGTH_SHORT).show();
//So I can keep track of the size of arrayStringList
++arrayInt;
//code for getting the location
useMyData();
}
public void useMyData(){
// do location getting code
// Here's where I actually use my array. For this answer, I will just show a toast.
Toast.makeText(getApplicationContext(), arrayStringList.get(myInt).toString(),
Toast.LENGTH_SHORT).show();
++myInt;
if (myInt < arrayInt) useMyData();
//I was going to use a for loop, but I couldn't get it to work, and I like this method
//better
编辑:我以前使用的是Array [String]而不是ArrayList,但这不起作用,因为我必须能够不断增加我的数组的大小,这是不可能。 Array有一个固定的大小,所以我使用了一个ArrayList,它现在有效。