2011-03-13 17 views
7

मेरे पास यह एप्लिकेशन है जो समय-समय पर बीप की सेवा (पृष्ठभूमि) चलाने की आवश्यकता है। फ़ोन को पूरे दिन 5 सेकंड के लिए पूरे दिन बीप की आवश्यकता होती है (सेवा में एक हैंडलर का उपयोग किया जाता है)। मैंने इस सेवा को कार्यान्वित किया है जो यह पूरी तरह से करता है, लेकिन जब फोन गहरी नींद मोड में जाता है, तो इस हैंडलर की रोकथाम बंद हो जाती है। SO में प्रश्न से this उत्तर का उपयोग करके, मैं जागने वाले ताले का उपयोग करने में कामयाब रहा और यह ठीक काम करता है। लेकिन जब मैंने स्पष्ट रूप से फोन को गहरी नींद मोड में रखा, तो हैंडलर निष्पादन बंद कर देता है। मैं सेवा में wakelock कहां रखूं। नीचे कोड स्निपेट।वेक लॉक एंड्रॉइड सेवा आवर्ती

public class PlaySound extends Service{ 
PowerManager.WakeLock wl ; 
    PowerManager pm; 
private SoundManager mSoundManager; 
    boolean wakeUpFlag = false; 

@Override 
    public void onCreate(){ 
     super.onCreate(); 
     mSoundManager = new SoundManager(); 
     mSoundManager.initSounds(getBaseContext()); 
     mSoundManager.addSound(1, R.raw.sound); 
    } 
@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     startservice(); 
     return START_STICKY; 
    } 
private void startservice() { 
     System.out.println("Started the service"); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 
       toastHandler.sendEmptyMessage(0); 
      } 
     }, 0, 60000); 
    } 
private final Handler toastHandler = new Handler() 
    { 
     @Override 
     public void handleMessage(Message msg) 
     { 
      result =start(); 

       System.out.println("result"+result); 
       close(); 
     } 
    }; 

protected void close() { 
     try { 
      if(wakeUpFlag){ 
       wl.release(); 
       System.out.println("Released the wakelock"); 
      } 

      if(!pm.isScreenOn()){ 
       System.out.println("Screen is off - back to sleep"); 
       pm.goToSleep(1000); 
      } 
      else{ 
       System.out.println("Screen is on - no need to sleep"); 
      } 
      bs.close(); 
      writer.close(); 
      System.out.println("Closed socket and writer"); 
      System.out.println("Size of file:"+f.length()/1024); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
public void start(){ 
     try{ 
      wakeUpFlag = false; 
      pm = (PowerManager)getSystemService(Context.POWER_SERVICE); 


      if(!pm.isScreenOn()) { 
       wakeUpFlag = true; 
       wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"CollectData"); 
       System.out.println("Screen off - wake lock acquired"); 
       wl.acquire(); 
      } 
      else{ 
       System.out.println("Screen on - no need of wake lock"); 
      } 



     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
mSoundManager.playSound(1); 
} 

उत्तर

3

पैटर्न का पालन करें मार्क मर्फी WakefulIntentService के साथ प्रदान करता है। मैं सुझाव दूंगा कि न केवल इस वर्ग के विस्तृत स्पष्टीकरण के लिए, और उदाहरण में वह उनमें से एक में शामिल है, लेकिन जानकारी के अन्य धन के लिए आप उन्हें पाएंगे।

मैंने हाल ही में अपने मुख्य ऐप के लिए इस पैटर्न को लागू किया है और यह वर्ग एक आकर्षण की तरह काम करता है।

+0

.उसकी किताबों के लिए सदस्यता ली गई..मुझे कहना होगा..वे महान हैं! धन्यवाद –

4

मुझे लगता है कि आप सही झंडा एंड्रॉयड प्रलेखन Fior PowerManager को accorinding उपयोग कर रहे हैं न:

* यदि आप एक आंशिक Wakelock रखते हैं, तो सीपीयू के बाद चलाने के लिए, किसी भी टाइमर पर ध्यान दिए बिना और यहां तक ​​कि जारी रहेगा उपयोगकर्ता पावर बटन दबाता है। अन्य सभी wakelocks में, सीपीयू चलाएगा, लेकिन उपयोगकर्ता अभी भी बिजली बटन का उपयोग कर डिवाइस को सोने के लिए डाल सकते हैं।

दूसरे शब्दों में, के रूप में यह केवल एक ही है कि

1

मुझे लगता है कि आप एक Wakeup अलार्म शेड्यूल करने के लिए android.app.AlarmManager का उपयोग कर बेहतर होगा चलाने के लिए सीपीयू gurantees है PARTIAL_WAKE_LOCK उपयोग करके देखें। हालांकि सावधान रहें - आप अपने ऑनसीसेव() विधि में किसी भी लंबे समय तक चलने वाले काम नहीं करना चाहते हैं, जिसे सामान्य रूप से मुख्य धागे पर बुलाया जाता है, और आपकी गतिविधि को लटका देगा। फोन को सोने के रास्ते को रोकने के लिए आपको अभी भी अपने काम की अवधि के लिए wakelock प्राप्त करने की आवश्यकता होगी।