2016-07-15 9 views
2

すべての主題私はstackoverflowで見つけたすべての方法を試してみましたが、そのうちのどれもうまくいきませんでした。Android BroadcastReceiverはウィジェットを更新していません

私はバッテリー監視アプリケーションを開発しており、情報を表示するウィジェットがいくつか含まれています。私は、ACTION_BATTERY_CHANGEDイベントを聞くために、BatteryUpdateReceiverと呼ばれる共通の受信機を使用します。このレシーバーを使って現在のバッテリーレベルを示すウィジェットを更新します。しかし何らかの理由でウィジェットを更新しません。私は多くの方法を試みたが、何が間違っているのか分からなかった。私のコードは以下の通りです。

BatteryUpdateReceiver.java

public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) { 
      Log.i(TAG, "Receiver ACTION_BATTERY_CHANGED fired"); 

      RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
        R.layout.widget); 

      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext()); 
      ComponentName thisWidget = new ComponentName(context.getApplicationContext(), BatteryWidget.class); 
      int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 
      for (int i=0; i < allWidgetIds.length; i++) { 
       Log.i(TAG, "WID ID: " + allWidgetIds[i]); 
       appWidgetManager.updateAppWidget(allWidgetIds[i], remoteViews); 
      } 
     } 
    } 

BatteryWidget.java

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 

     Log.i(TAG, "onUpdate: "); 

     int currentLevel = calculateBatteryLevel(context); 
     if (batteryChanged(currentLevel)) { 
      batteryLevel = currentLevel; 
      Log.i(TAG, "onUpdate: Battery level changed"); 
     } 
     updateViews(context); 
    } 

    private boolean batteryChanged(int currentLevelLeft) { 
     return (batteryLevel != currentLevelLeft); 
    } 

    private int calculateBatteryLevel(Context context) { 
     Log.i(TAG, "calculateBatteryLevel: "); 

     Intent batteryIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

     int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 
     int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 100); 
     return level * 100/scale; 
    } 

    private void updateViews(Context context) { 
     Log.i(TAG, "updateViews: "); 

     RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 
     views.setTextViewText(R.id.batteryText, batteryLevel + "%"); 

     ComponentName componentName = new ComponentName(context, BatteryWidget.class); 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
     appWidgetManager.updateAppWidget(componentName, views); 
    } 

のAndroidManifest.xml

<receiver android:name=".lib.receivers.BatteryUpdateReceiver" android:enabled="true" /> 

    <receiver android:name=".widget.BatteryWidget" android:label="@string/app_name" > 
     <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 
     <meta-data 
        android:name="android.appwidget.provider" android:resource="@xml/batterywidgetinfo" /> 
    </receiver> 

デバイスの起動時にサービスを使用してBatteryUpdateReceiverを登録します。

IntentFilter filterBattery = new IntentFilter(); 
filterBattery.addAction(Intent.ACTION_BATTERY_CHANGED); 
this.mBatteryStatusReceiver = new BatteryUpdateReceiver(); 
getApplicationContext().registerReceiver(this.mBatteryStatusReceiver, filterBattery); 
Log.i(TAG, "Receiver ACTION_BATTERY_CHANGED registered by Service"); 

それはウィジェットIDを記録しますので、私はそのBatteryUpdateReceiver作品を確認することができます。また、受信機をBatteryWidgetの中に入れると、ウィジェットが更新されます。誰かがここで私が何が欠けているか教えてくれますか?私はBatteryWidgetクラスのonReceive()メソッドをオーバーライドできることを知っています。しかし、どうすればこのようにアーカイブできますか?

ありがとうございます!

答えて

3

updateAppWidget()に直接電話するのではなく、ACTION_APPWIDGET_UPDATEブロードキャストを受信者から送信する必要があります。このような

何か:

@Override 
public void onReceive(Context context, Intent intent) { 
    AppWidgetManager widgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
    int[] appWidgetIds = widgetManager.getAppWidgetIds(new ComponentName(context, BatteryWidget.class)); 

    Intent updateIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, getApplicationContext(), BatteryWidget.class); 
    updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 

    sendBroadcast(updateIntent); 
} 
+0

Woohoo!それは働いている。私の日を救った。ありがとう! –

+0

あなたは大歓迎です:) – earthw0rmjim

関連する問題