Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在新线程中启动服务?_Android_Android Service - Fatal编程技术网

Android 如何在新线程中启动服务?

Android 如何在新线程中启动服务?,android,android-service,Android,Android Service,如何在新线程中启动服务。我看了其他问题,但对我来说没什么用。在正常运行和在单独线程中运行时,我需要对我的服务进行哪些更改?在我的项目中,我有这样的人,这是我的工作: Thread welcomeThread = new Thread() { @Override public void run() { try { super.run(); while (isMyServiceRunning() != true) { sleep(100

如何在新线程中启动服务。我看了其他问题,但对我来说没什么用。在正常运行和在单独线程中运行时,我需要对我的服务进行哪些更改?

在我的项目中,我有这样的人,这是我的工作:

Thread welcomeThread = new Thread() {
@Override
public void run() {
    try {
        super.run();
        while (isMyServiceRunning() != true) {
            sleep(100);
        }
    } catch (Exception e) {
        System.out.println("EXc=" + e);
    } finally {
        Intent i = new Intent(getApplicationContext(), MainPage.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);
    }
}
};

welcomeThread.start();
引用


请注意,与其他应用程序对象一样,服务在其宿主进程的主线程中运行。这意味着,如果您的服务要执行CPU密集型(如MP3播放)或阻塞(如联网)操作,则操作时,它应该生成自己的线程来执行该工作。有关这方面的详细信息,请参阅进程和线程。IntentService类是一个标准的服务实现,它在其中有自己的线程来安排要执行的工作。”

重命名您的
public void onStart(final Intent Intent,final int startId)
方法以
\u onStart
并使用此新的
onStart
实现:

 @Override
 public void onStart(final Intent intent, final int startId) {
     Thread t = new Thread("MyService(" + startId + ")") {
         @Override
         public void run() {
             _onStart(intent, startId);
             stopSelf();
         }
     };
     t.start();
 }

 private void _onStart(final Intent intent, final int startId) {
     //Your Start-Code for the service
 }
适用于API 5级及以上级别

public void onStart(Intent,int)
在API级别5被弃用。这应该被
public int onStart命令(Intent,int)


我不认为你可以在一个新的线程中启动你的服务,但是你可以做的是在你的服务中启动一个新的线程

这是因为与活动一样,服务具有在主线程上运行的生命周期方法

因此,您的服务将在主线程上运行,但它将在需要时在它创建的新线程上执行繁重的工作


我希望这会有所帮助。

我已经读到:)只是我不知道如何在新线程中运行我的服务。我在这个论坛上尝试了其他问题的代码,但对我来说力不从心。你使用过像这里这样的IntentService吗?或者,您可以像这样创建WorkerThread:私有最终类WorkerThread扩展线程{public Handler;@Override public void run(){Looper.prepare();this.Handler=new Handler(){@Override public void handleMessage(final Message msg){switch(msg.what){case MSG_DO_MY_JOB://…break;case MSG_STOP:YourOuterClass.this.stopSelf();break;}}};Looper.loop();}}在创建服务时启动工作程序,并在需要完成某些操作时向处理程序发送消息。那么,什么呢?将startActivity更改为startService(i);logcat中没有任何内容。事实上,我尝试在没有线程的情况下运行服务,但无论如何它都无法运行…因此我暂时将其保留到星期一…无论如何,非常感谢您的帮助。对于我来说,这次从新线程启动服务,但服务是在旧线程中创建和运行的。这并没有提供问题的答案如果你要求作者澄清,请在他们的帖子下方留下评论。@MD你的意思是什么?它清楚地提供了答案……也许你是指另一篇帖子?
@Override
public int onStartCommand(final Intent intent, final int startId){
    //All code from 'onStart()' in above placed here as normal.
}

private void _onStart(final Intent intent, final int startId) {
     //Your Start-Code for the service
}