2014-07-13 5 views
5

मैं जीसीएम समय के बाहर काम करने की कोशिश कर रहा हूं, इस विषय पर कई धागे हैं, संदर्भ के लिए one है।Google क्लाउड संदेश को जीवित रखने में समस्या

एक प्रस्तावित कामकाज टीसीपी टाइमआउट से कम अंतराल पर इरादों की एक जोड़ी प्रसारित करना है।

मेरा कार्यान्वयन एक वर्ग बनाने के लिए है जो काउंटरडाउन टाइमर वर्ग को बढ़ाता है और उस सेवा का एक मौजूदा सेवा में एक उदाहरण धारण करता है। यह व्युत्पन्न वर्ग समाप्त हो जाने पर स्वयं को पुनरारंभ करता है और सेवा STICKY_START के रूप में चिह्नित की जाती है, इसलिए एक बार शुरू होने पर, मुझे लगता है कि इसे केवल 4 मिनट के इरादे को प्रसारित करना चाहिए, लेकिन किसी कारण से अंतराल होते हैं, जब काउंटर प्रसारित नहीं करता है इरादों और मैं अभी भी जीसीएम सर्वर के साथ संपर्क खो दिया है।

दो प्रासंगिक वर्ग नीचे दिए गए हैं। क्या कोई इस बात का समाधान कर सकता है कि समाधान क्यों काम नहीं करता है?

मैंने एक कक्षा बनाई जो काउंटरडाइमर को बढ़ाती है जिसे हर 4 मिनट के इरादे को प्रसारित करना चाहिए।

public class GcmKeepAlive extends CountDownTimer { 

    protected CountDownTimer timer; 
    protected Context mContext; 
    protected Intent gTalkHeartBeatIntent; 
    protected Intent mcsHeartBeatIntent; 


    public GcmKeepAlive(Context context) { 
     super(4*60* 1000,4*60*1000); 
     mContext = context; 
     gTalkHeartBeatIntent = new Intent("com.google.android.intent.action.GTALK_HEARTBEAT"); 
     mcsHeartBeatIntent = new Intent("com.google.android.intent.action.MCS_HEARTBEAT"); 
     System.out.println("stariing heartbeat countdown timer"); 
     this.start(); 
    } 


    @Override 
    public void onTick(long millisUntilFinished) { 

    } 

    @Override 
    public void onFinish() { 
     System.out.println("sending heart beat to keep gcm alive"); 
     mContext.sendBroadcast(gTalkHeartBeatIntent); 
     mContext.sendBroadcast(mcsHeartBeatIntent); 
     this.start(); 

    } 

} 

यहाँ मेरे एप्लिकेशन में सेवा है कि GcmKeepAlive वर्ग

आयात android.app.Service का एक उदाहरण रखती है; आयात android.content.Intent; आयात android.os.IBinder;

public class LocationMonitorService extends Service { 

    private DeviceLocationClient deviceLocationClient; 
    private GcmKeepAlive gcmKeepAlive; 

    @Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     super.onCreate(); 
     System.out.println("creating the LocationMonitorService"); 
     deviceLocationClient = new DeviceLocationClient(this); 
     gcmKeepAlive = new GcmKeepAlive(this); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // TODO Auto-generated method stub 
     System.out.println("inside service making request for location updates"); 
     deviceLocationClient.requestLLocationUpdates(); 
     gcmKeepAlive.start(); 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 


} 

यहां लॉगबैक में दिखाई देने वाले अंतर का एक उदाहरण दिया गया है।

07-13 14:59:05.583 I/System.out(21651): sending heart beat to keep gcm alive 
07-13 15:03:05.640 I/System.out(21651): sending heart beat to keep gcm alive 
07-13 15:07:05.776 I/System.out(21651): sending heart beat to keep gcm alive 
07-13 15:11:05.922 I/System.out(21651): sending heart beat to keep gcm alive 
07-13 15:27:31.994 I/System.out(21651): sending heart beat to keep gcm alive 
+0

यहां उपयोग का मामला महत्वपूर्ण है। क्या यह ऐप के अंदर रह रहा है जब यह होता है, या ऐप कम हो गया है? यदि एप्लिकेशन अग्रभूमि में नहीं है, तो सिस्टम ऐप प्रक्रिया को मारने के लिए स्वतंत्र है, और START_STICK कोई फर्क नहीं पड़ता कि ऐसा होता है। अपनी सेवा http://developer.android.com/reference/android/app/Service पर startForeground का उपयोग करें।एचटीएमएल # startForeground (int,% 20android.app.Notification) यदि आप गारंटी देना चाहते हैं कि इसे मारना न पड़े। –

+0

@ErikZ टिप्पणी के लिए धन्यवाद। मैंने इसे अलार्म मैनेजर का उपयोग करके थोड़ी देर पहले हल किया। मैंने नीचे अपना समाधान पोस्ट किया, लेकिन मारने वाली सेवा निश्चित रूप से अंतराल का कारण बन रही थी। – nPn

+0

मेरे सैमसंग नोट 4 पर काम नहीं करता है, लेकिन मैंने जांच किए गए सभी अन्य उपकरणों (लगभग 10 अलग-अलग डिवाइस) पर पूरी तरह से काम करता है। – FunkSoulBrother

उत्तर

3

मैं वास्तव में कुछ समय पहले इस हल, एरिक जेड की हाल की टिप्पणी मुझे मेरे समाधान पोस्ट करने के लिए बने रहे।

मैंने एक पुनरावर्ती अलार्म बनाकर हल किया जो प्रसारण को ट्रिगर करता है, जो इरादे बनाता है और प्रसारित करता है। अंतराल मूल सेवा के कारण मारे गए और फिर START_STICKY ध्वज के परिणामस्वरूप पुनरारंभ किया गया था।

यहाँ विभिन्न भागों (विभिन्न फाइलों से खींच लिया)

यह बहुत कम से कम पूर्व किटकैट की जरूरत थी, मैं अगर यह अभी भी जरूरत है पता नहीं है कर रहे हैं, मुझे लगता है यह है। हालांकि मैंने पुष्टि करने के लिए इसे बंद नहीं किया है।


अलार्म प्रबंधक, इरादा, और लंबित मंशा।

AlarmManager alarmManager = (AlarmManager) Context.getSystemService(Context.ALARM_SERVICE); 

Intent gcmKeepAliveIntent = new Intent("com.gmail.npnster.ourlatitude.gcmKeepAlive"); 

PendingIntent gcmKeepAlivePendingIntent = PendingIntent.getBroadcast(mContext, 0, gcmKeepAliveIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 1000, 4*60*1000, gcmKeepAlivePendingIntent); 

प्रसारण रिसीवर:

public class GcmKeepAliveBroadcastReceiver extends BroadcastReceiver { 

    private GcmKeepAlive gcmKeepAlive; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     MyLog.p(this,"inside gcm keep alive receiver"); 
     gcmKeepAlive = new GcmKeepAlive(context); 
     gcmKeepAlive.broadcastIntents(); 

    } 

} 

जिंदा वर्ग जीवित प्रसारण रखने भेजता है रहते हैं।

public class GcmKeepAlive { 

    protected Context mContext; 
    protected Intent gTalkHeartBeatIntent; 
    protected Intent mcsHeartBeatIntent; 

    public GcmKeepAlive(Context context) { 
     mContext = context; 
     gTalkHeartBeatIntent = new Intent(
       "com.google.android.intent.action.GTALK_HEARTBEAT"); 
     mcsHeartBeatIntent = new Intent(
       "com.google.android.intent.action.MCS_HEARTBEAT"); 
    } 

    public void broadcastIntents() { 
     MyLog.p(this,"sending heart beat to keep gcm alive"); 
     mContext.sendBroadcast(gTalkHeartBeatIntent); 
     mContext.sendBroadcast(mcsHeartBeatIntent); 
    } 

} 
+0

क्या यह सब कोड आवश्यक है? मुझे अपने ऐप में लॉग "जीसीएम जिंदा रखने के लिए दिल की धड़कन भेजना" नहीं मिल रहा है? – Apqu

+0

फिर फिर से "जीसीएम के अंदर जीवित रिसीवर रखें" – Apqu

संबंधित मुद्दे