1

不在着信を受けるたびに自分自身を更新する必要があるウィジェットをプログラミングしています。そのために、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 でもテストしました。これは、機能しない唯一のデバイスです。なんで?ContentObservers は、Samgung デバイスと LG デバイスで同じではありませんか? LG では、メソッド onChange が呼び出されることはありません。また、Eclipse デバッガーについて質問したいと思います。私のSamsung電話では問題なく動作しますが、前述のSony XperiaとLGでは、必要なときに切断されます. 何もせずに、デバッガーが突然切断されます。私のUSBワイヤーは完璧です。また、私のコンピューターと電話の USB ポート。デバッガーが切断されるのはなぜですか? logcat に例外もエラー メッセージもスローされません。何が問題なのかわからない。

4

1 に答える 1

0

ContentObserverのすべてがクラス内で登録および登録解除されましたAppWidgetProvider。これは安全ではないと読みました。たとえば、一部の LG フォンでは機能しないようです。私が作ったのはスティッキーですService(オーバーライドされたメソッドの最後でonStartCommand()、定数を返す必要がありますSTART_STICKY)。次に、サービス内でContentObservers を登録すると、すべての電話で動作するようになりました。スティッキーサービスは永遠に存在するようです。そうしないと、サービスを再度作成しない限り、アプリケーションが機能しなくなります。

サービスが作成されたらContentObservers を登録し、サービスが破棄されたら登録を解除します。ContentObserver使わなくなったら登録解除し忘れると危ないらしい。

于 2014-03-11T08:29:05.193 に答える