Widget + TaskKiller 中的 PendingIntent

Posted

技术标签:

【中文标题】Widget + TaskKiller 中的 PendingIntent【英文标题】:PendingIntent in Widget + TaskKiller 【发布时间】:2011-02-11 23:22:33 【问题描述】:

我开发了一个应用程序(称为即时按钮),该应用程序具有小部件功能。这个小部件使用 PendingIntent 作为小部件的 onClick。

我的 PendingIntent 代码是这样的:

    Intent active = new Intent(context, InstantWidget.class);
    active.setAction(String.valueOf(appWidgetId));
    active.putExtra("blabla", blabla); //Some data

    PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0);

    actionPendingIntent.cancel();
    actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0);

    remoteViews.setOnClickPendingIntent(R.id.button, actionPendingIntent);

onReceive 获取意图并使用 MediaPlayer 类做一些事情来重现声音。

我收到一些用户的报告,说这些小部件会在一段时间后停止工作,并且通过一些研究我发现是因为任务杀手。似乎当你在TaskKiller中杀死应用程序时,PendingIntent会从内存中删除,所以当你点击小部件时,它不知道该怎么做。

有什么解决办法吗?我的代码是错误的还是什么,或者它是 PendingIntent 的默认行为?有什么东西可以用来避免 TaskKiller 阻止我的小部件工作吗??

您好。

【问题讨论】:

我没有任何任务杀手问题,但您的代码正是我需要弄清楚 PendingIntents 如何工作,然后让它们为我的小部件及其相关通知的多个实例工作。谢谢! 【参考方案1】:

有什么解决办法吗?

要求您的用户不要使用任务杀手。或者,等待一些未来的 android 版本来关闭任务杀手漏洞。

我的代码是错的还是什么 的默认行为 待定意图?

您的代码可能没问题。任务杀手使用的 hack 几乎可以摧毁一切,所以我对这种行为一点也不感到惊讶。

有什么可以避免的吗 TaskKiller 阻止我的小部件 工作吗?

不是真的。您的用户——至少不是完全白痴的用户——有望学会更多地意识到他们使用任务杀手的影响。目前,对于任务杀手级应用,没有任何合理的防御措施。

【讨论】:

【参考方案2】:

当应用程序被关闭时,小部件中的未决意图不再连接到它们的活动,我也遇到了同样的问题。创建、取消和重新创建都有效,但您也可以指定取消当前标志,这样您就不必自己显式调用取消,因为系统会为您执行此操作。 当您创建待处理意图而不是使用时

PendingIntent.getBroadcast(context, 0, active, 0);

使用

PendingIntent.getBroadcast(context, 0, active, PendingIntent.FLAG_CANCEL_CURRENT);

【讨论】:

以上是关于Widget + TaskKiller 中的 PendingIntent的主要内容,如果未能解决你的问题,请参考以下文章

PE中的两种状态

PE工具中的WinNTSetup(又称 win安装器)

Flutter中的参数类型'Widget Function(BuildContext)'不能分配给参数类型'Widget Function(BuildContext,Widget)'错误

PE知识复习之PE合并节

PE文件中的输入表

Flutter Bloc 如何从 Widget 本身更新 BlocBuilder 中的 Widget?