使用 GCM 的 PendingIntent 发送时 Intent extras 丢失
Intent extras being lost when sending with PendingIntent for GCM
我正在创建一个 notification
,但是当使用 PendingIntent
发送它时,extras
在这个过程中丢失了。我正在使用 singleTop Activity
,所以我在 onNewIntent
和我的 handleIntent
处设置了一个断点,以查看当我单击通知时哪个正在启动。
当我点击通知时,它启动了我的 handleIntent
方法。我以为 singleTop
activity 会触发 onNewIntent
方法?
为什么我的 Intent extras
在创建 notification
的过程中丢失了?我调试了 intent
,它显示 Bundle[mParcelledData.dataSize=168]
。我如何 unparcel
捆绑包?
Activity 处理意图
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
mPrefs = new SharedPrefs(this);
mDb = DatabaseManager.getInstance(this);
mVolleyManager = new VolleyManager(this);
fm = getSupportFragmentManager();
setupToolbar();
setupNavDrawer();
setupBroadcastReceivers();
setupUniversalImageLoader();
if (savedInstanceState == null) {
FragmentTransaction ft = fm.beginTransaction();
ft = ViewManager.setFragmentAnimations(ft);
if (!mPrefs.getDemoMode()) {
if (!mPrefs.getLoggedIn()) {
ft.add(R.id.container, LoginFragment.newInstance(), GlobalVars
.TAG_LOGIN_FRAGMENT).commit();
}
else {
ft.add(R.id.container, BrowseFragment.newInstance(), GlobalVars.
TAG_BROWSE_FRAGMENT).commit();
}
}
}
// Handles intents mainly sent from GCM notification click events
handleIntent();
}
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
handleIntent();
}
private void handleIntent() {
Intent intent = getIntent();
if (intent.hasExtra(GlobalVars.KEY_EVENT)) {
handleGcmIntent(intent);
}
}
向意图添加额外内容并创建通知
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(GlobalVars.KEY_EVENT, events);
intent.putExtra(GlobalVars.KEY_GAME_DATE_ID, gameDate.getId());
String text = getResources().getString(R.string.msg_found_match);
createNotification(text, intent);
private void createNotification(String text, Intent intent) {
mNotificationManager = (NotificationManager) this.getSystemService(Context
.NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("LovelUp")
.setContentText(text)
.setAutoCancel(true)
.setLights(R.color.primary_blue, 2000, 2000);
if (mPrefs.getNotificationVibrate()) {
mBuilder.setVibrate(new long[] {1000, 1000, 1000});
}
if (mPrefs.getNotificationSound()) {
mBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
}
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(intent);
PendingIntent contentIntent = stackBuilder.getPendingIntent(0, PendingIntent
.FLAG_CANCEL_CURRENT);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}
您可能想要使用 putStringArrayListExtra
将 ArrayList 添加到包中。
你的情况:
intent.putStringArrayListExtra(GlobalVars.KEY_EVENT, events);
然后使用getStringArrayListExtra
检索数据。
更多信息 here(搜索 putStringArrayListExtra
)
这是因为 Intent.putExtra(String key, <Whatever> value)
不接受 ArrayList 作为值。你的代码通过了编译器,因为 ArrayList 是可序列化的,它被接受但是 ArrayList 有其他错误。
你应该使用 [putStringArrayListExtra()][1]
我正在创建一个 notification
,但是当使用 PendingIntent
发送它时,extras
在这个过程中丢失了。我正在使用 singleTop Activity
,所以我在 onNewIntent
和我的 handleIntent
处设置了一个断点,以查看当我单击通知时哪个正在启动。
当我点击通知时,它启动了我的 handleIntent
方法。我以为 singleTop
activity 会触发 onNewIntent
方法?
为什么我的 Intent extras
在创建 notification
的过程中丢失了?我调试了 intent
,它显示 Bundle[mParcelledData.dataSize=168]
。我如何 unparcel
捆绑包?
Activity 处理意图
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
mPrefs = new SharedPrefs(this);
mDb = DatabaseManager.getInstance(this);
mVolleyManager = new VolleyManager(this);
fm = getSupportFragmentManager();
setupToolbar();
setupNavDrawer();
setupBroadcastReceivers();
setupUniversalImageLoader();
if (savedInstanceState == null) {
FragmentTransaction ft = fm.beginTransaction();
ft = ViewManager.setFragmentAnimations(ft);
if (!mPrefs.getDemoMode()) {
if (!mPrefs.getLoggedIn()) {
ft.add(R.id.container, LoginFragment.newInstance(), GlobalVars
.TAG_LOGIN_FRAGMENT).commit();
}
else {
ft.add(R.id.container, BrowseFragment.newInstance(), GlobalVars.
TAG_BROWSE_FRAGMENT).commit();
}
}
}
// Handles intents mainly sent from GCM notification click events
handleIntent();
}
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
handleIntent();
}
private void handleIntent() {
Intent intent = getIntent();
if (intent.hasExtra(GlobalVars.KEY_EVENT)) {
handleGcmIntent(intent);
}
}
向意图添加额外内容并创建通知
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(GlobalVars.KEY_EVENT, events);
intent.putExtra(GlobalVars.KEY_GAME_DATE_ID, gameDate.getId());
String text = getResources().getString(R.string.msg_found_match);
createNotification(text, intent);
private void createNotification(String text, Intent intent) {
mNotificationManager = (NotificationManager) this.getSystemService(Context
.NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("LovelUp")
.setContentText(text)
.setAutoCancel(true)
.setLights(R.color.primary_blue, 2000, 2000);
if (mPrefs.getNotificationVibrate()) {
mBuilder.setVibrate(new long[] {1000, 1000, 1000});
}
if (mPrefs.getNotificationSound()) {
mBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
}
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(intent);
PendingIntent contentIntent = stackBuilder.getPendingIntent(0, PendingIntent
.FLAG_CANCEL_CURRENT);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}
您可能想要使用 putStringArrayListExtra
将 ArrayList 添加到包中。
你的情况:
intent.putStringArrayListExtra(GlobalVars.KEY_EVENT, events);
然后使用getStringArrayListExtra
检索数据。
更多信息 here(搜索 putStringArrayListExtra
)
这是因为 Intent.putExtra(String key, <Whatever> value)
不接受 ArrayList 作为值。你的代码通过了编译器,因为 ArrayList 是可序列化的,它被接受但是 ArrayList 有其他错误。
你应该使用 [putStringArrayListExtra()][1]