【问题标题】:AppWidget Update Service does not stop on Widget being Deleted from hostAppWidget 更新服务不会在从主机中删除 Widget 时停止
【发布时间】:2010-11-03 14:43:27
【问题描述】:

我想要做的是,一旦 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);
}

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

【问题讨论】:

  • 在这方面重写 onDisabled(Context context) 有帮助吗?
  • 是否抛出异常?
  • @prateek-jain 没有抛出异常,但服务也没有停止。

标签: android android-widget android-appwidget


【解决方案1】:

经过大量研究,我终于修复了它。我的目标是在所有 AppWidget 实例都从屏幕上移除后停止后台服务。

原来如此……

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

  2. Service 中的@Override OnReceive 方法。收听这些广播 - AppWidget 已启用(当小部件的第一个实例放在屏幕上时广播),AppWidget 已禁用(当小部件的最后一个实例从屏幕上移除时由操作系统广播) 当 AppWidget Disabled 被广播时,调用被覆盖的方法 OnDisabled 方法。

3.在@Override OnDisabled 方法中调用stopService。完美运行。

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

*此外,如果您不想执行上述所有操作并让 Android 处理 Service 等...请使用 IntentService。 **

【讨论】:

  • 另外请记住,这是解决 AppWidget 框架中的错误的关键,该错误已在 Google 小组中得到确认,有关 getAppWidgetIds() 给出随机值,如果您的小部件已启动,您是否应该更新它。因此,每次需要更新小部件时,请检查 Shared Pref 值,然后进行更新。节省大量开销!!如果有人想要代码,请告诉我。
【解决方案2】:

我认为 stopservice 在服务本身中调用 onDestroy。 它适用于服务中的以下代码

@Override
public void onDestroy() {
    super.onDestroy();
    timer.cancel();
    //Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();

}

计时器是我在 _startService void 中启动的计时器

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    相关资源
    最近更新 更多