2013-12-11 18 views
6

DashClockExtensionがあります。これは時々更新されません。Dashclockウィジェットの拡張が更新されない

LocalBroadcastReceiverを使用して、拡張子をhttp://bit.ly/1e4uMl0に更新しています。私は放送がトリガされている間に気づい

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

@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のレシーバはonInitialize()方法で登録されています受信者はイベントを受信しないことがあります。
私は自分のアプリを殺すことによってそれをテストしましたが、それは問題が再現されないので、私はこのことがどうして起こるのか迷っています。

誰でも?

+0

もっとコードを投稿できますか?どのくらい正確にデータを更新しようとしていますか? publishUpdateが失敗した場合、publishUpdate(null) –

+0

を呼び出さない限り、古いデータは残っています。問題は更新コードではなく、ブロードキャストがブロードキャスト受信者によって受信されないという事実です。通常、それはうまく動作しますが、「時には」そうではありません。なぜこれが起こるのを防ぐために私が何ができるのかを知りたいのです。当初は、アプリケーションがシャットダウンされたときに、DashClockウィジェット自体によってサービスが再度バインドされることはないと考えられ、BroadcastReceiverは登録されませんでしたが、そうではありません。サービスが始まり、ウィジェットだけで結構です。 –

答えて

1

私の最初の答えは動作しますが、それはいくつかの望ましくない副作用を持っています。したがって、私は副作用のないより良い解決策を思いつきました。 addWatchContentUrisを使用して、特定のURIを観察し、それはウィジェットを更新する時が来たときに、ちょうどそのウリにnotifyChangeを呼び出すため

指示しDashClockWidget:

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()で更新を呼び出しています)。

2

GCMブロードキャスト受信機の実装方法をGoogle's GCM Client exampleでご覧ください。

あなたのapplication was killed by the Android OSはメモリが増えたため(何らかの理由で)ブロードキャストを受信しなかった可能性があります。

私はそれが役立つことを望みますが、そうでない場合は、いくつかのログと詳細をお知らせください。

運が良かった!

+0

BroadcastReceiverはメンバークラスである必要があるため動的に登録する必要があります。公開されていない場合は、publishUpdate(ExtensionData)(サービスであるDashClockExtensionのメソッド)を呼び出すことはできません。参照:http://stackoverflow.com/a/15571547/534471)。 マニフェストでBroadcastReceiverを定義すると、ブロードキャストを受信できますが、publishUpdate(ExtensionData)を呼び出す方法がないため、ウィジェットを更新できませんでした。 –

1

広範なテストを実行した後、私はあまりにも他の開発者にinteresstingされる可能性がありますいくつかの結果だ:アプリは、Androidのアプリを殺すためにするために(私は待つことはありませんでしたアンドロイドによって殺されたときにそれが実際に起こる

  • は、しかし手動でそれを手動で殺しました)
  • DashClockウィジェットはしばらくしてからサービスを再度バインドします。私の推測では、DashClockExtension javadocによると、約1時間に1回程度のスケジュールされたuiアップデートを実行すると、サービスを再度バインドすることになります。私はソースコードを通過することで推測を確認しませんでした。
  • したがって、拡張機能は最終的に更新されますが、通常の更新サイクルが実行された後にのみ更新されます.1時間までは発生しない可能性があります。

ここに私の回避策です:

  • DashClockウィジェットは無効とDashClockExtensionサービスがとき私の再有効化することにより、すべてのDashClockExtensions(ACTION_EXTENSIONインテントフィルタを持つサービス)
  • を見つけることACTION_PACKAGE_CHANGEDインテント(http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_CHANGED)に耳を傾けアプリが起動すると、DashClockウィジェットがすぐにサービスをバインドするよう強制することができます。
  • これをテストしたところ、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); 
} 
+0

このソリューションを有効にしたり無効にしたりすると、サービスがSamsungデバイスに望ましくない副作用を引き起こします。例:ショートカットカスタムアイコンや説明を失う可能性があります(アプリのアイコンと名前に戻ります)。私はしかし、アプリケーションがクラッシュした後、DashClockWidgetに確実に再接続するためのより良い方法を見つけました(私の新しい答えを見てください)。 –

関連する問題