如何在android中的新线程中启动服务

我是这个机器人的新手。 我正在使用服务做一些后台工作。 所以我从我的活动开始服务如下。

getApplicationContext().bindService( new Intent(getApplicationContext(), MyAndroidUpnpServiceImpl.class), serviceConnection, Context.BIND_AUTO_CREATE ); 

但问题是android活动被阻止了。 直到服务,

  onServiceConnected(ComponentName className, IBinder service){ ..} 

被叫回来。所以我搜索了这个。 我开始知道我必须在新线程中开始我的服务。 所以请任何人帮我这样做。

要从活动内部创建和启动新线程,您可以说:

 Thread t = new Thread(){ public void run(){ getApplicationContext().bindService( new Intent(getApplicationContext(), MyAndroidUpnpServiceImpl.class), serviceConnection, Context.BIND_AUTO_CREATE ); } }; t.start(); 

此外,如果您需要它以供以后使用,请缓存bindservice返回的值(如果有)。

任何使用Threads,Runnables,AsyncTask或其他服务的解决方案都会遇到一个常见问题

服务将阻止调用Activity,直到服务启动。 因此在某些情况下无法有效地处理服务。

解决方案是使用IntentService子类。

如何实现的示例:

 public class MyCustomService extends IntentService { private DatabaseAdapter mAdapter; public MyCustomService() { super("MyCustomService"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); Toast.makeText(this, "MyCustomService Started", Toast.LENGTH_LONG).show(); // Don't let this service restart automatically if it has been stopped by the OS. return START_NOT_STICKY; } @Override protected void onHandleIntent(Intent intent) { Toast.makeText(this, "MyCustomService Handling Intent", Toast.LENGTH_LONG).show(); // INSERT THE WORK TO BE DONE HERE } } 

只要在其中调用super.onWhatever() onCreate()和onDestroy也可以被覆盖。

老问题,但我回应是因为有人在另一个问题上引起了我的注意。

OP的问题显然是由服务的onBind(...)花了很长时间并阻塞主线程引起的。 正确的解决方案是不要那样做 。 需要重新设计服务,以便onBind(...)快速返回。 像Android API中的几乎所有其他内容一样,您应该始终在主线程中调用bindService(...)

原因是Java中的线程安全不仅仅是primefaces性问题,还有可见性问题 。 (向下滚动到可见性部分。)通常,您应该始终假设每个Java API 都不是线程安全的,除非另有明确说明。

如果有人正在寻找一个涉及保持UI线程流畅运行的解决方案,那么最好在这里查看AsyncTask任务。 干杯。

我建议使用IntentService,因为默认情况下IntentService在一个单独的线程上运行。 但是,如果您的服务类扩展了Service,那么请使用以下代码:

 Thread thread = new Thread() { @Override public void run() { startService(new Intent(getApplicationContext(), YourService.class)); } }; thread.start();