0

在我的服务中,我从互联网上下载了很多东西,并希望每 x 小时执行一次(在首选项中选择)

我在主 Activity 中用这段代码编写的当前实现:

    Intent svc = new Intent(this, AlarmService.class);

    if (startService(svc)!=null) {
        Log.i(this.getClass().toString(), "Service already running");
    } else {
        Log.i(this.getClass().toString(), "Service Started");
    }

因为,根据文档

请求启动给定的应用程序服务。Intent 可以包含要启动的特定服务实现的完整类名,也可以包含要启动的服务种类的操作和其他字段的抽象定义。如果此服务尚未运行,它将被实例化并启动(如果需要,为它创建一个进程);如果它正在运行,那么它仍然在运行

我强调的最后一句话让我希望我可以在服务的 onCreate 中编写所有繁重的代码并且它不会受到影响,但不幸的是,每次用户启动应用程序时,服务都会再次启动并进行大量下载,耗尽电池。

服务是否正在运行的指示是否正确:

返回 如果服务正在启动或已经在运行,则返回实际启动的服务的 ComponentName;否则,如果服务不存在,则返回 null。

所以,我的问题是,如果服务已经启动,如何让服务保持不变,如果尚未启动,如何启动它?

谢谢

编辑:

服务从未停止:

public class AlarmService extends Service {

    Alarm alarm = new Alarm();

    public void onCreate() {
        super.onCreate();
        Log.i("**", "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("LocalService", "Received start id " + startId + ": " + intent);
        // DO NOTHING FOR TESTING alarm.SetAlarm(this);
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}
4

1 回答 1

1

在我的服务中,我从互联网上下载了很多东西,并希望每 x 小时执行一次(在首选项中选择)

希望您使用IntentService(可能是我的WakefulIntentService)和AlarmManager.

我强调的最后一句话让我希望我可以在服务的 onCreate 中编写所有繁重的代码并且它不会受到影响,但不幸的是,每次用户启动应用程序时,服务都会再次启动并进行大量下载,耗尽电池。

那是因为服务已经停止(通过stopService()stopSelf()),或者因为您的应用程序的进程已终止。

如果已经启动,如何让服务保持不变,如果尚未启动,如何启动它?

呼叫startService(),如文档所示。

但是,如果您真的在尝试“每 x 小时执行一次”,那么如果您的服务在此期间没有浪费 RAM 试图坚持下去,那么用户将非常感激。因此,用户或操作系统很可能会在“x 小时”内摆脱您的进程。如果您不想每“x 小时”进行一次“大量下载”,那么您需要将该信息本地保存到某种文件中。

于 2012-11-21T22:48:20.470 回答