intent.putExtra()在待处理的意图中不起作用

Arn*_*nab 25 android android-intent

我通过alarmreceiver从服务类传递一个待处理的意图.但是,在pendingIntent触发后,broadcastreceiver类没有接收到intent.putExtra()信息.这是我的用于触发pendingIntent的代码

Intent aint = new Intent(getApplicationContext(), AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), id, aint, PendingIntent.FLAG_UPDATE_CURRENT);
aint.putExtra("msg", msg);
aint.putExtra("phone", phone);
alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
Run Code Online (Sandbox Code Playgroud)

警报接收器类如下

public String msg, phonen;

@Override
public void  onReceive(Context context, Intent intent){
    Bundle extras = intent.getExtras();
    msg = extras.getString("msg");
    phonen = extras.getString("phone");

    Log.d("onReceive", "About to execute MyTask");
    Toast.makeText(context,msg, Toast.LENGTH_LONG).show();
}
Run Code Online (Sandbox Code Playgroud)

未显示正在从待处理意图接收的Toast中的msg信息.而是显示空白吐司.

aye*_*don 45

试试这个

Intent aint = new Intent(getApplicationContext(), AlarmReceiver.class);
aint.putExtra("msg", msg);
aint.putExtra("phone", phone);



PendingIntent pendingIntent = PendingIntent.getBroadcast(
    getApplicationContext(),
    id, 
    aint,
    // as stated in the comments, this flag is important!
    PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)

  • 对于那些看到这个并在附加到PendingIntent之前使用.putExtra方法的人来说,`PendingIntent.FLAG_UPDATE_CURRENT`很重要,所以在继续使用另一个解决方案之前先试试. (10认同)
  • 我有一个完全不同的问题,但这解决了它。根据 [`PendingIntent` 的文档](https://developer.android.com/reference/android/app/PendingIntent):“人们犯的一个常见错误是创建多个 PendingIntent 对象,其 Intent 仅在它们的不同” extra" 内容,期望每次得到不同的 PendingIntent。**这不会发生**。用于匹配的 Intent 部分与 [Intent.filterEquals](https://developer.filterEquals) 定义的相同。 android.com/reference/android/content/Intent#filterEquals(android.content.Intent))。” (2认同)
  • 第 2 部分:“如果根据 `Intent.filterEquals` 使用两个等效的 Intent 对象,那么它们将获得相同的 `PendingIntent`。” 并查看 [`Intent.filterEquals`](https://developer.android.com/reference/android/content/Intent#filterEquals(android.content.Intent)) 它过滤“动作、数据、类型、类、和类别 [...] 他不比较意图中包含的*任何额外数据*” (2认同)

小智 5

请记住在PendingIntent构造函数中放置一个唯一的ID,否则当您尝试获取putExtra值时,您可能会得到一些奇怪的信息。

    PendingIntent pendingIntent = PendingIntent.getBroadcast(
           getApplicationContext(), 
           UUID.randomUUID().hashCode(), 
           aint, 
           PendingIntent.FLAG_UPDATE_CURRENT
    );
Run Code Online (Sandbox Code Playgroud)