通知的后台服务无效

时间:2017-07-19 11:03:04

标签: android android-service

我尝试使用以下代码触发器吐司作为后台服务,但它执行执行了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");
    }
}

1 个答案:

答案 0 :(得分:1)

在主(UI)线程上调用

onStartCommand()。如果在onStartCommand()内执行循环,Android将在大约30秒后使用ANR(应用程序无响应)终止进程,因为您无法阻止主(UI)线程。

您可以使用AlarmManager设置定时器,以便在特定时间启动Service或触发BroadcastReceiver,或者发布Runnable } Handler中的onStartCommand()有一定的延迟并在Runnable中执行任何操作,或者您可以在onStartCommand()中启动后台线程,后台线程可以循环和睡觉或其他什么,然后做你想要的。

无论如何,您无法每秒显示Toast。这将使用toast充斥UI,并且Android会抛弃大部分(忽略它们),或者UI会如此忙碌地向他们展示Android会因ANR而杀死你的应用程序,或者用户只是卸载你的应用程序!