“应用程序没有响应。你想关闭吗?”在Android中运行服务时出错

时间:2015-03-01 08:03:11

标签: android android-service

我有一个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但是当我的应用程序被杀死时它就被杀了所以我的任务仍然不完整。

2 个答案:

答案 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();