重复和Android服务,自我调用一次完成

时间:2017-09-08 14:17:52

标签: java android

我不确定我是否有这个权利,但我有一些代码需要在我的android应用程序的后台运行,一旦完成,我想等待10秒,然后运行代码再次。

我目前有这个工作,但我相信这不是正确的方法,并想知道是否有人可以给我一个简单的例子,或告诉我我需要改变什么才能使这个“正确的方式“做到这一点。

首先我有我的ScheduleService.java文件。这是我想要运行它的代码的地方,正如你所看到的,一旦它完成,它会让线程休眠10秒然后再次调用自己,但这意味着代码永远不会实际完成(你应该如果出现错误,请查看堆栈跟踪的长度!)

ScheduleService.java

public class ScheduleService extends Service {
    private static final String TAG = "ScheduleService";

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                startJob();
            }
        });

        t.start();

        return Service.START_STICKY;
    }

    private void startJob(){
        // all my code is here, and i do what i need

        // job completed. Rest for 10 seconds before doing another one
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //do job again
        startJob();
    }

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

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
    }
}

现在启动服务代码,我的应用程序启动时会有以下内容(在我的MainActivity.java文件中)

// stop just encase its already started
context.stopService(new Intent(context, ScheduleService.class));

// start service
context.startService(new Intent(context, ScheduleService.class));

为了确保在设备重启时启动服务,我还有我的StartOnBootReciever.java代码

public class StartOnBootReciever extends BroadcastReceiver {
    private static final String TAG = "Autostart";

    /**
    * Listens for Android's BOOT_COMPLETED broadcast and then executes
    * the onReceive() method.
    */
    @Override
    public void onReceive(Context context, Intent arg1) {
        Log.d(TAG, "BOOT_COMPLETED broadcast received. Executing starter service.");

        // upload in background
        Intent intent = new Intent(context, ScheduleService.class);
        context.startService(intent);

        // This code will start the application once the device has been restarted
        Intent i = new Intent(context, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

然后在我的AndroidManifest.xml文件中,我有以下

<receiver android:enabled="true" android:exported="true" android:name="StartOnBootReciever" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>
<service android:enabled="true" android:exported="false" android:name="com.idamigo.ticketmachine.ScheduleService" />

这一切都有效,但我觉得有代码可以自我调用,而且“永无止境”

1 个答案:

答案 0 :(得分:1)

服务中,您使用了Thread.Sleep这是不必要的。因为服务将在后台持续运行,直到您停止它或系统停止它。

示例:

public class ScheduleService extends Service {

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {

      Timer timer = new Timer();
      timer.schedule(task,1,10000);
      return Service.START_STICKY;
  }

  TimerTask task=  new TimerTask() {
    @Override
    public void run() {
      //do your task here.
    }
  };

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

仅在需要在后台连续运行任务时才转到“服务”。否则,请使用IntentService。当没有工作时,IntentService将被停止,因此您不需要自己管理其状态。