Android推送通知:通过点击通知获取数据,存储和显示新活动

时间:2014-02-19 04:59:44

标签: android notifications push-notification google-cloud-messaging android-notifications

我正在开发一个具有推送通知功能的应用程序。我按照以下链接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);

我可以在服务器的推送通知的帮助下发送数据。 现在我想要执行以下任务:

  1. 通过推送通知发送JSON数据。

  2. 将数据保存到SQLite数据库中。

  3. 点击推送通知时打开新活动。

  4. 显示来自新活动推送通知的数据。

  5. 如果应用程序已关闭,请点击通知后启动应用程序。

  6. 因此,请指导我应该遵循哪些步骤来执行上述任务。

3 个答案:

答案 0 :(得分:11)

我解决了以下问题:

  1. 通过推送通知发送JSON数据。 答:能够在4kb的PHP JSON服务的帮助下从SERVER发送数据。

  2. 将数据保存到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);
    }
    
  3. 点击推送通知时打开新活动。 答:我使用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);     
    }
    
  4. 显示来自新活动推送通知的数据。 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";
    }
    
  5. 如果应用程序已关闭,请点击通知后启动应用程序。 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并执行您想要的任何操作时,您将获得该数据。