IntentService - 查找等待队列中的Intent数

6
在我的应用程序中,我使用IntentService来完成一些工作。我想知道有多少意图正在等待处理,因为IntentService将它们保存在“工作队列”中,并在前一个意图的onStartCommand()方法执行完毕后,将下一个意图发送到onStartCommand()方法中。
我该如何找出在这个“工作队列”中有多少个意图正在等待?
2个回答

8
实际上很简单:您只需要覆盖onStartCommand(...)并增加一个变量,在onHandleIntent(...)中减少它即可。
public class MyService extends IntentService {

 private int waitingIntentCount = 0;

 public MyService() {
  super("MyService");
 }

 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
  waitingIntentCount++;
  return super.onStartCommand(intent, flags, startId);
 }


 @Override
 public void onHandleIntent(Intent intent) {
  waitingIntentCount--;
  //do what you need to do, the waitingIntentCount variable contains
  //the number of waiting intents
 }
}

1

使用SharedPreferences的解决方案:

根据文档,当IntentService接收到启动请求时,系统会调用onHandleIntent(Intent)

因此,每当您向队列中添加一个Intent,都会增加并存储一个表示队列中Intent数量的Integer

public void addIntent(){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    int numOfIntents = prefs.getInt("numOfIntents", 0);
    numOfIntents++;
    SharedPreferences.Editor edit = prefs.edit();    
    edit.putInt("numOfIntents",numOfIntents);
    edit.commit();
}

然后,每次调用onHandleIntent(Intent)时,您都会减少那个Integer值:

public void removeIntent(){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    int numOfIntents = prefs.getInt("numOfIntents", 0);
    numOfIntents--;
    SharedPreferences.Editor edit = prefs.edit();
    edit.putInt("numOfIntents",numOfIntents);
    edit.commit();
}

最后,每当您想要检查队列中有多少个Intent时,只需获取该值:

public void checkQueue(){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplication());
    int numOfIntents = prefs.getInt("numOfIntents",0);
    Log.d("debug", numOfIntents);
}

问题在于 onHandleIntent(你是不是想说 onStartCommand?)只有在“前一个” onHandleIntent 完成后才会被调用。无论如何,这种方法有点像黑客行为,难道没有直接访问意图队列的方法吗?另外,为什么要将整数存储在 sharedPreferences 中,而不是在 IntentService 类中使用私有(静态?)变量? - Jonas Czech
我对此进行了一些研究,但没有找到任何实现您目标的“官方”方法。它可以是一个静态变量,但那样你只能从Service类(我想)访问它,而使用SharedPreference则可以从整个应用程序中访问它。@JonasCz - Marcus
我认为你可以用onStartCommand替换onHandleIntent - Marcus
好的,找到一个答案在这里。如果我将变量设为公共的,我就可以在整个应用程序中访问它,但我无论如何都不想这样做。 - Jonas Czech
1
这个答案还有一个问题:您的共享首选项数据将持久存在,例如在设备重新启动时,而您的意图不会... - ban-geoengineering

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接