AppWidget更新服务不会在正在从主机删除的窗口小部件上停止

时间:2010-11-03 14:43:27

标签: android android-widget android-appwidget

我想要做的是,一旦AppWidget从用户Android手机的主屏幕中删除,我想停止更新AppWidget的后台服务。

这是我正在使用的代码......不明白什么是错的?

@Override
 public void onDeleted(Context context, int[] appWidgetIds){
 Intent serviceIntent = new Intent(context, UpdateService.class);
 context.stopService(serviceIntent);
 super.onDeleted(context, appWidgetIds);
}

有什么想法吗?谢谢你的帮助。

2 个答案:

答案 0 :(得分:5)

经过大量研究后我终于解决了这个问题。我的目标是在屏幕上删除所有AppWidget实例时停止后台服务。

这就是它......

  1. 使用共享首选项切换1和0.当用户将小部件的第一个实例放在屏幕上时,SharePref切换为1。当从屏幕上删除最后一个App小部件实例时,它会切换回0。

  2. 服务中的@Override OnReceive方法。侦听这些广播 - AppWidget已启用(当窗口小部件的第一个实例放在屏幕上时广播),AppWidget已禁用(当窗口小部件的最后一个实例从屏幕上移除时由OS广播) 当广播AppWidget禁用时,调用重写方法OnDisabled方法。

  3. 3.在@Override OnDisabled方法中调用stopService。效果很好。

    记住OnDeleted和OnDisabled之间的区别。当删除窗口小部件的实例时调用OnDeleted,这并不意味着要删除的窗口小部件是最后一个。即使屏幕上有一个小部件实例,我也希望我的服务仍然可以运行。

    * 此外,如果您不想完成上述所有操作并让Android负责服务等...请使用IntentService。 * *

答案 1 :(得分:0)

我认为stopservice在服务本身中调用onDestroy。 它适用于我使用服务

中的以下代码
@Override
public void onDestroy() {
    super.onDestroy();
    timer.cancel();
    //Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();

}

timer是我在_startService void

中启动的计时器