2017-07-19 63 views
0

我试着用下面的代码作为后台服务的toast,但它得到执行了20次,它不工作,直到100.使用线程它不工作给出错误。后台服务通知不起作用

毛毡服务被破坏。

  • 如何触发与作为后台服务30分钟差异通知,尽管应用程序被关闭,

  • 我需要显示,早上好,下午好,晚上好晚安的通知。

  • 没有任何互联网支持。

下面的程序不正常吗?我想是这样。这个怎么做?

import android.app.Service; 

public class HelloService extends Service { 

    private static final String TAG = "HelloService"; 
    int i=0; 
    private boolean isRunning = false; 

    @Override 
    public void onCreate() { 
     Log.i(TAG, "Service onCreate"); 
     Toast.makeText(this, " On create Hello Service Started", Toast.LENGTH_LONG).show(); 
     isRunning = true; 
    } 

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

     Log.i(TAG, "Service onStartCommand"); 



       for (;i<100; i++) { 
        try { 
//      Thread.sleep(1000); 

Toast.makeText(getApplicationContext(), "Hello Service On Loop"+i , Toast.LENGTH_LONG).show(); 
// 
        } catch (Exception e) { 
        } 
       } 

       //Stop service once it finishes its task 
//  i++; 
       stopSelf(); 


     return Service.START_STICKY; 
    } 


    @Override 
    public IBinder onBind(Intent arg0) { 
     Log.i(TAG, "Service onBind"); 
     return null; 
    } 

    @Override 
    public void onDestroy() { 

     isRunning = false; 

     Log.i(TAG, "Service onDestroy"); 
    } 
} 
+0

你正在得到什么错误? – androidnoobdev

回答

1

onStartCommand()在主(UI)线程上被调用。如果你在onStartCommand()内部执行一个循环,Android将在ANR(应用程序未响应)约30秒后终止进程,因为你不能阻塞主(UI)线程。

你可以做你想做的任何使用AlarmManager设置一个计时器,将启动Service或在特定时间触发BroadcastReceiver,也可以在onStartCommand()发布RunnableHandler具有一定的延迟,做你想做的在Runnable中,或者你可以在onStartCommand()中启动后台线程,后台线程可以循环和休眠,然后做你想做的事情。

无论如何,您无法每秒显示Toast。这将使用UI吐出敬酒信息,并且Android会转储大部分内容(忽略它们),或者UI将非常忙碌,以显示Android会由于ANR而终止您的应用,否则用户只会卸载您的应用!