2014-07-13 21 views
5

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 
+0

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. –

+0

@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

+0

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

Trả lời

3

Tôi thực sự đã giải quyết điều này một thời gian trước đây, bình luận gần đây của Erik Z vẫn cho tôi đăng giải pháp của mình.

Tôi đã giải quyết vấn đề này bằng cách tạo báo thức định kỳ kích hoạt chương trình phát sóng, tạo và phát các ý định. Các khoảng trống do dịch vụ gốc bị giết và sau đó được khởi động lại do cờ START_STICKY.

Dưới đây là các phần khác nhau (kéo từ các tập tin khác nhau)

này là cần thiết trước kitkat ít nhất, tôi không biết nếu nó vẫn là cần thiết, tôi giả sử nó được. Tôi chưa tắt nó để xác nhận.


Trình quản lý báo động, mục đích và mục đích đang chờ xử lý.

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); 

Việc phát sóng nhận:

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(); 

    } 

} 

Các lớp giữ còn sống mà gửi giữ chương trình phát sóng sống.

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

Đây có phải là mã được yêu cầu không? Tôi không nhận được "gửi nhịp tim để giữ cho gcm sống" đăng nhập vào ứng dụng của tôi? – Apqu

+0

Sau đó, một lần nữa không nhận được "bên trong gcm giữ sống nhận" hoặc là – Apqu

Các vấn đề liên quan