我正在开发一个具有推送通知功能的应用程序。我按照以下链接Android Push Notification
我尝试通过在generateNotification()代码中进行以下更改,成功发送URL并点击通知打开网页。
/**
* Issues a notification to inform the user that server has sent a message.
*/
private static void generateNotification(Context context, String message) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.ic_launcher, "Message received", System.currentTimeMillis());
// Hide the notification after its selected
notification.flags |= Notification.FLAG_AUTO_CANCEL;
//adding LED lights to notification
notification.defaults |= Notification.DEFAULT_LIGHTS;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(message));
//startActivity(browserIntent);
//PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
notification.setLatestEventInfo(context, "Message", "New message received", pendingIntent);
notificationManager.notify(0, notification);
我可以在服务器的推送通知的帮助下发送数据。 现在我想要执行以下任务:
通过推送通知发送JSON数据。
将数据保存到SQLite数据库中。
点击推送通知时打开新活动。
显示来自新活动推送通知的数据。
如果应用程序已关闭,请点击通知后启动应用程序。
因此,请指导我应该遵循哪些步骤来执行上述任务。
答案 0 :(得分:11)
我解决了以下问题:
通过推送通知发送JSON数据。 答:能够在4kb的PHP JSON服务的帮助下从SERVER发送数据。
将数据保存到SQLite数据库中。 A.当数据来自onMessage()
中的推送通知时,在SQLite中保存数据protected void onMessage(Context context, Intent intent) {
Log.i(TAG, "Received message");
String message = intent.getExtras().getString("price");
Log.d("OnMSG",message);
displayMessage(context, message);
DataBaseHelper dataBaseHelper = new DataBaseHelper(context);
dataBaseHelper.openDataBase();
dataBaseHelper.insertData(message);
dataBaseHelper.close();
// notifies user
generateNotification (context, message);
}
点击推送通知时打开新活动。 答:我使用onMessage()调用的生成通知函数中的待定意图来完成此操作。
private static void generateNotification(Context context, String message) {
int icon = R.drawable.ic_launcher;
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);
String title = context.getString(R.string.app_name);
Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.putExtra("ms", message);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(context, title, message, intent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
notificationManager.notify(0, notification);
}
显示来自新活动推送通知的数据。 A.这实现了当新活动在点击通知时调用(从第3点代码开始)我从主要活动onCreate()中获取SQLite数据。
DataBaseHelper dataBaseHelper = new DataBaseHelper(this);
dataBaseHelper.openDataBase();
Cursor c = dataBaseHelper.getData();
String data = null;
if(c.getCount()>0){
if(c.moveToFirst()){
do{
data = c.getString(0);
} while(c.moveToNext());
}
} else {
data = "No Data";
}
如果应用程序已关闭,请点击通知后启动应用程序。 A.此任务从第3点开始实现。
答案 1 :(得分:3)
<强> GCMIntentService.java 强>
import com.google.android.gcm.GCMBaseIntentService;
import com.google.android.gcm.GCMRegistrar;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.util.Log;
/**
* IntentService responsible for handling GCM messages.
*/
public class GCMIntentService extends GCMBaseIntentService {
@SuppressWarnings("hiding")
private static final String TAG = "GCMIntentService";
public GCMIntentService() {
super(SENDER_ID);
}
@Override
protected void onRegistered(Context context, String registrationId) {
Log.i(TAG, "Device registered: regId = " + registrationId);
displayMessage(context,"onregisterd");
ServerUtilities.register(context, registrationId);
}
@Override
protected void onUnregistered(Context context, String registrationId) {
Log.i(TAG, "Device unregistered");
displayMessage(context, "GCM unregistered");
if (GCMRegistrar.isRegisteredOnServer(context)) {
ServerUtilities.unregister(context, registrationId);
} else {
// This callback results from the call to unregister made on
// ServerUtilities when the registration to the server failed.
Log.i(TAG, "Ignoring unregister callback");
}
}
@Override
protected void onMessage(Context context, Intent intent) {
Log.i(TAG, "Received message");
String message =intent.getExtras().getString("message");
displayMessage(context, message);
// notifies user
generateNotification(context,message );
}
@Override
protected void onDeletedMessages(Context context, int total) {
Log.i(TAG, "Received deleted messages notification");
String message = ("total deleted"+ total);
displayMessage(context, message);
// notifies user
generateNotification(context, message);
}
@Override
public void onError(Context context, String errorId) {
Log.i(TAG, "Received error: " + errorId);
displayMessage(context, ("error:"+ errorId));
}
@Override
protected boolean onRecoverableError(Context context, String errorId) {
// log message
Log.i(TAG, "Received recoverable error: " + errorId);
displayMessage(context, ("Recover error:"+ errorId));
return super.onRecoverableError(context, errorId);
}
/**
* Issues a notification to inform the user that server has sent a message.
*/
private static void generateNotification(Context context, String message) {
int icon = R.drawable.icon;
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, "Dear Customer , New Product has been Launched", when);
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
notification.sound=soundUri;
String title = context.getString(R.string.app_name);
Intent notificationIntent = new Intent(context, lap_gcm.class);
notificationIntent.putExtra("message", message);
// set intent so it does not start a new activity
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent =
PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(context, title, message, intent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, notification);
}
}
结果活动
<强> lap_gcm.java 强>
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
public class lap_gcm extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
String message=getIntent().getStringExtra("message");
//Here is Your message
}
}
此代码基于您提到的我在我开发的应用程序中使用的博客。这将显示有关新通知接收的通知,并在用户点击通知时打开新活动。
始终发送不通过推送通知发送所有数据。你只需发送一些像数据这样的小消息,然后在设备收到消息后从服务器中提取数据,然后将其存储在数据库中。
答案 2 :(得分:1)
通过推送通知发送JSON数据
您可以从服务器端代码发送通知消息中的JSON作为数据。收到通知后,您将在邮件中收到JSON,您可以随意执行任何操作。
将数据保存到SQLite数据库
根据您的要求,这很简单,您可以插入JSON中收到的任何数据。解析后,您可以从JSON获取数据。
点击推送通知时打开新活动。
你可以这样做
mNotificationManager = (NotificationManager)
this.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, YourActivity.class), 0);
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_stat_gcm)
.setContentTitle("GCM Notification")
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(msg))
.setContentText(msg);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
显示来自新活动推送通知的数据。
您可以显示从推送消息接收的数据,但您必须解析JSON。
如果应用程序已关闭,请点击通知后启动应用程序。
在这种情况下,我的上述代码也适合您。
请参阅此处了解JSON解析:http://www.vogella.com/tutorials/AndroidJSON/article.html
总而言之,您必须在服务器代码中添加JSON表单中的数据,当您从服务器推送GCM并稍后执行解析JSON并执行您想要的任何操作时,您将获得该数据。