2011-09-09 13 views
6

スレッドを実行するサービスがあります。スレッドは、(sdcardの)ファイルにいくつかのデータを保存します。 Androidがスリープ状態になると、サービスとスレッドが継続して実行されている必要があります。私はPARTIAL_WAKE_LOCKで試しましたが、うまくいきません。 Androidがスリープしている間にスレッドが停止します。 FULL_WAKE_LOCKのような他のロックは機能しますが、将来はそのスレッドでシリアルポートから読み込むため、PARTIAL_WAKE_LOCKを使用する必要があります。画面が消えるのを気にしません。PARTIAL_WAKE_LOCKとサービスで実行中のスレッド

コードに間違いがあるのか​​、PARTIAL_WAKE_LOCKがわからないのか分かりません。誰かが私の解決策がうまくいかない理由を教えてくれますか?

これは、サービスがstaretedされる主な活動のコードの一部です:

public class SerialPortService extends Service { 

    public static String WL_TAG = "serial_port_wl_tag"; 
    public static PowerManager.WakeLock WAKELOCK = null; 
    private BufferedWriter out = null; 
    private ReadThread readThread; 

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

    public void onCreate() { 
     super.onCreate(); 
     try { 
      File root = Environment.getExternalStorageDirectory(); 
      if (root.canWrite()){ 
       File dataFile = new File(root, "batterytest.txt"); 
       FileWriter dataFileWritter = new FileWriter(dataFile); 
       out = new BufferedWriter(dataFileWritter); 
      } 
     } catch (IOException ioe) { 
      Log.d("TEST", "Could not open file " + ioe.getMessage()); 
     } 
     readThread = new ReadThread(); 
     readThread.start(); 
    } 

    public void onDestroy() { 
     if (readThread != null) readThread.interrupt(); 
     WAKELOCK.release(); 
     WAKELOCK = null; 
     try { 
      out.close(); 
     } catch (IOException ioe) { 
      Log.d("TEST", "Could not close file " + ioe.getMessage()); 
     } 
     super.onDestroy(); 
    } 

    private class ReadThread extends Thread { 
     public void run() { 
      super.run(); 
      while (!isInterrupted()) { 
       try { 
        Thread.sleep(5000); 
        if (out != null) { 
         Calendar now = Calendar.getInstance(); 
         out.write(now.getTime().toString()); 
         out.newLine(); 
       } catch (IOException ioe) { 
        Log.d("TEST", "Could not read file " + ioe.getMessage());} 
        return; 
       } catch (InterruptedException e) { 
        return; 
       } 
      } 
     } 

    } 


} 

答えて

9

まあ、私は私の質問にお答えします:これはサービスのコードがある

public void onClick(View v) { 
    if (SerialPortService.WAKELOCK == null) { 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     SerialPortService.WAKELOCK = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, SerialPortService.WL_TAG); 
     SerialPortService.WAKELOCK.acquire(); 
     startService(new Intent(getApplicationContext(), SerialPortService.class)); 
    } 
} 

。私のコードは大丈夫です。数分前に問題がEken M009Sタブレット(PowerBook)の実装であることを発見しました。これは、私がテストを行ったデバイスです。サムスンの携帯電話のような他のデバイスでは、PARTIAL_WAKE_LOCKは完全に機能します。