【问题标题】:How to open app specific page with payload data on notification click如何在通知点击时打开带有有效负载数据的应用程序特定页面
【发布时间】:2016-02-03 15:35:53
【问题描述】:

我正在开发一个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();
}

}

【问题讨论】:

    标签: android cordova


    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 2019-08-22
      • 2018-09-26
      • 1970-01-01
      • 2019-05-04
      相关资源
      最近更新 更多