【问题标题】:Android - App widget can not use pending intents when the application restartsAndroid - 应用程序重新启动时,应用程序小部件无法使用挂起的意图
【发布时间】:2011-10-04 21:07:17
【问题描述】:

我的应用程序除了 Activity 之外还有一个服务和一个应用小部件。

我希望单击小部件会导致一段代码执行,这段代码将启用/禁用应用程序的服务。 因此,单击应用小部件会启动一个挂起的意图,以这种方式构建:

Intent intent = new Intent(ACTION_ENABLE_DISABLE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

(当然,ACTION_ENABLE_DISABLE 是我定义的。)

在清单中,我在意图过滤器中指定此操作。

然后,我重写了 onReceive 方法,如果意图的操作是 ACTION_ENABLE_DISABLE,我执行启用/禁用服务的那段代码。 如果不是,我调用 super.onReceive,这样正常的应用小部件广播就会完成。

到目前为止一切顺利!小部件工作正常。

但是,假设我在应用的 PID 为 X 时创建了它。 然后,用户离开了我的活动,它们被销毁了;所以作为服务 - 假设用户关闭了它。 所以我的流程既不托管活动也不托管服务 - 它被销毁/从任务管理器中退出,这两种情况都是相关的。 下次创建它时,它具有不同的 PID,现在,单击应用小部件没有任何作用。

仍然可以手动更新应用小部件,例如,从活动中更新。但是点击它并不会导致:

  1. 正在发送 ACTION_ENABLE_DISABLE 广播。 或
  2. 我的应用小部件接收到此广播。

以下情况之一发生 - 当我查看 logcat 时,我在小部件的“onReceive”方法中使用 Log.d 记录的消息没有出现。

这是为什么呢?发送广播时是否需要指定任何特殊内容,或者清单中的接收者声明中的任何内容?

说到这里,当点击应用小部件中的视图(而不是我的方法)时,有没有更好的方法可以用来执行您自己的代码。

非常感谢!

【问题讨论】:

    标签: android widget broadcastreceiver


    【解决方案1】:

    这几天我遇到了同样的问题。我在几台设备上测试了我的应用程序,有些设备有这个问题,有些没有。然后我发现如果你在任务管理器中杀死小部件的进程(第一个,X),那么下次你创建小部件并且它可以正常工作。 所以这是我的解决方案。 在 onDisable() 函数中添加以下代码。

    int pid = android.os.Process.myPid();
    android.os.Process.killProcess(pid);
    

    当您删除小部件时,这将自行终止。所以下次创建它就可以正常使用了。

    【讨论】:

    • 我很久以前就解决了我的问题(删除了服务并创建了 另一个 BroadcastReceiver 来接收广播,它确实解决了它。我知道如果你删除/禁用小部件并重新添加它,它会工作。但这不是我的问题:(小部件根本没有被禁用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多