使用AlarmManager时,我可以在Service类中进行长时间操作吗?

时间:2015-07-16 06:47:57

标签: android

我使用AlarmManager来处理一个计划任务,函数DoSomething()可能要花很长时间,我可以将该函数放在Service类中吗?谢谢!

在我看来,Service类不能运行很长时间的操作,这会导致应用程序失去响应。

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    initView();
}


   @Override
public void onClick(View v) {
    long now = System.currentTimeMillis();
    pendingIntent = null;
    switch (v.getId()) {

    case R.id.btnService:
        pendingIntent = PendingIntent.getService(getApplicationContext(),
                0,
                new Intent(getApplicationContext(), ActionService.class),
                Intent.FLAG_ACTIVITY_NEW_TASK);
        break;

    default:
        break;
    }

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, now, 5000,
            pendingIntent);
}
}




    public class ActionService extends Service {
    private static int index = 0;

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

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Toast.makeText(getApplicationContext(), "Service " + index++ + "Ok1",
                Toast.LENGTH_SHORT).show();
         DoSomething();
    }

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

   }

2 个答案:

答案 0 :(得分:1)

只需使用IntentService即可。从IntentService中调用onHandleIntent()方法中的DoSomething方法。它处理后台线程中执行长时间运行的任务,因此您不会失去UI的责任。您只需记住IntentService一次执行一项任务。它对传入的Intents进行排队并按顺序调用它们。如果你想以另一种方式去尝试在经典服务中使用Handler和HandlerThread。

服务本身适用于UI /主线程 - 这就是您的应用程序无响应的原因。

答案 1 :(得分:-1)

http://developer.android.com/guide/components/services.html。根据这项服务可以执行长时间运行的操作。对不起发布是作为答案而不是评论。由于声誉点较少,我无法做到这一点