Android - 使用收到的推送通知

时间:2014-01-02 16:11:49

标签: php android parsing curl push-notification

我一直在我的Android应用程序上尝试Parse.com的推送通知。 我还写了一个PHP文件来发送通知,到目前为止它运行良好。 现在我想知道如何将我的Android应用程序中收到的消息用作变量。

我的PHP文件是这样的:

<?php 
$APPLICATION_ID = "xxxxx";
$REST_API_KEY = "xxxxx";
$MESSAGE = "Test 123";


$url = 'https://api.parse.com/1/push';
$data = array(
    'where' => '{}',   
    'expiry' => 1451606400,
    'data' => array(
        'alert' => $MESSAGE,
    ),
);
$_data = json_encode($data);
$headers = array(
    'X-Parse-Application-Id: ' . $APPLICATION_ID,
    'X-Parse-REST-API-Key: ' . $REST_API_KEY,
    'Content-Type: application/json',
    'Content-Length: ' . strlen($_data),
);

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $_data);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_exec($curl);
?>


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>Send Push</title>
</head>
<body>
    <?php if (isset($response)) {
        echo '<h2>Response from Parse API</h2>';
        echo '<pre>' . htmlspecialchars($response) . '</pre>';
        echo '<hr>';
    } elseif ($_POST) {
        echo '<h2>Error!</h2>';
        echo '<pre>';
        var_dump($APPLICATION_ID, $REST_API_KEY, $MESSAGE);
        echo '</pre>';
    } ?>

    <h2>Send Message to Parse API</h2>
    <form id="parse" action="" method="post" accept-encoding="UTF-8">
        <p>
            <label for="app">APPLICATION_ID</label>
            <input type="text" name="app" id="app" value="<?php echo htmlspecialchars($APPLICATION_ID); ?>">
        </p>
        <p>
            <label for="api">REST_API_KEY</label>
            <input type="text" name="api" id="api" value="<?php echo htmlspecialchars($REST_API_KEY); ?>">
        </p>
        <p>
            <label for="api">MESSAGE</label>
            <textarea name="body" id="body"><?php echo htmlspecialchars($MESSAGE); ?></textarea>
        </p>
        <p>
            <input type="submit" value="send">
        </p>
    </form>
</body>
</html>

在我的Android应用中,我在主要活动中声明了这一点:

Parse.initialize(this, "xxxxx", "xxxxxx"); 
PushService.setDefaultPushCallback(this, MainActivity.class);
ParseInstallation.getCurrentInstallation().saveInBackground();
ParseAnalytics.trackAppOpened(getIntent());

这是我的清单上的权限。

<receiver android:name="com.parse.ParseBroadcastReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.USER_PRESENT" />
    </intent-filter>
</receiver>

所以底线我希望能够做到像

这样的事情
btn1.setText(msg);

其中msg是推送通知中收到的消息

1 个答案:

答案 0 :(得分:0)

我可以告诉你我是如何做到的,希望很容易转化为你的用法:

首先,我在清单中注册了一个普通的BroadcastReceiver:

    <receiver android:name="com.parse.ParseBroadcastReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.USER_PRESENT" />
    </intent-filter>
    </receiver>
    <receiver android:name="mypackage.ParseSMSReceiver" >
        <intent-filter>
            <action android:name="mypackage.INCOMMING_PARSESMS" />
        </intent-filter>
    </receiver>

现在,ParseSMSReceiver假设用一些数据来处理推送通知。以下是我如何提取我收到的一些数据:

JSONObject json = new JSONObject(intent
        .getExtras().getString(
                "com.parse.Data"));

String sms = (String) json
        .get(Constants.EXTRA_MESSAGE);
String sender = (json
        .has(Constants.EXTRA_SENDER)) ? (String) json
        .get(Constants.EXTRA_SENDER) : null;

最后,这是我发送通知的方式,以便ParseSMSReceiver接收包含预期数据的通知:

JSONObject data = new JSONObject();
//this is the action matching my BroadcastReceiver
data.put("action", "mypackage.INCOMMING_PARSESMS");
data.put(Constants.EXTRA_SENDER, sender);
data.put(Constants.EXTRA_MESSAGE, message);
data.put(Constants.EXTRA_CHANNELS, new JSONArray(channels));

ParsePush androidPush = new ParsePush();
androidPush.setQuery(query);
androidPush.setData(data);
androidPush.setExpirationTimeInterval(tenminutes);
androidPush.sendInBackground();

正如您所看到的,我直接从我的应用程序发送推送消息,但这个概念应该适用于您,使用PHP。

希望这有帮助

修改

您可以在不依赖PHP代码的情况下在Android上测试代码。 parse.com上的仪表板允许您直接发送JSON推送通知。您要发送的JSON消息应该是:

{ "action": "yourpackage.YOURACTIONSTRING", "msg" : "the message to be received" }

yourpackage.YOURACTIONSTRING应该与清单中接收者的动作android:name相匹配。

此外,要验证接收常规推送消息的能力,请尝试从仪表板发送正常消息。

<强> EDIT2

审核了您的代码,并且在清单中定义时无需注册广播。以下是使用ParseSMSReceiver之前应该做的事情的示例:

public class ParseSMSReceiver extends BroadcastReceiver {

private static final String TAG = ParseSMSReceiver.class.getName();

@Override
public void onReceive(final Context context, final Intent intent) {

        Bundle extras = intent.getExtras();
        String message = extras != null ? extras
                .getString("com.parse.Data") : "";
        JSONObject jObject;
        try {
            jObject = new JSONObject(message);
            Log.d("Log",
                    jObject.getString("msg")
                            + jObject.getString("action"));
        } catch (JSONException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

}
}

ParseSMSReceiver应该驻留在正确的包中,以匹配清单中的接收者android:name。

此接收器将自动侦听您在intent-filter部分中定义的任何动作字符串。

将“alert”更改为“msg”,因为这是我在上面的例子中使用的。