2015-07-14 3 views
6

मैं अपने ऐप है, जो एपीआई स्तर 17. मैं सब कुछ सेट अप किया है के रूप में GCM नेटवर्क प्रबंधक पृष्ठ पर विस्तार से बताया करने के लिए नीचे चलाता है में एक आवर्ती कार्य का समय निर्धारित करने के लिए प्रयास कर रहा हूँ GcmNetworkManager का उपयोग (https://developers.google.com/cloud-messaging/network-manager):GCM नेटवर्क प्रबंधक - समय-समय पर टास्क फायरिंग नहीं

मेरी AndroidManifest.xml में, मेरे पास है:

<service 
    android:name=".services.MyService" 
    android:exported="true" 
    android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"> 
    <intent-filter> 
     <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/> 
    </intent-filter> 
</service> 

मेरे आवेदन में, मैं है:

long periodSecs = 30L; // the task should be executed every 30 seconds 
long flexSecs = 15L; // the task can run as early as -15 seconds from the scheduled time 

String tag = "myScan|1"; 

PeriodicTask periodic = new PeriodicTask.Builder() 
     .setService(MyService.class) 
     .setPeriod(periodSecs) 
     .setFlex(flexSecs) 
     .setTag(tag) 
     .setPersisted(false) 
     .setRequiredNetwork(com.google.android.gms.gcm.Task.NETWORK_STATE_ANY) 
     .setRequiresCharging(false) 
     .setUpdateCurrent(true) 
     .build(); 

GcmNetworkManager.getInstance(this).schedule(periodic); 

और मैं MyService है, जो की तरह लग रहा है:

public class MyService extends GcmTaskService { 
    @Override 
    public int onRunTask(TaskParams taskParams) { 
     Log.info("onRunTask: " + taskParams.getTag()); 

     return GcmNetworkManager.RESULT_SUCCESS; 
    } 

    @Override 
    public int onStartCommand (Intent intent, int flags, int startId) { 
     Log.info("onStartCommand"); 

     return GcmTaskService.START_STICKY_COMPATIBILITY; 
    } 
} 

जब मैं अनुप्रयोग शुरू, मैं onStartCommand की उम्मीद के रूप में लॉग, लेकिन onRunTask कभी नहीं कहा जाता हो जाता है मिलता है। क्या मैं कुछ भूल रहा हूँ? मैं उम्मीद कर रहा हूँ कि, एक बार शुरू कर दिया है (जैसा कि शुरुआत आदेश फायरिंग इसका सबूत), यह हर 15-30 सेकंड चलाना चाहिए - कि एक सही धारणा है? यह बिल्कुल फायरिंग क्यों नहीं है?

धन्यवाद!

+0

मुझे समझ में नहीं आता कि यह 'लंबी अवधि Secs = 30L; 'सेकंड है। मैं उम्मीद करता हूं कि यह मिलीसेकंड में होगा। क्या यह वास्तव में सेकंड है? पाठ्यक्रम है कि मेरी समस्या नहीं है की - – lxknvlk

उत्तर

9
समस्या

कि आप onStartCommand अधिभावी रहे हैं! इस प्रकार Google Play सेवाएं आपके GcmTaskService पर कार्य निष्पादित करती हैं। आप इसे काम करना चाहते हैं, तो बस

return super.onStartCommand(intent, flags, startId); 

शायद यह कारण है कि onRunTask प्रदान की जाती है तो आप अपनी सेवा के जीवन चक्र के बारे में चिंता की जरूरत नहीं है उल्लेख के लायक है - आप जब stopService को GcmTaskService के आंतरिक भागों पर भरोसा कर सकते की आवश्यकता है।

यह कहा गया है कि, यदि आप अपने जीसीएम टास्क सेवा पर कस्टम सेवा के साथ सेवा (सेवा) शुरू करते हैं तो आप इसे गड़बड़ कर सकते हैं और एक ऐसी सेवा के साथ समाप्त हो जाएंगे जब यह होना चाहिए।

यदि आपको GcmTaskService (अनुशंसित नहीं) में कॉल करने की आवश्यकता है तो आपको इसे बाध्य करना चाहिए - यह इंटरफ़ेस GcmTaskService आंतरिक द्वारा पूरी तरह से छूटा हुआ है।

+0

ओह आदमी है, कि एक बड़े पैमाने पर अपनी ओर से असफल हो गया था! धन्यवाद - एक बार जब मैं आज रात की पुष्टि करता हूं तो मैं आपका जवाब स्वीकार करूंगा। – jkane001

+0

शायद दिन की कम से कम आश्चर्यजनक खबर - आप सही थे! Btw, मैं startService() से निपटने की योजना नहीं बना रहा था, लेकिन मैं इसे सिर्फ लॉग इन करने की है कि यह क्या हो रहा था, जो, विडंबना यह है कि, तो यह विफल वजह से अधिभावी किया गया था। त्वरित मदद के लिए धन्यवाद! – jkane001

1
@Override 
public int onRunTask(TaskParams taskParams) 
{ 
    Log.info("onRunTask: " + taskParams.getTag()); 

    return GcmNetworkManager.RESULT_SUCCESS; 
} 

@Override 
public void onCreate() 
{ 
    Log.i(TAG, "in onCreate"); 
    super.onCreate(); 
    GcmNetworkManager.getInstance(this).schedule(createPeriodicSyncTask()); 
} 

private PeriodicTask createPeriodicSyncTask() 
{ 
    return new PeriodicTask.Builder() 
      .setService(PeriodicSyncService.class) 
      .setPeriod(mSyncIntervalInSec) 
      .setFlex(mSyncIntervalInSec - 20) 
      .setTag(TAG) 
      .setPersisted(true) 
      .setRequiredNetwork(NETWORK_STATE_ANY) 
      .setUpdateCurrent(true) 
      .setRequiresCharging(false) 
      .build(); 
} 
संबंधित मुद्दे