मैं जीसीएम समय के बाहर काम करने की कोशिश कर रहा हूं, इस विषय पर कई धागे हैं, संदर्भ के लिए 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
यहां उपयोग का मामला महत्वपूर्ण है। क्या यह ऐप के अंदर रह रहा है जब यह होता है, या ऐप कम हो गया है? यदि एप्लिकेशन अग्रभूमि में नहीं है, तो सिस्टम ऐप प्रक्रिया को मारने के लिए स्वतंत्र है, और START_STICK कोई फर्क नहीं पड़ता कि ऐसा होता है। अपनी सेवा http://developer.android.com/reference/android/app/Service पर startForeground का उपयोग करें।एचटीएमएल # startForeground (int,% 20android.app.Notification) यदि आप गारंटी देना चाहते हैं कि इसे मारना न पड़े। –
@ErikZ टिप्पणी के लिए धन्यवाद। मैंने इसे अलार्म मैनेजर का उपयोग करके थोड़ी देर पहले हल किया। मैंने नीचे अपना समाधान पोस्ट किया, लेकिन मारने वाली सेवा निश्चित रूप से अंतराल का कारण बन रही थी। – nPn
मेरे सैमसंग नोट 4 पर काम नहीं करता है, लेकिन मैंने जांच किए गए सभी अन्य उपकरणों (लगभग 10 अलग-अलग डिवाइस) पर पूरी तरह से काम करता है। – FunkSoulBrother