如何在通知单击时打开带有效数据的应用程序特定页面

时间:2016-01-30 07:03:52

标签: android cordova

我正在开发一个cordova应用程序,其中我使用phonegap推送插件发送gcm通知。我正在尝试打开应用程序的特定页面,其中包含通知点击时收到通知的有效负载数据。

我的有效负载数据的服务器端代码

$messageData = array('message' => $Msg, 'title' => $Sub, 'notId' => $gcm_notid, 'timestamp' => $n_createdOn, 'sender' => $Sender, 'receiver' => $Receiver);

推送插件代码是:

GCMIntentService.java

package com.plugin.gcm;

import org.json.JSONException;
import org.json.JSONObject;

import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import com.google.android.gcm.GCMBaseIntentService;

@SuppressLint("NewApi")
public class GCMIntentService extends GCMBaseIntentService {

private static final String TAG = "GCMIntentService";

public GCMIntentService() {
    super("GCMIntentService");
}

@Override
public void onRegistered(Context context, String regId) {

    Log.v(TAG, "onRegistered: "+ regId);

    JSONObject json;

    try
    {
        json = new JSONObject().put("event", "registered");
        json.put("regid", regId);

        Log.v(TAG, "onRegistered: " + json.toString());

        // Send this JSON data to the JavaScript application above EVENT should be set to the msg type
        // In this case this is the registration ID
        PushPlugin.sendJavascript( json );

    }
    catch( JSONException e)
    {
        // No message to the user is sent, JSON failed
        Log.e(TAG, "onRegistered: JSON exception");
    }
}

@Override
public void onUnregistered(Context context, String regId) {
    Log.d(TAG, "onUnregistered - regId: " + regId);
}

@Override
protected void onMessage(Context context, Intent intent) {
    Log.d(TAG, "onMessage - context: " + context);

    // Extract the payload from the message
    Bundle extras = intent.getExtras();
    if (extras != null)
    {
        // if we are in the foreground, just surface the payload, else post it to the statusbar
        if (PushPlugin.isInForeground()) {
            extras.putBoolean("foreground", true);
            PushPlugin.sendExtras(extras);
        }
        else {
            extras.putBoolean("foreground", false);

            // Send a notification if there is a message
            if (extras.getString("message") != null && extras.getString("message").length() != 0) {
                createNotification(context, extras);
            }
        }
    }
}

public void createNotification(Context context, Bundle extras)
{
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    String appName = getAppName(this);

    Intent notificationIntent = new Intent(this, PushHandlerActivity.class);




    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    notificationIntent.putExtra("pushBundle", extras);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    int defaults = Notification.DEFAULT_ALL;

    if (extras.getString("defaults") != null) {
        try {
            defaults = Integer.parseInt(extras.getString("defaults"));
        } catch (NumberFormatException e) {}
    }

    NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(context)
            .setDefaults(defaults)
            .setSmallIcon(context.getApplicationInfo().icon)
            .setWhen(System.currentTimeMillis())
            .setContentTitle(extras.getString("title"))
            .setTicker(extras.getString("title"))
            .setContentIntent(contentIntent)
            .setAutoCancel(true);

    String message = extras.getString("message");
    if (message != null) {
        mBuilder.setContentText(message);
    } else {
        mBuilder.setContentText("<missing message content>");
    }

    String msgcnt = extras.getString("msgcnt");
    if (msgcnt != null) {
        mBuilder.setNumber(Integer.parseInt(msgcnt));
    }

    int notId = 0;

    try {
        notId = Integer.parseInt(extras.getString("notId"));
    }
    catch(NumberFormatException e) {
        Log.e(TAG, "Number format exception - Error parsing Notification ID: " + e.getMessage());
    }
    catch(Exception e) {
        Log.e(TAG, "Number format exception - Error parsing Notification ID" + e.getMessage());
    }

    mNotificationManager.notify((String) appName, notId, mBuilder.build());
}

private static String getAppName(Context context)
{
    CharSequence appName = 
            context
                .getPackageManager()
                .getApplicationLabel(context.getApplicationInfo());

    return (String)appName;
}

@Override
public void onError(Context context, String errorId) {
    Log.e(TAG, "onError - errorId: " + errorId);
}

}

PushHandlerActivity.java

package com.plugin.gcm;

import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;

public class PushHandlerActivity extends Activity
{
private static String TAG = "PushHandlerActivity"; 

/*
 * this activity will be started if the user touches a notification   that  we own. 
 * We send it's data off to the push plugin for processing.
 * If needed, we boot up the main activity to kickstart the application. 
 * @see android.app.Activity#onCreate(android.os.Bundle)
 */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    Log.v(TAG, "onCreate");

    boolean isPushPluginActive = PushPlugin.isActive();
    processPushBundle(isPushPluginActive);

    finish();

    if (!isPushPluginActive) {
        forceMainActivityReload();
    }
}

/**
 * Takes the pushBundle extras from the intent, 
 * and sends it through to the PushPlugin for processing.
 */
private void processPushBundle(boolean isPushPluginActive)
{
    Bundle extras = getIntent().getExtras();

    if (extras != null) {
        Bundle originalExtras = extras.getBundle("pushBundle");

        originalExtras.putBoolean("foreground", false);
        originalExtras.putBoolean("coldstart", !isPushPluginActive);

        PushPlugin.sendExtras(originalExtras);
    }
}

/**
 * Forces the main activity to re-launch if it's unloaded.
 */
private void forceMainActivityReload()
{
    PackageManager pm = getPackageManager();
    Intent launchIntent =   pm.getLaunchIntentForPackage(getApplicationContext().getPackageName());         
    startActivity(launchIntent);
}

@Override
protected void onResume() {
super.onResume();
 final NotificationManager notificationManager =  (NotificationManager)     this.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancelAll();
}

}

1 个答案:

答案 0 :(得分:1)

GCMIntentService.java

package com.plugin.gcm;

import org.json.JSONException;
import org.json.JSONObject;

import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.support.v4.app.TaskStackBuilder;
import android.net.Uri;

import com.google.android.gcm.GCMBaseIntentService;

@SuppressLint("NewApi")
public class GCMIntentService extends GCMBaseIntentService {

private static final String TAG = "GCMIntentService";


public GCMIntentService() {
    super("GCMIntentService");
}

@Override
public void onRegistered(Context context, String regId) {

    Log.v(TAG, "onRegistered: "+ regId);

    JSONObject json;

    try
    {
        json = new JSONObject().put("event", "registered");
        json.put("regid", regId);

        Log.v(TAG, "onRegistered: " + json.toString());

        // Send this JSON data to the JavaScript application above EVENT  should be set to the msg type
        // In this case this is the registration ID
        PushPlugin.sendJavascript( json );

    }
    catch( JSONException e)
    {
        // No message to the user is sent, JSON failed
        Log.e(TAG, "onRegistered: JSON exception");
    }
}

@Override
public void onUnregistered(Context context, String regId) {
    Log.d(TAG, "onUnregistered - regId: " + regId);
}

@Override
protected void onMessage(Context context, Intent intent) {
    Log.d(TAG, "onMessage - context: " + context);

    // Extract the payload from the message
    Bundle extras = intent.getExtras();
    if (extras != null)
    {
        // if we are in the foreground, just surface the payload, else post it to the statusbar
        if (PushPlugin.isInForeground()) {
            extras.putBoolean("foreground", true);
            PushPlugin.sendExtras(extras);
        }
        else {
            extras.putBoolean("foreground", false);

            // Send a notification if there is a message
            if (extras.getString("message") != null &&    extras.getString("message").length() != 0) {
                createNotification(context, extras);
            }
        }
    }
}

public void createNotification(Context context, Bundle extras)
{
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    String appName = getAppName(this);

    Intent notificationIntent = new Intent(this, PushHandlerActivity.class);

    //////////   send extra payload data to notificationIntent /////////

    String timestamp = extras.getString("timestamp");
    notificationIntent.setData(new Uri.Builder().scheme("data").appendQueryParameter("timestamp", timestamp).build());   //  set payload data for different notifications

    String sender = extras.getString("sender");

    notificationIntent.putExtra("timestamp",timestamp);
    notificationIntent.putExtra("sender", sender);


    ///////////////////////////////////////////////////////////////////


    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    notificationIntent.putExtra("pushBundle", extras);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    int defaults = Notification.DEFAULT_ALL;

    if (extras.getString("defaults") != null) {
        try {
            defaults = Integer.parseInt(extras.getString("defaults"));
        } catch (NumberFormatException e) {}
    }
    //////////////   set stack for different notifications ///////////

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    // Adds the back stack for the Intent (but not the Intent itself)
    stackBuilder.addParentStack(PushHandlerActivity.class);
    // Adds the Intent that starts the Activity to the top of the stack
    stackBuilder.addNextIntent(notificationIntent);

    //////////////////////////////////////////////////////////////////


    NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(context)
            .setDefaults(defaults)
            .setSmallIcon(context.getApplicationInfo().icon)
            .setWhen(System.currentTimeMillis())
            .setContentTitle(extras.getString("title"))
            .setTicker(extras.getString("title"))
            .setContentIntent(contentIntent)
            .setAutoCancel(true);

    String message = extras.getString("message");
    if (message != null) {
        mBuilder.setContentText(message);
    } else {
        mBuilder.setContentText("<missing message content>");
    }

    String msgcnt = extras.getString("msgcnt");
    if (msgcnt != null) {
        mBuilder.setNumber(Integer.parseInt(msgcnt));
    }

    int notId = 0;

    try {
        notId = Integer.parseInt(extras.getString("notId"));
    }
    catch(NumberFormatException e) {
        Log.e(TAG, "Number format exception - Error parsing Notification ID: " + e.getMessage());
    }
    catch(Exception e) {
        Log.e(TAG, "Number format exception - Error parsing Notification ID" + e.getMessage());
    }

    //mNotificationManager.notify((String) appName, notId, timestamp, sender, receiver, mBuilder.build());

    mNotificationManager.notify((String) appName, notId, mBuilder.build());
}

private static String getAppName(Context context)
{
    CharSequence appName = 
            context
                .getPackageManager()
                .getApplicationLabel(context.getApplicationInfo());

    return (String)appName;
}

@Override
public void onError(Context context, String errorId) {
    Log.e(TAG, "onError - errorId: " + errorId);
}

}

PushHandlerActivity.java

package com.plugin.gcm;

import org.apache.cordova.*;

import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast; 
import android.os.Handler;



public class PushHandlerActivity extends CordovaActivity
{

private static String TAG = "PushHandlerActivity"; 

Bundle extras;
String timestamp;
String sender;
String f = "";

/*
 * this activity will be started if the user touches a notification that we own. 
 * We send it's data off to the push plugin for processing.
 * If needed, we boot up the main activity to kickstart the application. 
 * @see android.app.Activity#onCreate(android.os.Bundle)
 */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    Log.v(TAG, "onCreate");

    loadUrl("file:///android_asset/www/notification_inside.html");  

    /////  show additional payload data  //////////
        extras = getIntent().getExtras();
        timestamp = extras.getString("timestamp");
        sender = extras.getString("sender");

        /* Toast.makeText(getApplicationContext(),timestamp,
        Toast.LENGTH_LONG).show();

        Toast.makeText(getApplicationContext(),sender,
        Toast.LENGTH_LONG).show(); */    

        f = "";

        final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    // Do something after 5s = 5000ms
                    loadUrl("javascript:set_ndata('"+timestamp+"', '"+sender+"')");
                }
            }, 1000);

        //////////////////////////////////////////

/*  boolean isPushPluginActive = PushPlugin.isActive();
    processPushBundle(isPushPluginActive);

    finish();

    if (!isPushPluginActive) {
        //forceMainActivityReload();            

    }  */

}




/**
 * Takes the pushBundle extras from the intent, 
 * and sends it through to the PushPlugin for processing.
 */
private void processPushBundle(boolean isPushPluginActive)
{
    Bundle extras = getIntent().getExtras();

    if (extras != null) {
        Bundle originalExtras = extras.getBundle("pushBundle");

        originalExtras.putBoolean("foreground", false);
        originalExtras.putBoolean("coldstart", !isPushPluginActive);

        PushPlugin.sendExtras(originalExtras);

    }
}

/**
 * Forces the main activity to re-launch if it's unloaded.
 */
private void forceMainActivityReload()
{
    PackageManager pm = getPackageManager();

    Intent launchIntent = pm.getLaunchIntentForPackage(getApplicationContext().getPackageName());           
    startActivity(launchIntent);
}


@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);

f = "1";
}


@Override
protected void onResume() {
super.onResume();
/* final NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancelAll();    */    

if(f!="")
{
    loadUrl("file:///android_asset/www/notification_inside.html");      
    /////  show additional payload data  //////////

    extras = getIntent().getExtras();
    timestamp = extras.getString("timestamp");
    sender = extras.getString("sender");

    final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    // Do something after 5s = 5000ms
                    loadUrl("javascript:set_ndata('"+timestamp+"', '"+sender+"')");
                }
            }, 1000);

        /* Toast.makeText(getApplicationContext(),timestamp,
        Toast.LENGTH_LONG).show();

        Toast.makeText(getApplicationContext(),sender,
        Toast.LENGTH_LONG).show(); */

        f = "";
        ////////////////////////////////////////////// 
}

} 

}

html文件中的Javascript函数

function set_ndata(t,s)
{
 alert(t);
 alert(n);
}