Tôi đang cố gắng giải quyết vấn đề thời gian gcm, có nhiều chủ đề về chủ đề này, đây là one để tham khảo.Gặp sự cố khi giữ Google Cloud Message còn sống
Giải pháp được đề xuất là phát một cặp ý định tại một khoảng thời gian ngắn hơn thời gian chờ tcp.
Triển khai của tôi là tạo một lớp mở rộng lớp CountDownTimer và giữ một thể hiện của lớp đó trong một dịch vụ hiện có. Lớp dẫn xuất này khởi động lại chính nó khi nó được hoàn thành và dịch vụ được đánh dấu là STICKY_START, vì vậy khi bắt đầu, tôi sẽ nghĩ rằng nó chỉ nên tiếp tục phát sóng ý định sau mỗi 4 phút, nhưng vì một số lý do có những khoảng trống, khi bộ đếm không phát sóng ý định và tôi vẫn tiếp xúc lỏng lẻo với máy chủ GCM.
Hai lớp có liên quan dưới đây. Bất cứ ai có thể giải thích và cung cấp một giải pháp là tại sao chiến lược này không hoạt động?
Tôi đã tạo một lớp mở rộng CounDownTimer sẽ phát các ý định sau mỗi 4 phút.
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();
}
}
đây là dịch vụ trong ứng dụng của tôi chứa một thể hiện của lớp GcmKeepAlive
nhập khẩu android.app.Service; nhập android.content.Intent; nhập 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;
}
}
Dưới đây là ví dụ về khoảng cách như đã thấy trong logcat.
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
Trường hợp sử dụng ở đây rất quan trọng. Bạn có đang ở trong ứng dụng khi điều này xảy ra hay là ứng dụng được thu nhỏ? Hệ thống này là miễn phí để giết các quá trình ứng dụng nếu ứng dụng không ở phía trước, và START_STICKY sẽ không quan trọng nếu điều đó xảy ra. Sử dụng startForeground trên dịch vụ của bạn http://developer.android.com/reference/android/app/Service.html # startForeground (int,% 20android.app.Notification) nếu bạn muốn đảm bảo không bị giết. –
@ErikZ Cảm ơn nhận xét. Tôi đã giải quyết vấn đề này trong khi quay lại bằng cách sử dụng trình quản lý báo thức. Tôi đã đăng giải pháp của mình bên dưới, nhưng dịch vụ bị giết chắc chắn đã gây ra những khoảng trống. – nPn
Không hoạt động trên Samsung Note 4 của tôi, nhưng hoạt động hoàn hảo trên tất cả các thiết bị khác mà tôi đã kiểm tra (khoảng 10 thiết bị khác nhau). – FunkSoulBrother