6

DashClockExtension時々更新されないことがあります。

LocalBroadcastReceiver を使用して、http://bit.ly/1e4uMl0のような拡張子を更新しています。受信者はonInitialize()メソッドに登録されます。

@Override
    protected void onInitialize(boolean isReconnect) {
        super.onInitialize(isReconnect);

        LocalBroadcastManager broadcastMgr = LocalBroadcastManager.getInstance(this);
        if (mDashClockReceiver != null) {
            try {
                broadcastMgr.unregisterReceiver(mDashClockReceiver);
            } catch (Exception ignore) {}
        }
        mDashClockReceiver = new DashClockUpdateReceiver();
        broadcastMgr.registerReceiver(mDashClockReceiver, new IntentFilter(UPDATE_DASHCLOCK));
    }

それが私がブロードキャストを送信する方法です:

public static void updateDashClock() {
    LocalBroadcastManager.getInstance(Application.getContext()).sendBroadcast(new Intent(UPDATE_DASHCLOCK));
}        

それが私のBroadcastReceiverです:

private class DashClockUpdateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        retrieveDataAndUpdateWidget();
    }
}

ブロードキャストがトリガーされている間、レシーバーがイベントを受信しない場合があることに気付きました。
アプリを強制終了してテストしましたが、問題が再現されないため、なぜこれが起こるのかわかりません。

誰?

4

3 に答える 3

2

Google の GCM Client exampleで GCM ブロードキャスト レシーバーがどのように実装されているかをご覧ください。

より多くのメモリが必要なため (または何らかの理由で)、アプリケーションが Android OS によって強制終了され、ブロードキャスト レシーバーでブロードキャストを受信できなくなったことが原因である可能性があります。

役に立てば幸いです。そうでない場合は、ログと詳細情報を提供してください。

頑張ってください!

于 2013-12-19T17:02:26.117 に答える
1

大規模なテストを実行した後、他の開発者にとっても興味深い結果が得られました。

  • アプリがAndroidによって強制終了されたときに実際に発生します(Androidがアプリを強制終了するのを待ちませんでしたが、もちろん手動で強制終了しました)
  • DashClock ウィジェットは、しばらくするとサービスを再度バインドします。私の推測では、約 1 時間に 1 回 (DashClockExtension javadoc によると) スケジュールされた ui 更新を実行すると、サービスが再度バインドされると思います。ただし、ソースコードを調べてその推測を確認しませんでした。
  • したがって、拡張機能は最終的に更新されますが、通常の更新サイクルが実行された後にのみ更新されますが、これは最大 1 時間発生しない可能性があります。

これが私の回避策です:

  • DashClock ウィジェットは ACTION_PACKAGE_CHANGED インテント ( http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_CHANGED ) をリッスンして、すべての DashClockExtensions (ACTION_EXTENSION インテント フィルターを使用したサービス) を検索します。
  • アプリの起動時に DashClockExtension サービスを無効にしてから再度有効にすることで、DashClock Widget にサービスをすぐにバインドさせることができます。
  • これをテストしたところ、アプリが強制終了されて再起動されてから、DashClock ウィジェットの UI が再び更新されるまで数秒かかりました。

サービスを無効にして有効にする方法は次のとおりです。

configureComponent("mypackagename.DashClockService", false); // disable
configureComponent("mypackagename.DashClockService", true);  // enable

private void configureComponent(Context context, String className, boolean enable) {
    PackageManager pkMgr = context.getPackageManager();
    String packageName = context.getPackageName();
    ComponentName component = new ComponentName(packageName, className);
    int newState = enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
    pkMgr.setComponentEnabledSetting(component, newState, PackageManager.DONT_KILL_APP);
}
于 2013-12-20T21:43:09.013 に答える
1

私の最初の答えは機能しますが、望ましくない副作用がいくつかあります。したがって、副作用のないより良い解決策を思いつきました。

addWatchContentUris を使用して特定の Uri を監視するように DashClockWidget に指示し、ウィジェットを更新するときは、その Uri で notifyChange を呼び出すだけです。

public class DashClockService extends DashClockExtension {
    private static final Uri URI_BASE = Uri.parse("content://com.myauthority");
    private static final String URI_PATH_SEGMENT = "dashclock/update";

    public static void updateWidget(Context context) {
        ContentResolver contentResolver = context.getContentResolver();
        Uri uri = Uri.withAppendedPath(URI_BASE, URI_PATH_SEGMENT);
        contentResolver.notifyChange(uri, null);
    }

    @Override
    protected void onInitialize(boolean isReconnect) {
        super.onInitialize(isReconnect);

        removeAllWatchContentUris();
        Uri uri = Uri.withAppendedPath(URI_BASE, URI_PATH_SEGMENT);
        addWatchContentUris(new String[] {uri.toString()});
    }

updateWidget は、コード内のどこからでも呼び出して、ウィジェットを更新できます。最も重要なことは、アプリの起動時に呼び出すことができることです。たとえば、Android によって強制終了されて再起動した後です (Application.onCreate() で更新を呼び出しています)。

于 2014-05-13T04:46:45.577 に答える