【问题标题】:ContentObserver not called only in LG devicesContentObserver 不仅在 LG 设备中调用
【发布时间】:2014-03-11 16:29:05
【问题描述】:

我正在编写一个小部件,每次我接到未接来电时它都必须自行更新。为此,在 AppWidgetProvider 类的 onEnabled 方法中,我注册了一个 ContentObserver。代码如下:

@Override
public void onEnabled(Context context){
    this.mcco = new MissedCallsContentObserver(context);
    context.getContentResolver().registerContentObserver(Calls.CONTENT_URI, true, this.mcco);
}

MissedCallsContentObserver 类的代码如下:

package bembibre.coolstar.windowsmobilewidget.backend;

import bembibre.coolstar.windowsmobilewidget.backend.textproviders.CallsProvider;
import android.content.Context;
import android.database.ContentObserver;

public class MissedCallsContentObserver extends ContentObserver
{
    Context context;

    public MissedCallsContentObserver(Context context)
    {
        super(null);
        this.context = context;
    }

    @Override
    public void onChange(boolean selfChange)
    {
        try{
            Thread.sleep(1000);
        }
        catch(Exception e){

        }
        new CallsProvider(this.context).setData();
    }
}

手机每次收到未接来电时都会自动调用onChange方法。这适用于我测试过的许多设备。但我也在 LG L5 上对其进行了测试。这是唯一不起作用的设备。为什么?三星设备和 LG 设备中的 ContentObservers 不一样?在 LG 中,永远不会调用 onChange 方法。 我还想问一个关于我的 Eclipse 调试器的问题。使用我的三星手机,它运行良好,但使用之前提到的索尼 Xperia 和 LG,它会在需要时断开连接。如果什么都不做,调试器会突然断开连接。我的 USB 线是完美的。还有我的电脑和手机的USB端口。为什么调试器断开连接? logcat 中不会抛出异常或错误消息。不知道是什么问题。

【问题讨论】:

  • 三星和 LG 大量修改了框架代码,您是否检查过任何 LG 的错误报告?
  • 是的,我做到了。我什么也没找到。而ContentObserver是一个非常基础的Android机制。我不明白制造商如何改变这一点。这意味着在 LG 手机中,很多应用程序都无法运行,比如我的。很多应用程序都需要 ContentObservers。
  • 我的问题的原因可能是我调用 ContentObserver 构造函数将 null 传递给它而不是 Handler 实例?这是我在代码中看到的唯一奇怪的东西。
  • contentobserver 与数据解耦,它是 contentprovider 在任何 contentresolver 上调用 notifychange(在观察者注册后),LG 可能已将提供程序修改为不发送 notoifychange 调用,因此您没有收到您的内容观察者中的任何内容。 (虽然看起来很奇怪)
  • 您是否至少启动过一次应用程序?从未启动的应用程序不会收到隐式意图。

标签: android contentobserver appwidgetprovider lg


【解决方案1】:

我所有的ContentObservers 都在AppWidgetProvider 类中注册和取消注册。我读到这不安全,例如在某些 LG 手机中,它似乎不起作用。我所做的是一个粘性Service(在覆盖方法onStartCommand() 的末尾,您必须返回常量START_STICKY)。然后,在服务内部,我注册了ContentObservers,现在它适用于所有手机。似乎粘性服务永远存在。如果没有,除非我再次创建服务,否则我的应用程序将停止工作。

当服务创建时,我注册ContentObservers,当它被销毁时,我取消注册它们。当您不再使用 ContentObserver 时忘记取消注册似乎很危险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多