如何从服务器与 idle/sleeping/locked Android 设备上的客户端应用程序通信?

How to communicate with a client app on an idle/sleeping/locked Android device from server?

我正在尝试弄清楚当设备进入 sleep/idle/locked 时如何从服务器向我的客户端应用程序发送事件操作。

我知道这是可能的,因为我可以看到 Whatsapp/Facebook/Viber 呼叫在来电时立即唤醒设备并启动他们的拨号器 activity。这意味着他们可以与应用程序通信。不仅仅是发送要显示的通知。

目前我已经以我认为是一种解决方法的方式实施了它。我从服务器发送推送通知,然后在客户端应用程序端的 PushBroadCastReceiver 上接收到。然后,此接收器启动我的服务,该服务与我的服务器保持 TCP 连接。此时,我可以通过向 TCP 连接发送 messages/event 操作来开始通过此服务与我的应用程序通信。

它有效,但我觉得这种方式很古怪,他们必须以更好的方式做到这一点。但我想不出一个。谁能帮忙?

谢谢!

我不确定这是否是您想要的,但也许 AlarmManger 就是您要找的。不是从服务器推送到客户端,而是让客户端定期唤醒并从服务器请求信息。这是我用来定期发送位置信息的一段代码。

public class LocationRequestReceiver extends BroadcastReceiver {
    private static final String TAG = "Location Request Receiver";

    public LocationRequestReceiver() {}

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction() == null) {
            WakefulIntentService.sendWakefulWork(context, LocationRequestService.class);
        }
        else {
            scheduleLocationRequestService(context);
        }
    }

    public static void scheduleLocationRequestService(Context context) {
        Log.d(TAG,"Scheduling Location Request Service");
        AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, LocationRequestReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() + Constants.INITIAL_DELAY,
                Constants.PASSIVE_LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS, pendingIntent);

    }
}