关闭应用后服务未运行

时间:2017-11-25 13:24:32

标签: java android notifications background-service

我正在尝试使用用户关闭应用程序后运行15秒的后台服务,我已经完成了运行15秒的服务(循环使用日志),当我关闭应用程序时发芽,然后它停止

另一个问题是,当我试图通过stopService(intent)将其从主要活动中停止时;然后调用onDestroy方法,但带循环的线程继续

..请有人帮帮我吗?

*对不起我的英语 - 没有本地人:D

public class NotificationService extends Service {
    final private class MyThread implements Runnable {

        int service_id;

        MyThread(int service_id) {
            this.service_id = service_id;
        }


        @Override
        public void run() {

            synchronized (this) {
                for (int i = 0; i < 15; i++) {
                    try {
                        wait(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    Log.e("onStartCommand", "loop:" + i);
                }
                stopSelf(service_id);
            }
        }
    }

    Thread thread;

    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        Log.e("onStartCommand", "started");
        Toast.makeText(this, "onStartCommand", Toast.LENGTH_SHORT).show();

        thread = new Thread(new MyThread(startId));
        thread.start();

        return START_STICKY;
    }


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public void onDestroy() {
        Log.e("onDestroy", "onDestroy");
        Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
        super.onDestroy();
    }
}

1 个答案:

答案 0 :(得分:0)

  

我正在尝试使用用户关闭应用程序后运行15秒的后台服务,我已经完成了运行15秒的服务(循环使用日志),当我关闭应用程序时发芽,然后它停止

您的代码仅在startService(yourNotificationService)Activity上调用Broadcast Receiver时启动循环线程,而stopSelf(service_id)负责调用它。然后用onStartCommand()杀死它。

如果,在您从stopSelf(service_id)返回后,您立即终止该应用而未调用START_STICKY(即您的15秒未启动),那么您的服务将自动重启,因为{{ 1}}返回值。但是,在您致电stopSelf(service_id)之后,您正在告诉服务部门自杀;关闭应用后,无法通过onStartCommand()电话告知您的服务重新启动。

  

另一个问题是,当我尝试通过stopService(intent)将其从主活动中停止时;然后调用onDestroy方法,但是循环继续

Service是Android组件;它是另一个进程或线程,它在与主UI线程相同的进程和线程中运行,除非您另有指定,如here所示。

  

请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果您的服务要进行任何CPU密集型(例如MP3播放)或阻止(例如网络)操作,它应该生成自己的线程来执行该工作。有关此内容的更多信息,请参见进程和线程。 IntentService类可用作Service的标准实现,它具有自己的线程,用于调度其工作。

在您的情况下,调用stopService(intent)告诉Service停止自己,它会这样做。 停止您启动的ThreadMyThread实例)。为此,您必须先使Thread可中断;请参阅here来做到这一点。完成后,您需要更改onDestroy()代码以实际中断MyThread实例,如此处

@Override
public void onDestroy() {
    Log.e("onDestroy", "onDestroy");
    Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
    thread.interrupt();
    super.onDestroy();
}