我有一个Android应用程序,它有一个启动服务的按钮。
这是服务:
public class SimpleService extends Service
{
@Override
public int onStartCommand(Intent intent,int flags, int startId)
{
Toast.makeText(this,"Service Started",Toast.LENGTH_SHORT).show();
Integer i=0;
while (i<10)
{
Log.d("Hi",i.toString());
SystemClock.sleep(5000);
i++;
}
Log.d("Hi","return START_STICKY");
return START_STICKY;
}
public void onDestroy()
{
super.onDestroy();
Toast.makeText(this,"Service Stopped",Toast.LENGTH_SHORT).show();
}
}
当我点击按钮时,服务成功启动,但过了一段时间,在模拟器中,我收到错误,如
应用程序没有响应。你想关闭吗?
我在服务实施方面做错了吗?
我想做的是每5秒执行一次任务,即使我的应用程序被杀了。
我尝试使用IntentService但是当我的应用程序被杀死时它就被杀了所以我的任务仍然不完整。
答案 0 :(得分:1)
while (i<10)
{
Log.d("Hi",i.toString());
SystemClock.sleep(5000);
i++;
}
我想指出你的代码的这一部分。这里你要做的就是一旦你的服务开始,你正在进行10次迭代循环,并且在每次迭代中你暂停执行5秒(这在执行方面是很多时间)。由于服务在主进程中运行,在我看来,它们会阻塞主线程,这意味着在睡眠期间,如果访问您的应用程序,您将收到ANR(应用程序无响应)错误。因此,这些类型的任务应该在一个单独的线程中运行。
如果您想在后台执行一些重复性任务,我建议您使用Android SDK的AlarmManager组件。警报管理器是系统服务,因此您可以使用以下行访问它代码
AlarmManager mAlarmMgr=(AlarmManager) getSystemService(Context.ALARM_SERVICE);
//Then you can set alarm using mAlarmMgr.set().
然后,您将在AlarmReceiver中收到警报。
AlarmReciever类扩展了BroadcastReceiver并覆盖了onRecieve()方法。在onReceive()内,你可以根据自己的需要开始一项活动或服务,就像你可以开始一项活动来振动电话或给手机打电话。
我希望这会有所帮助。干杯!
答案 1 :(得分:0)
由于默认情况下,您的所有应用程序组件(如活动,服务等)都在Main / UI Thread中运行,如果它被阻止,Android会显示ANR对话框。
此外,每个生命周期服务方法都是从UI线程调用的。如果您需要一直运行后台任务,可以为此创建新线程。
您可以在服务类中尝试以下代码:
new Thread(new Runnable(){
public void run() {
while(i<10)
{
Thread.sleep(5000)
//REST OF CODE HERE//
}
}
}).start();