Android 推送通知:在点击通知时获取数据、存储和显示新活动
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21871454/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android push notification: Get data, store and display on new activity on click of notification
提问by Manoj Fegde
I am developing an application which is having push notification functionality. I followed the following link as Android Push Notification
我正在开发一个具有推送通知功能的应用程序。我按照以下链接作为Android 推送通知
I tried and successfully send URL and open the web page on click of notification by doing the following change in code of generateNotification().
我尝试并通过在 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);
I am able to send the data with the help of push notification from the server. Now i want to performfollowing tasks:
我能够借助来自服务器的推送通知发送数据。现在我想执行以下任务:
Send JSON data via push notification.
Save the data into SQLite database.
Open new activity on click of push notification.
Display data coming from push notification of new activity.
If the application is closed so after click on notification the app get started.
通过推送通知发送 JSON 数据。
将数据保存到 SQLite 数据库中。
单击推送通知打开新活动。
显示来自新活动推送通知的数据。
如果应用程序已关闭,那么在单击通知后应用程序就会启动。
So please guide me what steps should i follow to perform the above task.
所以请指导我应该遵循哪些步骤来执行上述任务。
回答by Manoj Fegde
I solved the issues as:
我解决了以下问题:
Send JSON data via push notification. A. Able to send the data from SERVER with the help of PHP JSON service of size 4kb.
Save the data into SQLite database. A. Saved the data in SQLite when data comes from push notification in onMessage()
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); }
Open new activity on click of push notification. A. I done this using pending intent in generate notification function called from 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); }
Display data coming from push notification of new activity. A. This achieves as when new activity invokes on click of notification (from above point 3 code) I get data from SQLite in main activity onCreate().
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"; }
If the application is closed so after click on notification the app get started. A. This task is achieved from point no 3.
通过推送通知发送 JSON 数据。A. 可以借助大小为 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); }
单击推送通知打开新活动。A. 我在从 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 点开始的。
回答by CoolMonster
GCMIntentService.java
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);
}
}
Result Activity
结果活动
lap_gcm.java
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
}
}
This code base on the blog you mention i used in one of my application i develop. This will show notification on new notification receive and open a new activity when the user clicked the notification.
此代码基于您提到的我在我开发的应用程序之一中使用的博客。这将在新通知接收时显示通知,并在用户单击通知时打开一个新活动。
Always send don't send all data through push notification. u just send some small message like data then pull the data from the server, once the message received in your device, then store it in db.
始终发送不要通过推送通知发送所有数据。您只需发送一些像数据这样的小消息,然后从服务器中提取数据,一旦您的设备收到消息,然后将其存储在数据库中。
回答by Ajay S
Send JSON data via push notification
通过推送通知发送 JSON 数据
You can send the JSON as data in the notification message from your server side code. Once you get the notification then you would receive a JSON in the message where you can do whatever you want.
您可以从服务器端代码将 JSON 作为数据发送到通知消息中。收到通知后,您将在消息中收到一个 JSON,您可以在其中执行任何您想做的事情。
Save the data into SQLite database
将数据保存到 SQLite 数据库中
This is simple as per your requirement, you can insert the data whatever received in the JSON. You can get the data from the JSON after parsing.
根据您的要求,这很简单,您可以插入 JSON 中收到的任何数据。解析后可以从 JSON 中获取数据。
Open new activity on click of push notification.
单击推送通知打开新活动。
You can do like below
你可以像下面这样
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());
Display data coming from push notification of new activity.
显示来自新活动推送通知的数据。
You can display the data whatever receive from push message but you have to parse the JSON.
您可以显示从推送消息接收到的任何数据,但您必须解析 JSON。
If the application is closed so after click on notification the app get started.
如果应用程序已关闭,那么在单击通知后应用程序就会启动。
My above code will work for you in this case also.
在这种情况下,我上面的代码也适用于您。
See here for JSON parsing : http://www.vogella.com/tutorials/AndroidJSON/article.html
在这里查看 JSON 解析:http: //www.vogella.com/tutorials/AndroidJSON/article.html
All in all, you have to add the data in the JSON form in your server cod that you would get when you push the GCM from the server and later perform parse the JSON and do whatever you want.
总而言之,您必须将数据以 JSON 形式添加到您的服务器代码中,当您从服务器推送 GCM 并稍后执行解析 JSON 并执行您想要的任何操作时,您将获得这些数据。