通过PendingIntent在后台线程中启动服务

时间:2016-02-29 20:41:56

标签: android multithreading android-service android-pendingintent background-thread

我正在尝试在Android中探索Services的世界,我刚刚写了一个小例子,其中活动有一个触发通知的按钮。

我所做的步骤是:

  • 创建Intent intent = new Intent(context, MyService.class);
  • 将其插入PendingIntent并将其发送至NotificationManager

然后,一旦我点击通知,服务(MyService)就会启动并启动音乐配乐。

使用日志记录我看到按钮的单击和MyService的操作都发生在主线程上,我想知道如何在单独的后台线程中运行服务

P.S。 MyService正在扩展Service而不是IntentService,因为最后一个会在执行后终止

2 个答案:

答案 0 :(得分:0)

onStartCommand()的主要主题上调用

Service。如果您要启动后台Thread来完成工作,您可以创建自己的Thread并在onStartCommand()内启动它。像这样:

Thread t = new Thread(new Runnable() {
    public void run() { 
        // Put whatever code you want to run in background thread here
    }
}).start();

确保您的代码在Service需要停止时根据需要关闭正在运行的后台线程。

答案 1 :(得分:0)

您是否曾与RXjava合作过?

1 - 获取librery: 在build.gradle中写下这两行:

  

编译'io.reactivex.rxjava2:rxandroid:2.0.1'

     

编译'io.reactivex.rxjava2:rxjava:2.1.2'

2 - 在onStartCommand中写下这些行:

    io.reactivex.Observable.just(s).subscribeOn(AndroidSchedulers.mainThread())
                                                    .observeOn(Schedulers.io())
                                                    .subscribe(new io.reactivex.Observer<String>() {
                                                        @Override
                                                        public void onSubscribe(@NonNull Disposable d) {

                                                        }

                                                        @Override
                                                        public void onNext(@NonNull String s) {

                                                            //Write what you want here!! ;)

                                                        }

                                                        @Override
                                                        public void onError(@NonNull Throwable e) {

                                                        }

                                                        @Override
                                                        public void onComplete() {

                                                        }
                                                    });

并在onNext内写下您想要的内容,它将在后台线程上执行

我希望它会有所帮助