2012-02-07 2 views
1

Я создаю одно приложение, относящееся к BroadcastReceiver и Service.Почему мой сервис остановлен?

Мое намерение заключается в том, что мое обслуживание начато с загрузки.

Для этого я использую широковещательные приемники и запускаю свое обслуживание через это.

Он будет работать нормально, мой класс обслуживания выглядит как паров.

public class Myservice extends Service 
{ 
    public void onCreate() 
    { 
     super.onCreate(); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) 
    { 
     super.onStart(intent, startId); 

     mScrollback = new Vector<String>(); 
     Thread thr = new Thread(worker); 
     thr.start();   
    } 

    Runnable worker = new Runnable() 
    { 
     public void run() 
     { 
      runLog(); 
      return; 
     } 
    }; 
} 

Это мой класс обслуживания, он отлично работает.

Перед тем как моя заявка начнется, я получаю информацию об обслуживании через это приложение.

Когда мое приложение запущено, служба не запущена.

Если у кого-нибудь есть решение, пожалуйста, дайте мне знать.

+0

Отъезд следующее сообщение: http://stackoverflow.com/questions/2784441/trying-to-start-a-service-on-boot-on-android – ramdroid

ответ

1

Это не как вы многопоточности в сфере услуг. Посмотрите на шаг «Расширение класса обслуживания»: http://developer.android.com/guide/topics/fundamentals/services.html

Многопоточность в классе обслуживания выполняется с помощью потока обработчика. Вот код из документации (по ссылке выше)

public class HelloService extends Service { 
    private Looper mServiceLooper; 
    private ServiceHandler mServiceHandler; 

    // Handler that receives messages from the thread 
    private final class ServiceHandler extends Handler { 
     public ServiceHandler(Looper looper) { 
      super(looper); 
     } 
     @Override 
     public void handleMessage(Message msg) { 
      // Normally we would do some work here, like download a file. 
      // For our sample, we just sleep for 5 seconds. 
      long endTime = System.currentTimeMillis() + 5*1000; 
      while (System.currentTimeMillis() < endTime) { 
       synchronized (this) { 
        try { 
         wait(endTime - System.currentTimeMillis()); 
        } catch (Exception e) { 
        } 
       } 
      } 
      // Stop the service using the startId, so that we don't stop 
      // the service in the middle of handling another job 
      stopSelf(msg.arg1); 
     } 
    } 

    @Override 
    public void onCreate() { 
    // Start up the thread running the service. Note that we create a 
    // separate thread because the service normally runs in the process's 
    // main thread, which we don't want to block. We also make it 
    // background priority so CPU-intensive work will not disrupt our UI. 
    HandlerThread thread = new HandlerThread("ServiceStartArguments", 
      Process.THREAD_PRIORITY_BACKGROUND); 
    thread.start(); 

    // Get the HandlerThread's Looper and use it for our Handler 
    mServiceLooper = thread.getLooper(); 
    mServiceHandler = new ServiceHandler(mServiceLooper); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); 

     // For each start request, send a message to start a job and deliver the 
     // start ID so we know which request we're stopping when we finish the job 
     Message msg = mServiceHandler.obtainMessage(); 
     msg.arg1 = startId; 
     mServiceHandler.sendMessage(msg); 

     // If we get killed, after returning from here, restart 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // We don't provide binding, so return null 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
    Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show(); 
    } 
} 

Кроме того, вы должны убедиться, что ваш Broadcast Receiver указан в манифесте и получает BOOT_COMPLETED Намерение:

<receiver android:name="MyBroadCast"> 
<intent-filter> 
<action android:name="android.intent.action.BOOT_COMPLETED" /> 
</intent-filter> 
</receiver> 
0

Вам необходимо предоставить разрешение на запуск службы после перезагрузки устройства. Вы можете дать разрешение следующим образом:

<service android:enabled="true" android:name=".Myservice" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 

<intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 

     </intent-filter> 
+1

, возможно, вы захотите включить то, что на самом деле следует ... –

Смежные вопросы