我使用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);
}
}
答案 0 :(得分:1)
只需使用IntentService即可。从IntentService中调用onHandleIntent()方法中的DoSomething方法。它处理后台线程中执行长时间运行的任务,因此您不会失去UI的责任。您只需记住IntentService一次执行一项任务。它对传入的Intents进行排队并按顺序调用它们。如果你想以另一种方式去尝试在经典服务中使用Handler和HandlerThread。
服务本身适用于UI /主线程 - 这就是您的应用程序无响应的原因。
答案 1 :(得分:-1)
http://developer.android.com/guide/components/services.html。根据这项服务可以执行长时间运行的操作。对不起发布是作为答案而不是评论。由于声誉点较少,我无法做到这一点