我遵循本教程 http://androidsrc.net/android-push-notification-using-google-cloud-messaging-gcm-part-1/ 经过一些改变(因为我使用的是android studio),它可以正常工作^ _ ^
我可以在数据库中成功注册我的设备,并从我的php服务器接收通知......
问题是当设备收到通知栏中显示的通知时...但我想在我的应用程序中收到通知...因为根据消息(在通知中)我的应用程序将执行某些操作... (例如,如果消息“火灾”警报将被启动......等)
我该怎么做?在申请表中收到通知?
这是客户端......(应用程序)
DWORD WINAPI MyThread(LPVOID lpParam)
{
MYSTRUCT *ActiveStruct = (PMYSTRUCT)lpParam; // this is now a pointer
if (lpParam != NULL)
{
std::cout << "1" << std::endl; // Gets printed.
HeapFree(GetProcessHeap(), NULL, lpParam);
std::cout << "2" << std::endl; // Crashes before this line.
}
}
类GCMBroadcastReceiver
public class MainActivity extends Activity {
// Resgistration Id from GCM
private static final String PREF_GCM_REG_ID = "PREF_GCM_REG_ID";
private SharedPreferences prefs;
// Your project number and web server url. Please change below.
private static final String GCM_SENDER_ID = "MY_PROJECT_ID";
private static final String WEB_SERVER_URL = "WEB_PAGE";
GoogleCloudMessaging gcm;
Button registerBtn;
TextView regIdView;
EditText test;
private static final int ACTION_PLAY_SERVICES_DIALOG = 100;
protected static final int MSG_REGISTER_WITH_GCM = 101;
protected static final int MSG_REGISTER_WEB_SERVER = 102;
protected static final int MSG_REGISTER_WEB_SERVER_SUCCESS = 103;
protected static final int MSG_REGISTER_WEB_SERVER_FAILURE = 104;
private String gcmRegId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerBtn = (Button) findViewById(R.id.register_gcmserver);
registerBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Check device for Play Services APK.
if (isGoogelPlayInstalled()) {
gcm = GoogleCloudMessaging.getInstance(getApplicationContext());
// Read saved registration id from shared preferences.
gcmRegId = getSharedPreferences().getString(PREF_GCM_REG_ID, "");
if (TextUtils.isEmpty(gcmRegId)) {
handler.sendEmptyMessage(MSG_REGISTER_WITH_GCM);
}else{
regIdView.setText(gcmRegId);
test.setText(gcmRegId);
Toast.makeText(getApplicationContext(), "Already registered with GCM", Toast.LENGTH_SHORT).show();
}
}
}
});
regIdView = (TextView) findViewById(R.id.regId);
test = (EditText) findViewById(R.id.editText);
}
private boolean isGoogelPlayInstalled() {
int resultCode = GooglePlayServicesUtil
.isGooglePlayServicesAvailable(this);
if (resultCode != ConnectionResult.SUCCESS) {
if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
GooglePlayServicesUtil.getErrorDialog(resultCode, this,
ACTION_PLAY_SERVICES_DIALOG).show();
} else {
Toast.makeText(getApplicationContext(),
"Google Play Service is not installed",
Toast.LENGTH_SHORT).show();
finish();
}
return false;
}
return true;
}
private SharedPreferences getSharedPreferences() {
if (prefs == null) {
prefs = getApplicationContext().getSharedPreferences(
"AndroidSRCDemo", Context.MODE_PRIVATE);
}
return prefs;
}
public void saveInSharedPref(String result) {
// TODO Auto-generated method stub
Editor editor = getSharedPreferences().edit();
editor.putString(PREF_GCM_REG_ID, result);
editor.commit();
}
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case MSG_REGISTER_WITH_GCM:
new GCMRegistrationTask().execute();
break;
case MSG_REGISTER_WEB_SERVER:
new WebServerRegistrationTask().execute();
break;
case MSG_REGISTER_WEB_SERVER_SUCCESS:
Toast.makeText(getApplicationContext(),
"registered with web server", Toast.LENGTH_LONG).show();
break;
case MSG_REGISTER_WEB_SERVER_FAILURE:
Toast.makeText(getApplicationContext(),
"registration with web server failed",
Toast.LENGTH_LONG).show();
break;
}
};
};
private class GCMRegistrationTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
// TODO Auto-generated method stub
if (gcm == null && isGoogelPlayInstalled()) {
gcm = GoogleCloudMessaging.getInstance(getApplicationContext());
}
try {
gcmRegId = gcm.register(GCM_SENDER_ID);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return gcmRegId;
}
@Override
protected void onPostExecute(String result) {
if (result != null) {
Toast.makeText(getApplicationContext(), "registered with GCM",
Toast.LENGTH_LONG).show();
regIdView.setText(result);
saveInSharedPref(result);
handler.sendEmptyMessage(MSG_REGISTER_WEB_SERVER);
}
}
}
private class WebServerRegistrationTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
URL url = null;
try {
url = new URL(WEB_SERVER_URL);
} catch (MalformedURLException e) {
e.printStackTrace();
handler.sendEmptyMessage(MSG_REGISTER_WEB_SERVER_FAILURE);
}
Map<String, String> dataMap = new HashMap<String, String>();
dataMap.put("regId", gcmRegId);
StringBuilder postBody = new StringBuilder();
Iterator iterator = dataMap.entrySet().iterator();
while (iterator.hasNext()) {
Entry param = (Entry) iterator.next();
postBody.append(param.getKey()).append('=')
.append(param.getValue());
if (iterator.hasNext()) {
postBody.append('&');
}
}
String body = postBody.toString();
byte[] bytes = body.getBytes();
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setFixedLengthStreamingMode(bytes.length);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded;charset=UTF-8");
OutputStream out = conn.getOutputStream();
out.write(bytes);
out.close();
int status = conn.getResponseCode();
if (status == 200) {
// Request success
handler.sendEmptyMessage(MSG_REGISTER_WEB_SERVER_SUCCESS);
} else {
throw new IOException("Request failed with error code "
+ status);
}
} catch (ProtocolException pe) {
pe.printStackTrace();
handler.sendEmptyMessage(MSG_REGISTER_WEB_SERVER_FAILURE);
} catch (IOException io) {
io.printStackTrace();
handler.sendEmptyMessage(MSG_REGISTER_WEB_SERVER_FAILURE);
} finally {
if (conn != null) {
conn.disconnect();
}
}
return null;
}
}
}
类GCMIntentService
public class GCMBroadcastReceiver extends WakefulBroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// Attach component of GCMIntentService that will handle the intent in background thread
ComponentName comp = new ComponentName(context.getPackageName(),
GCMIntentService.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
这里是发送消息的php文件......
device_sendmsg.php
public class GCMIntentService extends IntentService {
public static final int NOTIFICATION_ID = 1000;
NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
public GCMIntentService() {
super(GCMIntentService.class.getName());
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
if (!extras.isEmpty()) {
// read extras as sent from server
String message = extras.getString("message");
String serverTime = extras.getString("timestamp");
sendNotification("Message: " + message + "\n" + "Server Time: "
+ serverTime);
}
// Release the wake lock provided by the WakefulBroadcastReceiver.
GCMBroadcastReceiver.completeWakefulIntent(intent);
}
private void sendNotification(String msg) {
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, MainActivity.class), 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
this).setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Notification from GCM")
.setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
.setContentText(msg);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}
}
gcm_sendmsg.php
<?php
if (isset($_POST["regId"]) && isset($_POST["message"])) {
$regId = $_POST["regId"];
$message = $_POST["message"];
include_once './gcm_sendmsg.php';
$gcm = new GCM_SendMsg();
$registatoin_ids = array($regId);
$message = array("message"=>$message, "timestamp"=>"04-01-2016");
$result = $gcm->send_notification($registatoin_ids, $message);
echo $result;
}
?>
希望有人可以帮助我^ _ ^
答案 0 :(得分:0)
注意:您应该在Android上使用推荐的GCM库,play-services-gcm作为Google Play服务的一部分提供。查看示例here。
对于您的特定问题:看起来您正在“在您的应用程序中”收到通知,但是当您收到应用程序正在生成系统通知时。
查看onHandleIntent
中的GCMIntentService
方法,它会调用生成系统通知的方法sendNotification
。您可以将sendNotification调用替换为收到消息时所需的任何其他自定义行为。