小部件更新服务在小部件从主机中删除后未停止

3

我想要做的是,一旦用户将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) 方法能在这方面有所帮助吗? - Aakash
是否抛出任何异常? - Prateek Jain
@prateek-jain 没有抛出任何异常,但服务也没有停止。 - Aakash
2个回答

5
经过大量研究,我终于解决了它。我的目标是在从屏幕中删除所有AppWidget实例后停止后台服务。
这就是我的解决方法...
1.使用共享首选项来切换1和0。当用户第一次将widget实例放在屏幕上时,SharePref切换为1。当最后一个App widget实例从屏幕中移除时,它会被切换回0。
2.@Override Service中的OnReceive方法。监听这些广播-AppWidget已启用(当用户第一次将widget实例放在屏幕上时广播),AppWidget已禁用(操作系统在最后一个widget实例从屏幕中移除时广播)。当AppWidget Disabled广播调用被覆盖的OnDisabled方法时。
3.在@Override OnDisabled方法中调用stopService即可。
请记住OnDeleted和OnDisabled之间的差异。当删除widget实例时,将调用OnDeleted,这并不意味着正在删除的widget是最后一个。即使屏幕上只有一个widget实例,我也希望我的服务仍然运行。
另外,如果您不想执行以上所有操作并让Android处理服务等,请使用IntentService。

1
还要记住,这是解决AppWidget框架中已在Google组中确认的getAppWidgetIds() bug的关键,该bug会给出随机值,并且无法从此方法知道您的小部件是否正常工作以及是否应更新它。因此,每次更新小部件时,请检查Shared Pref值,然后进行更新。可以节省很多开销!如果有人需要代码,请告诉我。 - Aakash

0

我认为stopservice在服务本身中调用onDestroy。 使用以下代码在服务中对我有效

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

}

timer 是我在 _startService 函数中启动的计时器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接