c2dm:如何在设备中接收消息? (使用PHP)

发布于 2024-11-11 14:05:25 字数 3527 浏览 2 评论 0原文

我有 c2dm 的注册 ID 和身份验证令牌。然后我将这些值存储在数据库中。使用 php,我可以向 c2dm 服务器发送一条消息。但我的问题是我不知道如何在应用程序中接收消息。我不确定我获取消息的方式是否正确。无论如何,我将在下面给出。

我有一项使用注册意图注册到 c2dm 的活动。以及一个接收器,用于接收reg_id和通知消息。它正在向 c2dm 注册,但不接收消息。

显现

    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.REGISTRATION"></action>
        <category android:name="my.android.c2dm"></category> 
    </intent-filter>
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"></action>
        <category android:name="my.android.c2dm"></category>
    </intent-filter>
    </receiver>

</application>

C2dmRegistration.class(活动)

    Intent objRegIntnet=new Intent("com.google.android.c2dm.intent.REGISTER");
    objRegIntnet.putExtra("app",PendingIntent.getBroadcast(this,0,new Intent(),0));
    objRegIntnet.putExtra("sender","[email protected]");
    startService(objRegIntnet);

c2dmReceiver

public class c2dmReceiver extends BroadcastReceiver 
{
    private static String KEY = "c2dmPref";
    private static String REGISTRATION_KEY = "registrationKey";


    private Context context;



    @Override
    public void onReceive(Context context, Intent intent)
    {
        this.context = context;
        if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) 
        {
                  handleRegistration(context, intent);
             } 
        else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE"))
        {
            handleMessage(context, intent);
             }              
    }

     private void handleRegistration(Context context, Intent intent) 
{
       //handles registeration
     }
     private void handleMessage(Context context, Intent intent)
{

    String title= intent.getStringExtra("title");
    String message= intent.getStringExtra("msg");
    Toast.makeText(context,"title : "+title+"\n message : "+message,1).show();
    //Do whatever you want with the message
}

请告诉我我犯了什么错误...

更新

大家好,今天我正在使用相同的代码。我犯的错误是 php 代码。我不再以 POST 方式传递值,而是以 GET 方式发送。当我将其更改为 POST 时,会显示 toast 消息。但仍然存在一些问题。

此处的标题和消息值为空。 我的php代码是:

function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText)
 {
       //$messageText="have a nice day";
       //$msgtype="important";
       $headers = array('Authorization: GoogleLogin auth=' . $authCode);
       $data = array(
        'registration_id' => $deviceRegistrationId,
        'collapse_key' => $msgType,
        'data.message' => $messageText
                        );
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
      if ($headers)
         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
      $response = curl_exec($ch);
      curl_close($ch);
      return $response;
    }

实际上我不确定collapse_key和data.message变量应该使用什么类型的值。

请帮我... 谢谢...

I have the registration id and auth token for c2dm. And then I pass store these values in db. and using php, i could send one message to c2dm server. But my problem is I dont know how to receive the message in the application. I am not sure whether my way of getting the message is correct or not. Anyway i will give it below.

I have one activity which registers to the c2dm using registration intent. and one receiver to receive the reg_id and notification message. it is registering with c2dm and not to receive message.

manifest

    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.REGISTRATION"></action>
        <category android:name="my.android.c2dm"></category> 
    </intent-filter>
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"></action>
        <category android:name="my.android.c2dm"></category>
    </intent-filter>
    </receiver>

</application>

C2dmRegistration.class (activity)

    Intent objRegIntnet=new Intent("com.google.android.c2dm.intent.REGISTER");
    objRegIntnet.putExtra("app",PendingIntent.getBroadcast(this,0,new Intent(),0));
    objRegIntnet.putExtra("sender","[email protected]");
    startService(objRegIntnet);

c2dmReceiver

public class c2dmReceiver extends BroadcastReceiver 
{
    private static String KEY = "c2dmPref";
    private static String REGISTRATION_KEY = "registrationKey";


    private Context context;



    @Override
    public void onReceive(Context context, Intent intent)
    {
        this.context = context;
        if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) 
        {
                  handleRegistration(context, intent);
             } 
        else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE"))
        {
            handleMessage(context, intent);
             }              
    }

     private void handleRegistration(Context context, Intent intent) 
{
       //handles registeration
     }
     private void handleMessage(Context context, Intent intent)
{

    String title= intent.getStringExtra("title");
    String message= intent.getStringExtra("msg");
    Toast.makeText(context,"title : "+title+"\n message : "+message,1).show();
    //Do whatever you want with the message
}

please tell what is the mistake i have done...

UPDATE

Hi all, the same code is woring for me today. The mistake i have done is with php code. instaed of passing the values as POST, i sent it was as GET. When I changed it to POST, the toast message is showing. but yet some problems are there.

The title, and msg values are null here.
my php code is :

function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText)
 {
       //$messageText="have a nice day";
       //$msgtype="important";
       $headers = array('Authorization: GoogleLogin auth=' . $authCode);
       $data = array(
        'registration_id' => $deviceRegistrationId,
        'collapse_key' => $msgType,
        'data.message' => $messageText
                        );
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
      if ($headers)
         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
      $response = curl_exec($ch);
      curl_close($ch);
      return $response;
    }

Actually i am not sure what type of values should use for collapse_key, and data.message variables.

Please help me...
Thank you...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

风筝在阴天搁浅。 2024-11-18 14:05:25

最后我找到了提供塌陷键和数据的方法..
crash_key 应该是一个字符串,它是一组消息或特定类型消息的名称。如果我们使用相同的collapse_key发送多条消息,最新的消息将从c2dm服务器发送到设备。

示例:$collapse_key = "重要";

还有数据。是重要的事情。这将包含我们要发送的消息。

例如:如果我们想发送一条消息“祝你有美好的一天”,那么我应该给它一个键名。
data.="祝你有美好的一天";
这里“愿望”是关键。在接收器中,我应该使用相同的密钥名称检索消息。

private void handleMessage(Context context, Intent intent) 
{  
      String mywish= intent.getStringExtra("wishes");    
      Toast.makeText(context,"my wishes : "+mywish,1).show(); 
} 

向大家抱歉..

Finally I found the way of giving collapse_key and and data..
collapse_key should be a string which is a name for a group of messages or a a parthicular type of messages. If we send more than one message with same collapse_key, the latest message will be sent to the device from c2dm server.

Example : $collapse_key = "important";

And the data. is the important thing. This will contain the message that we want to send.

Ex: if we want to send a message "Have a nice day", then i should give a key name to it.
data.="Have a nice day";
here 'wishes' is the key. And in receiver, i should retreive the message with the same key name.

private void handleMessage(Context context, Intent intent) 
{  
      String mywish= intent.getStringExtra("wishes");    
      Toast.makeText(context,"my wishes : "+mywish,1).show(); 
} 

Sorry to all..

中二柚 2024-11-18 14:05:25

这是我的代码,我用它来接收来自 C2DM 服务器的通知,它还在通知栏上显示通知。它正在运行,您可以将您的代码与我的代码进行比较,并纠正错误(如果有)。
我希望这是有帮助的。

/**
* C2D 消息接收器的基类。包括所使用字符串的常量
* 在协议中。
*/

public abstract class C2DMBaseReceiver extends IntentService {
private static final String C2DM_RETRY = "com.google.android.c2dm.intent.RETRY";

public static final String REGISTRATION_CALLBACK_INTENT = "com.google.android.c2dm.intent.REGISTRATION";
private static final String C2DM_INTENT = "com.google.android.c2dm.intent.RECEIVE";

// Logging tag
private static final String TAG = "C2DM";

// Extras in the registration callback intents.
public static final String EXTRA_UNREGISTERED = "unregistered";

public static final String EXTRA_ERROR = "error";

public static final String EXTRA_REGISTRATION_ID = "registration_id";

public static final String ERR_SERVICE_NOT_AVAILABLE = "SERVICE_NOT_AVAILABLE";
public static final String ERR_ACCOUNT_MISSING = "ACCOUNT_MISSING";
public static final String ERR_AUTHENTICATION_FAILED = "AUTHENTICATION_FAILED";
public static final String ERR_TOO_MANY_REGISTRATIONS = "TOO_MANY_REGISTRATIONS";
public static final String ERR_INVALID_PARAMETERS = "INVALID_PARAMETERS";
public static final String ERR_INVALID_SENDER = "INVALID_SENDER";
public static final String ERR_PHONE_REGISTRATION_ERROR = "PHONE_REGISTRATION_ERROR";

// wakelock
private static final String WAKELOCK_KEY = "C2DM_LIB";

private static PowerManager.WakeLock mWakeLock;
private final String senderId;

/**
 * The C2DMReceiver class must create a no-arg constructor and pass the
 * sender id to be used for registration.
 */
public C2DMBaseReceiver(String senderId) {
    // senderId is used as base name for threads, etc.
    super(senderId);
    this.senderId = senderId;
}

/**
 * Called when a cloud message has been received.
 */
protected abstract void onMessage(Context context, Intent intent);

/**
 * Called on registration error. Override to provide better error messages.
 * 
 * This is called in the context of a Service - no dialog or UI.
 */
public abstract void onError(Context context, String errorId);

/**
 * Called when a registration token has been received.
 */
public void onRegistrered(Context context, String registrationId)
        throws IOException {

}

/**
 * Called when the device has been unregistered.
 */
public void onUnregistered(Context context) {
}

@Override
public final void onHandleIntent(Intent intent) {
    try {
        Context context = getApplicationContext();
        if (intent.getAction().equals(REGISTRATION_CALLBACK_INTENT)) {
            handleRegistration(context, intent);
        } else if (intent.getAction().equals(C2DM_INTENT)) {
            //**C2DM Start

               Bundle extras = intent.getExtras();


                String pushNo =extras != null ? extras.getString("pushNo"):"";
                String scoreId =extras != null ? extras.getString("scoreId"):"";
                String notfId =extras != null ? extras.getString("notfId"):"";
                String fromId =extras != null ? extras.getString("fromId"):"";
                String toId =extras != null ? extras.getString("toId"):"";
                String matchId =extras != null ? extras.getString("matchId"):"";
                String msg =extras != null ? extras.getString("msg"):"";


                String ns = Context.NOTIFICATION_SERVICE;
                NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
                int icon = R.drawable.icon;    
                CharSequence tickerText = "Notification Receive";
                long when = System.currentTimeMillis();

                Notification notification = new Notification(icon, tickerText, when);

                Context context1 = context;
                //*****************
                final int CUSTOM_VIEW_ID = 1;
                RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout);
                contentView.setImageViewResource(R.id.image, R.drawable.icon);
                contentView.setTextViewText(R.id.text, "Racquetime \n"+msg);

                notification.contentView = contentView;


              notification.defaults=Notification.FLAG_ONLY_ALERT_ONCE+Notification.FLAG_AUTO_CANCEL;
              Intent notificationIntent;
              if(GUIStatics.boolLoginStatus)
              {
                  notificationIntent = new Intent(this,ShowAllNotificationActiviry.class);
              }
              else{
                   notificationIntent = new Intent(this, HomeActivity.class);
              }
              notification.flags |= Notification.FLAG_AUTO_CANCEL;
                notification.defaults |= Notification.DEFAULT_SOUND;
                notification.flags |= Notification.FLAG_SHOW_LIGHTS;

                notificationIntent.putExtra("Tag", "C2DMBaseReceiver");
                PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
                notification.contentIntent = contentIntent;
                mNotificationManager.notify(CUSTOM_VIEW_ID, notification);

                //**C2DM End
        //  onMessage(context, intent);
        } else if (intent.getAction().equals(C2DM_RETRY)) {
            C2DMessaging.register(context, senderId);
        }
    } finally {
        // Release the power lock, so phone can get back to sleep.
        // The lock is reference counted by default, so multiple
        // messages are ok.

        // If the onMessage() needs to spawn a thread or do something else,
        // it should use it's own lock.
        mWakeLock.release();
    }
}

/**
 * Called from the broadcast receiver. Will process the received intent,
 * call handleMessage(), registered(), etc. in background threads, with a
 * wake lock, while keeping the service alive.
 */
static void runIntentInService(Context context, Intent intent) {
    if (mWakeLock == null) {
        // This is called from BroadcastReceiver, there is no init.
        PowerManager pm = (PowerManager) context
                .getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                WAKELOCK_KEY);
    }
    mWakeLock.acquire();

    // Use a naming convention, similar with how permissions and intents are
    // used. Alternatives are introspection or an ugly use of statics.
    String receiver ="com.commonsware.android.c2dm.C2DMReceiver";
    intent.setClassName(context, receiver);

    context.startService(intent);

}

private void handleRegistration(final Context context, Intent intent) {
    final String registrationId = intent
            .getStringExtra(EXTRA_REGISTRATION_ID);
    String error = intent.getStringExtra(EXTRA_ERROR);
    String removed = intent.getStringExtra(EXTRA_UNREGISTERED);

    if (Log.isLoggable(TAG, Log.DEBUG)) {
        Log.d(TAG, "dmControl: registrationId = " + registrationId
                + ", error = " + error + ", removed = " + removed);
    }

    if (removed != null) {
        // Remember we are unregistered
        C2DMessaging.clearRegistrationId(context);
        onUnregistered(context);
        return;
    } else if (error != null) {
        // we are not registered, can try again
        C2DMessaging.clearRegistrationId(context);
        // Registration failed
        Log.e(TAG, "Registration error " + error);
        onError(context, error);
        if ("SERVICE_NOT_AVAILABLE".equals(error)) {
            long backoffTimeMs = C2DMessaging.getBackoff(context);

            Log.d(TAG, "Scheduling registration retry, backoff = "
                    + backoffTimeMs);
            Intent retryIntent = new Intent(C2DM_RETRY);
            PendingIntent retryPIntent = PendingIntent
                    .getBroadcast(context, 0 /* requestCode */, retryIntent,
                            0 /* flags */);

            AlarmManager am = (AlarmManager) context
                    .getSystemService(Context.ALARM_SERVICE);
            am.set(AlarmManager.ELAPSED_REALTIME, backoffTimeMs,
                    retryPIntent);

            // Next retry should wait longer.
            backoffTimeMs *= 2;
            C2DMessaging.setBackoff(context, backoffTimeMs);
        }
    } else {
        try {
            onRegistrered(context, registrationId);
            C2DMessaging.setRegistrationId(context, registrationId);
            GUIStatics.registrationID=registrationId;
        } catch (IOException ex) {
            Log.e(TAG, "Registration error " + ex.getMessage());
        }
    }
}

This is my code I have use it for receiving notification form C2DM server, it also shows the notification on notification bar. It is running find you can compare your code with my code and correct the error if any .
I hope this is help.

/**
* Base class for C2D message receiver. Includes constants for the strings used
* in the protocol.
*/

public abstract class C2DMBaseReceiver extends IntentService {
private static final String C2DM_RETRY = "com.google.android.c2dm.intent.RETRY";

public static final String REGISTRATION_CALLBACK_INTENT = "com.google.android.c2dm.intent.REGISTRATION";
private static final String C2DM_INTENT = "com.google.android.c2dm.intent.RECEIVE";

// Logging tag
private static final String TAG = "C2DM";

// Extras in the registration callback intents.
public static final String EXTRA_UNREGISTERED = "unregistered";

public static final String EXTRA_ERROR = "error";

public static final String EXTRA_REGISTRATION_ID = "registration_id";

public static final String ERR_SERVICE_NOT_AVAILABLE = "SERVICE_NOT_AVAILABLE";
public static final String ERR_ACCOUNT_MISSING = "ACCOUNT_MISSING";
public static final String ERR_AUTHENTICATION_FAILED = "AUTHENTICATION_FAILED";
public static final String ERR_TOO_MANY_REGISTRATIONS = "TOO_MANY_REGISTRATIONS";
public static final String ERR_INVALID_PARAMETERS = "INVALID_PARAMETERS";
public static final String ERR_INVALID_SENDER = "INVALID_SENDER";
public static final String ERR_PHONE_REGISTRATION_ERROR = "PHONE_REGISTRATION_ERROR";

// wakelock
private static final String WAKELOCK_KEY = "C2DM_LIB";

private static PowerManager.WakeLock mWakeLock;
private final String senderId;

/**
 * The C2DMReceiver class must create a no-arg constructor and pass the
 * sender id to be used for registration.
 */
public C2DMBaseReceiver(String senderId) {
    // senderId is used as base name for threads, etc.
    super(senderId);
    this.senderId = senderId;
}

/**
 * Called when a cloud message has been received.
 */
protected abstract void onMessage(Context context, Intent intent);

/**
 * Called on registration error. Override to provide better error messages.
 * 
 * This is called in the context of a Service - no dialog or UI.
 */
public abstract void onError(Context context, String errorId);

/**
 * Called when a registration token has been received.
 */
public void onRegistrered(Context context, String registrationId)
        throws IOException {

}

/**
 * Called when the device has been unregistered.
 */
public void onUnregistered(Context context) {
}

@Override
public final void onHandleIntent(Intent intent) {
    try {
        Context context = getApplicationContext();
        if (intent.getAction().equals(REGISTRATION_CALLBACK_INTENT)) {
            handleRegistration(context, intent);
        } else if (intent.getAction().equals(C2DM_INTENT)) {
            //**C2DM Start

               Bundle extras = intent.getExtras();


                String pushNo =extras != null ? extras.getString("pushNo"):"";
                String scoreId =extras != null ? extras.getString("scoreId"):"";
                String notfId =extras != null ? extras.getString("notfId"):"";
                String fromId =extras != null ? extras.getString("fromId"):"";
                String toId =extras != null ? extras.getString("toId"):"";
                String matchId =extras != null ? extras.getString("matchId"):"";
                String msg =extras != null ? extras.getString("msg"):"";


                String ns = Context.NOTIFICATION_SERVICE;
                NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
                int icon = R.drawable.icon;    
                CharSequence tickerText = "Notification Receive";
                long when = System.currentTimeMillis();

                Notification notification = new Notification(icon, tickerText, when);

                Context context1 = context;
                //*****************
                final int CUSTOM_VIEW_ID = 1;
                RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout);
                contentView.setImageViewResource(R.id.image, R.drawable.icon);
                contentView.setTextViewText(R.id.text, "Racquetime \n"+msg);

                notification.contentView = contentView;


              notification.defaults=Notification.FLAG_ONLY_ALERT_ONCE+Notification.FLAG_AUTO_CANCEL;
              Intent notificationIntent;
              if(GUIStatics.boolLoginStatus)
              {
                  notificationIntent = new Intent(this,ShowAllNotificationActiviry.class);
              }
              else{
                   notificationIntent = new Intent(this, HomeActivity.class);
              }
              notification.flags |= Notification.FLAG_AUTO_CANCEL;
                notification.defaults |= Notification.DEFAULT_SOUND;
                notification.flags |= Notification.FLAG_SHOW_LIGHTS;

                notificationIntent.putExtra("Tag", "C2DMBaseReceiver");
                PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
                notification.contentIntent = contentIntent;
                mNotificationManager.notify(CUSTOM_VIEW_ID, notification);

                //**C2DM End
        //  onMessage(context, intent);
        } else if (intent.getAction().equals(C2DM_RETRY)) {
            C2DMessaging.register(context, senderId);
        }
    } finally {
        // Release the power lock, so phone can get back to sleep.
        // The lock is reference counted by default, so multiple
        // messages are ok.

        // If the onMessage() needs to spawn a thread or do something else,
        // it should use it's own lock.
        mWakeLock.release();
    }
}

/**
 * Called from the broadcast receiver. Will process the received intent,
 * call handleMessage(), registered(), etc. in background threads, with a
 * wake lock, while keeping the service alive.
 */
static void runIntentInService(Context context, Intent intent) {
    if (mWakeLock == null) {
        // This is called from BroadcastReceiver, there is no init.
        PowerManager pm = (PowerManager) context
                .getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                WAKELOCK_KEY);
    }
    mWakeLock.acquire();

    // Use a naming convention, similar with how permissions and intents are
    // used. Alternatives are introspection or an ugly use of statics.
    String receiver ="com.commonsware.android.c2dm.C2DMReceiver";
    intent.setClassName(context, receiver);

    context.startService(intent);

}

private void handleRegistration(final Context context, Intent intent) {
    final String registrationId = intent
            .getStringExtra(EXTRA_REGISTRATION_ID);
    String error = intent.getStringExtra(EXTRA_ERROR);
    String removed = intent.getStringExtra(EXTRA_UNREGISTERED);

    if (Log.isLoggable(TAG, Log.DEBUG)) {
        Log.d(TAG, "dmControl: registrationId = " + registrationId
                + ", error = " + error + ", removed = " + removed);
    }

    if (removed != null) {
        // Remember we are unregistered
        C2DMessaging.clearRegistrationId(context);
        onUnregistered(context);
        return;
    } else if (error != null) {
        // we are not registered, can try again
        C2DMessaging.clearRegistrationId(context);
        // Registration failed
        Log.e(TAG, "Registration error " + error);
        onError(context, error);
        if ("SERVICE_NOT_AVAILABLE".equals(error)) {
            long backoffTimeMs = C2DMessaging.getBackoff(context);

            Log.d(TAG, "Scheduling registration retry, backoff = "
                    + backoffTimeMs);
            Intent retryIntent = new Intent(C2DM_RETRY);
            PendingIntent retryPIntent = PendingIntent
                    .getBroadcast(context, 0 /* requestCode */, retryIntent,
                            0 /* flags */);

            AlarmManager am = (AlarmManager) context
                    .getSystemService(Context.ALARM_SERVICE);
            am.set(AlarmManager.ELAPSED_REALTIME, backoffTimeMs,
                    retryPIntent);

            // Next retry should wait longer.
            backoffTimeMs *= 2;
            C2DMessaging.setBackoff(context, backoffTimeMs);
        }
    } else {
        try {
            onRegistrered(context, registrationId);
            C2DMessaging.setRegistrationId(context, registrationId);
            GUIStatics.registrationID=registrationId;
        } catch (IOException ex) {
            Log.e(TAG, "Registration error " + ex.getMessage());
        }
    }
}
萌能量女王 2024-11-18 14:05:25

我的消息只有在我开始使用时才通过:

Bundle extras = intent.getExtras();

String message = (String)extras.get("message");

Log.d("Tag", "msg:" + message);

My messages only made it through when i started using:

Bundle extras = intent.getExtras();

String message = (String)extras.get("message");

Log.d("Tag", "msg:" + message);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文