Android - 应用程序窗口小部件在应用程序重新启动时无法使用挂起的意图

时间:2011-10-04 21:07:17

标签: android widget broadcastreceiver

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

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

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

(ACTION_ENABLE_DISABLE当然由我定义。)

在清单中,我在intent过滤器中指定了这个动作。

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

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

但是,假设我的应用程序的PID为X时创建了它。 然后,用户离开我的活动,他们被摧毁;所以作为服务 - 让我们说用户关闭它。 因此,我的进程不承载任何活动或服务 - 它被销毁/退出任务管理器,两种情况都是相关的。 下次创建它时,它有一个不同的PID,现在,点击应用程序小部件就没有了。

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

  1. 正在发送ACTION_ENABLE_DISABLE广播。 OR
  2. 我的应用小部件接收此广播。
  3. 上面发生以下情况之一 - 就像我查看logcat一样,我在小部件的'onReceive'方法中使用Log.d记录的消息不会出现。

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

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

    非常感谢!

1 个答案:

答案 0 :(得分:0)

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

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

当您删除小部件时,这将自行终止。因此,下次创建它时,它将正常工作。