为了账号安全,请及时绑定邮箱和手机立即绑定

Parcelable 对象通过通知被接收为空,但在活动之间工作

Parcelable 对象通过通知被接收为空,但在活动之间工作

富国沪深 2021-11-11 16:02:49
我有一个名为 ParserService 的意图服务,它执行一些任务并创建一个可打包的对象(ArtistInfo)。然后它检查应用程序是否在前台。如果是,则它会在意图附加项中发送带有可分割对象的广播。此广播由活动 MainActivity.java 接收,然后该活动创建具有相同对象的意图,并启动名为 ListSongsActivity 的活动,在该活动中成功接收了 Parcelable 对象。但是,如果应用程序不在前台,则 ParserService 会发送一个通知,其意图与广播的意图相同。但是当 ListSongsActivity 通过通知启动时,parcelable 对象(ArtistInfo)这次为空。我也在意图中传递一个字符串。该字符串通过通知意图正确接收,但parcelable 对象为空。请在下面找到相关的代码片段。来自 ParserService 的广播和通知代码:if (CommonUtils.appInForeground(getApplicationContext())) {                Log.d(TAG, "onHandleIntent(): Sending success broadcast.");                sendBroadcast(createSuccessIntent(artistInfo));            } else {                // TODO: 10-10-2018 tapping on notification does nothing!!                Log.d(TAG, "onHandleIntent(): Sending success notification.");                String body = "Parsing complete for the url: " + url;                Intent notifyIntent = new Intent(getApplicationContext(), ListSongsActivity.class);                notifyIntent.putExtra(Constants.MUSIC_SITE, siteName);                notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);                Bundle bundle = new Bundle();                bundle.putParcelable(Constants.PARSED_ARTIST_INFO, artistInfo);                intent.putExtras(bundle);                CommonUtils.sendNotification(getApplicationContext(), Constants.LIST_SONGS_NOTIFICATION_TITLE                        , body, Constants.LIST_SONGS_NOTIFICATION_CHANNEL_ID, notifyIntent,                        Constants.LIST_SONGS_NOTIFICATION_ID, R.drawable.ic_launcher_background);            }private Intent createSuccessIntent(ArtistInfo artistInfo) {    Intent intent = new Intent();    intent.setAction(Constants.PARSE_SUCCESS_ACTION_KEY);    Bundle bundle = new Bundle();    bundle.putParcelable(Constants.PARSE_SUCCESS_MESSAGE_KEY, artistInfo);    intent.putExtras(bundle);    return intent;}
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

在调用sendNotification()else 条件之前,您将 bundle 置于不同的intent,而不是notifyIntent。在 else 中更改您的代码,如下所示


else {

    // TODO: 10-10-2018 tapping on notification does nothing!!

    Log.d(TAG, "onHandleIntent(): Sending success notification.");

    String body = "Parsing complete for the url: " + url;

    Intent notifyIntent = new Intent(getApplicationContext(), ListSongsActivity.class);

    notifyIntent.putExtra(Constants.MUSIC_SITE, siteName);

    notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

    Bundle bundle = new Bundle();

    bundle.putParcelable(Constants.PARSED_ARTIST_INFO, artistInfo);

    notifyIntent.putExtras(bundle);

    CommonUtils.sendNotification(getApplicationContext(), Constants.LIST_SONGS_NOTIFICATION_TITLE

                            , body, Constants.LIST_SONGS_NOTIFICATION_CHANNEL_ID, notifyIntent,

                            Constants.LIST_SONGS_NOTIFICATION_ID, R.drawable.ic_launcher_background);

   }


查看完整回答
反对 回复 2021-11-11
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

也许您正在创建的待处理意图比应用程序中的要多。在这种情况下,您应该使用,

PendingIntent.FLAG_CANCEL_CURRENT

从头开始创建 Intent 并扩充您的包


查看完整回答
反对 回复 2021-11-11
  • 2 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信