我的Android设备优化了我的应用。所以我的应用程序在后台睡觉,但如果收到优先级GCM消息,它应该被唤醒。作为状态here:
高优先级。 GCM尝试提供高优先级消息 立即,允许GCM服务唤醒睡眠设备 可能并打开与您的应用服务器的网络连接。应用程序 例如,通常的即时消息,聊天或语音呼叫警报 需要打开网络连接并确保GCM提供 消息延迟到设备。
和here:
GCM经过优化,可以通过手段与Doze和App Standby空闲模式配合使用 高优先级GCM消息。 GCM高优先级消息让您 可靠地唤醒您的应用程序以访问网络,即使用户的 设备处于Doze状态或应用程序处于App Standby模式。在Doze或App 待机模式,系统传递消息并提供应用程序 然后,临时访问网络服务和部分唤醒锁 将设备或应用程序返回空闲状态。
我使用此代码将优先级消息从我的C#服务器发送到Android设备:
private string SendMessageUsingGCM(String sRegistrationId, string sTextToSend, string sCollapseKey)
{
String GCM_URL = @"https://gcm-http.googleapis.com/gcm/send";
bool flag = false;
string sError = "";
StringBuilder sb = new StringBuilder();
sb.AppendFormat("registration_id={0}&collapse_key={1}", sRegistrationId, sCollapseKey);
sb.AppendFormat("&delay_while_idle=0&priority=high");
sb.AppendFormat("&data.msg=" + HttpUtility.UrlEncode(sTextToSend)); //Para poder enviar caracteres especiales como ä, ë, arábigos...
string msg = sb.ToString();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(GCM_URL);
req.Method = "POST";
req.ContentLength = msg.Length;
req.ContentType = "application/x-www-form-urlencoded";
req.Timeout = 20000;
req.Headers.Add("Authorization:key=" + MyAthorizationKey);
try
{
using (StreamWriter oWriter = new StreamWriter(req.GetRequestStream()))
{
oWriter.Write(msg);
}
using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
{
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
string respData = sr.ReadToEnd();
if (resp.StatusCode == HttpStatusCode.OK) // OK = 200
{
if (respData.StartsWith("id="))
flag = true;
else
sError = respData;
}
else if (resp.StatusCode == HttpStatusCode.InternalServerError) // 500
sError = "Internal server error. Try later.";
else if (resp.StatusCode == HttpStatusCode.ServiceUnavailable) // 503
sError = "Server not available temnporatily. Try later.";
else if (resp.StatusCode == HttpStatusCode.Unauthorized) // 401
sError = "The API Key is not valid.";
else
sError = "Error: " + resp.StatusCode;
}
}
}
catch (WebException e)
{ //The remote server returned an error: (502) Bad Gateway. //Más info: http://stackoverflow.com/questions/2159361/error-502-bad-gateway-when-sending-a-request-with-httpwebrequest-over-ssl
//The remote server returned an error: (500) Internal Server Error. Más info: http://stackoverflow.com/questions/4098945/500-internal-server-error-at-getresponse
sError = "WebException: " + e.ToString();
}
catch (Exception e)
{
sError = "Exception: " + e.ToString();
}
if (flag == true)
return "Ok";
return "Error " + sError;
}
但我的应用程序没有醒来。即使我解锁了设备。
我发现,一旦我的设备“阻止”我的应用程序进入优化列表,那么我的应用程序将不会再收到任何消息。系统似乎只是完全杀死应用程序,它不会收到任何GCM消息。我正在使用带棒棒糖的Galaxy S4。有什么帮助吗?
答案 0 :(得分:1)
纯文本格式不支持邮件优先级。您需要使用application / json格式来使用优先级字段。