21

我想从通知发送信息调用活动,而从我的活动,我得到空。Android通知PendingIntent额外null

通知的代码是:

private void showNotification() { 
Intent resultIntent = new Intent(this, MainActivity.class); 
if (D) 
    Log.d(TAG, "Id: " + Id); 
resultIntent.putExtra("ineedid", deviceId); 

TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
stackBuilder.addParentStack(MeterActivity.class); 
stackBuilder.addNextIntent(resultIntent); 
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, 
    PendingIntent.FLAG_UPDATE_CURRENT); 
// Bundle tmp = resultIntent.getExtras(); 
// if (tmp == null) { 
// Log.d(TAG, "tmp bundle is null"); 
// } else { 
// long id = tmp.getLong("ineedid", -1); 
// Log.d(TAG, "tmp id : " + id); 
// } 
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
    BLEMessengerService.this) 
    .setSmallIcon(R.drawable.ic_action_search) 
    .setContentTitle("Event tracker") 
    .setContentText("Events received").setOngoing(true) 
    .setContentIntent(resultPendingIntent) 
    .setWhen(System.currentTimeMillis()); 

int mId = R.string.service_notification_start_service; 
mNM.notify(mId, mBuilder.getNotification()); 
} 

代码获得从主要活动意向信息;

Bundle extras = getIntent().getExtras(); 
if (extras != null) { 
    long deviceID = getIntent().getLongExtra("ineedid", 
     -1); 
    if (ID == -1) { 
    if (D) 
     Log.i(TAG_D, "Wrong Id received."); 
    finish(); 
    } else { 
    device = dataSource.getDeviceByID(deviceID); 
    if (D) 
     Log.i(TAG_D, "Get the id."); 
    } 
} else { 
    if (D) 
    Log.d(TAG_D, "Bundle is null"); 
    finish(); 
} 

我已在通知得到通知之前进行了验证,捆绑包不为空,并且它的id为extras。 虽然,当我试图从意图中获取它时,它消失了。帮帮我。

+0

我也尝试添加 “resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);”,但没有工作。 – antonio081014

+1

有没有原因你不使用'resultPendingIntent.getExtras()'? – PearsonArtPhoto

+0

我刚刚做了这些行来检查我的pendingIntent是否有额外功能,并验证了它具有我放在那里的内容。 – antonio081014

回答

8

我刚刚得到了答案, 添加一行:resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

注意:如果你将它添加为resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 它不会工作。

我也尝试过其他的标志,如 “FLAG_ACTIVITY_NEW_TASK” 和 “FLAG_ACTIVITY_RESET_TASK_IF_NEEDED”。在这里都不行。

+1

我正在尝试同样的事情。 文档中为何需要此标志的任何线索? 它只是说“如果设置,如果活动已经在历史堆栈顶部运行,则活动将不会启动。” – mparaz

21

对于我来说,除了设置Intent.FLAG_ACTIVITY_SINGLE_TOP,我有一个独特的操作添加到意图:

Intent resultIntent = new Intent(caller, NotificationActivity.class); 

    String xId = getNextUniqueId(); 
    resultIntent.putExtra("x_id", xId); 
    resultIntent.setAction(xId); 
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 

..没有的setAction(..),额外为空收到的意向通过我的NotificationActivity。

这篇文章可以帮助解释:https://stackoverflow.com/a/3128271/2162226

13

中的PendingIntent使用此标志PendingIntent.FLAG_UPDATE_CURRENT这是为我工作

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
0

我是在一个本地通知插件的团结工作,当我遇到同样的问题 - >我启动了应用程序,计划了本地通知,将应用程序发送到了后台,出现了本地通知,当我点击它时,应用程序已恢复,getIntent().getExtras()null

在我的情况下,问题是我试图在错误的意图得到了临时演员。尝试使用简单的toString打印意图,在创建时和获取它时确保收到的是您所期望的。

也看看到onNewIntent方法。