Android 以相同的意图启动多个服务,但不同的requestCode使用相同的对象
我有一个通过AlarmManager安排服务的对象,如下所示:Android 以相同的意图启动多个服务,但不同的requestCode使用相同的对象,android,android-lifecycle,Android,Android Lifecycle,我有一个通过AlarmManager安排服务的对象,如下所示: public void schedule(MyEnum enum) { Intent intent = new Intent(context, MyService.class); intent.setAction(enum.name()); Bundle args = new Bundle(); args.putSerializable("MyEnum", content); intent.
public void schedule(MyEnum enum) {
Intent intent = new Intent(context, MyService.class);
intent.setAction(enum.name());
Bundle args = new Bundle();
args.putSerializable("MyEnum", content);
intent.putExtra("Bundle", args);
PendingIntent pendingIntent = PendingIntent.getService(context, enum.ordinal(),
intent, 0);
alarmManager.set(AlarmManager.RTC_WAKEUP, 0, pendingIntent);
}
服务:
public class MyService extends IntentService {
@Override
public void onHandleIntent(Intent intent) {
Log.d("this: " + this);
}
}
启动计划程序的方式:
scheduler.schedule(MyEnum.ONE);
scheduler.schedule(MyEnum.TWO);
我在日志中看到:
MyService@41ea7858
MyService@41ea7858
我试着用一个广播接收器,我也玩了旗子,但结果是一样的。
然后我尝试了类似的方法:
button1.setOnClickListener() { scheduler.scheduler(MyEnum.ONE); }
button2.setOnClickListener() { scheduler.scheduler(MyEnum.TWO); }
如果我点击按钮1,然后马上点击按钮2,我会在日志中看到相同的Id。但是如果我在两次点击之间留出更多的时间,我会得到两个不同的ID
知道发生了什么事以及如何避免吗?谢谢 你不能。 服务和广播接收器与活动的不同之处在于,同一时间只能有一个实例。
只有当第一个实例被销毁时,才会创建一个新实例。这就是你在第二次实验中的体验。我明白了。。。我最初的目标是以特定的时间间隔在后台下载数据。每次下载都是独立的。比如:每5小时下载一次数据,每6小时下载一次数据,等等。我已经读到,安排重复任务的最佳方法是使用AlarmManager(而不是服务),这样可以在设备睡眠时执行任务。解决我的问题的一个方法是有不同的意图驱动(我猜每个数据对应一个)。但是在onHandleIntent中启动一个异步任务怎么样?这有意义吗?什么是更好的方法?谢谢。你不需要不同的服务。只需将您的数据传递给单个IntentService,它将自己按顺序处理所有请求。您的答案是正确的。关于问题的另一部分,我通过使用提供程序注入一个对象来解决它,该对象将下载不同的文件(基于传递给Intent的数据)。