【问题标题】:Notification not always starting the Activity通知并不总是启动 Activity
【发布时间】:2015-06-04 06:26:27
【问题描述】:

每个标题,它并不总是启动活动。 输出日志中没有错误,它只是说

06-01 16:46:36.924: I/ActivityManager(370): 开始 u0 {flg=0x10000000 cmp=com.myapp/md527315440e30c82eb86ffbe7caee6cb98.MyView bnds=[96,712][1056,840](有附加功能)}来自 pid -1

我所说的“并非总是”是这样的:

  1. 我启动应用程序,它显示主屏幕。收到通知,我点击通知,运行活动。应用导航到另一个 Activity,该 Activity 已关闭(调用了finish())。
  2. 接下来,我点击返回按钮,直到应用程序关闭。收到通知,我点击通知,运行活动。应用导航到另一个 Activity,该 Activity 已关闭(调用了finish())。
  3. 接下来,让应用程序保持相同的状态(无导航)。收到通知,我点击通知,活动未运行。

这是添加通知的代码:

    void CreateNotification (Context context, PushNotification pn)
    {
        var builder = new NotificationCompat.Builder (context)
            .SetContentTitle (pn.Title)
            .SetContentText (pn.Body)
            .SetSmallIcon (Resource.Drawable.launcher)
            .SetLargeIcon (Android.Graphics.BitmapFactory.DecodeResource (context.Resources, Resource.Drawable.launcher))
            .SetSound (Android.Provider.Settings.System.DefaultNotificationUri)
            .SetAutoCancel (true);

        Android.Support.V4.App.TaskStackBuilder stackBuilder = Android.Support.V4.App.TaskStackBuilder.Create(context);
        stackBuilder.AddParentStack(Java.Lang.Class.FromType(typeof(LoginView)));
        stackBuilder.AddNextIntent(GetIntent());

        PendingIntent resultPendingIntent = stackBuilder.GetPendingIntent(0, (int)PendingIntentFlags.UpdateCurrent);
        builder.SetContentIntent(resultPendingIntent);

        var notificationManager = context.GetSystemService (Context.NotificationService) as NotificationManager;
        notificationManager.Notify(1, builder.Build());
    }

    static Intent GetIntent ()
    {
        // returns an intent
    }

我看到其他具有相同问题但没有解决方案的问题。 如果有人可以提供一些提示或想法,说明为什么这可能行不通。

【问题讨论】:

  • 为什么要否决我的问题?没用

标签: android android-intent android-activity


【解决方案1】:

查看android notifications 的“设置常规活动 PendingIntent”部分。您没有遵循示例中列出的准则。特别是,您不要执行以下操作:

根据启动Activity的Intent创建回栈: 创建 Intent 以启动 Activity。通过以下方式创建堆栈构建器 调用 TaskStackBuilder.create()。将后栈添加到栈中 通过调用 addParentStack() 生成器。对于每个活动 您在清单中定义的层次结构,后堆栈包含一个 启动 Activity 的 Intent 对象。此方法还添加标志 在新任务中启动堆栈。注意:虽然论点 addParentStack() 是对启动的Activity的引用,方法 call 不会添加启动 Activity 的 Intent。相反,那是 在下一步中处理。

添加从通知启动 Activity 的 Intent,通过 调用 addNextIntent()。传递您在第一步中创建的 Intent 作为 addNextIntent() 的参数。如果需要,请添加参数 通过调用堆栈上的 Intent 对象 TaskStackBuilder.editIntentAt()。这有时是必要的,以确保 目标 Activity 显示有意义的数据,当用户 使用 Back 导航到它。通过以下方式获取此返回堆栈的 PendingIntent 调用 getPendingIntent()。然后,您可以将此 PendingIntent 用作 setContentIntent() 的参数。

对格式问题感到抱歉。我不确定如何保存网站上的原件。

【讨论】:

  • 谢谢。我实际上也尝试过。我将重做并再次编辑帖子。顺便说一句,你投票否决了这个问题?请问为什么?
  • @AndreiN。不,我没有投反对票。我会加个赞。
  • 嗯,使用 PendingIntentFlags.UpdateCurrent | PendingIntentFlags.OneShot 解决了这个问题。
  • @AndreiN。很高兴知道。我认为标志可能是个问题,但是当我查看说明时,我没有看到任何暗示您使用的标志不起作用的任何信息。
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多