2011-10-02 7 views
12

私はバッテリーレベルをチェックしてTextViewに表示するAppWidgetに取り組んでいます。私のコードは次のようになります。ACTION_BATTERY_CHANGED Crazyのように発砲

public class BattWidget extends AppWidgetProvider { 

private RemoteViews views = new RemoteViews("com.nickavv.cleanwidgets", R.layout.battlayout); 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds[]) { 
    final int N = appWidgetIds.length; 
    context.getApplicationContext().registerReceiver(this,new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    for (int i = 0; i < N; i++) { 
     int appWidgetId = appWidgetIds[i]; 
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    super.onReceive(context, intent); 
    Log.d("onReceive", "Received intent " + intent); 
    if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) { 
     Integer level = intent.getIntExtra("level", -1); 
     views.setTextViewText(R.id.batteryText, level+"%"); 
     AppWidgetManager myAWM = AppWidgetManager.getInstance(context); 
     ComponentName cn = new ComponentName(context, AirWidget.class); 
     onUpdate(context, myAWM, myAWM.getAppWidgetIds(cn)); 
    } 
} 
} 

とすぐ、私は私のホームスクリーン上にウィジェットをドロップするように、約100これらのログのオフ発射開始しますので、私は心配そうだ、それはACTION_BATTERY_CHANGEDを​​受けていますと言って、二を呼び出します。これはそれぞれのパーセント低下のために放送されるだけではありませんか?実際に私のランチャー全体が遅れてしまったので、私はそれをアンインストールしなければなりませんでした。それは正しいことではありません。

+0

これについて実際には分かっていませんが、バッテリーを監視し、あらかじめ定義された時間間隔でwidgitにフィードバックするサービスを設定する価値がありますか? – mAndroid

答えて

23

私のコードは次のようになります。あなたが別のBroadcastReceiverからBroadcastReceiverを登録し、信頼性の高い結果を得ることができません

。 Androidは動作しているとは思わないので、プロセスを終了します。 ACTION_BATTERY_CHANGEDを聞く唯一の方法は、受信者をアクティビティまたはサービスから登録することです。

%減少ごとにブロードキャストされるはずですか?

ここに記載されていますか? AFAIK、ACTION_BATTERY_CHANGEDは、ハードウェアがそのように感じるたびにブロードキャストされます。また、他のデータも温度のようなIntentの範囲内で変化することに注意してください。

このアプリウィジェットを実装する場合は、ACTION_BATTERY_CHANGEDに登録しないでください。代わりに、

  • ユーザーにSharedPreference(例:、1分に1回、一回ごとに15 mintues)
  • 使用AlarmManagerは、これが戻りますよう、ACTION_BATTERY_CHANGEDのためではなく、null BroadcastReceiverregisterReceiver()を呼び出し、そのBroadcastReceivergetBroadcast()PendingIntent
  • を経由して、あなたがそのポーリング期間に制御し得ることあなたに最後に、そのアクションのために放送されたIntent(注:あなたはまだこのためgetApplicationContext()を使用する必要があります)
  • 使用AppWidgetManagerバッテリレベルでのアプリウィジェットのインスタンスを更新するためには、あなたが、前に取得したIntentから引き出さステップ(注:あなたはそれらすべてが同じになるように設定している場合は、あなたがのIDを反復処理する必要はありません - パラメータとしてComponentNameをとるupdateAppWidget()を使用)

これは、いくつかの利点があります。

  1. あなたはあなたの
  2. (あなたが分以上のポーリング期間を置いている場合は無視できるはずです)
  3. 放送される頻度ACTION_BATTERY_CHANGEDユーザーがこれらのチェックを行うことによって、あなたが消費どのくらいのバッテリーを制御するために取得する気にしませんプロセスは安全にtermiすることができますこれにより、アプリの
+2

これについては、これは最善の方法ではありません。私は、変更が発生するとすぐに情報を更新するクローズドソースバッテリウィジェットをたくさん見てきました(BattStattが良い例です)。私はユーザーに更新間隔を提供するものを見たことがない。バッテリーレベルウィジェットは常に正確であると考えられています。 – Nick

+1

@Nick: "これは最善の方法ではありません" - あなたはあなたの意見を得る権利があります。 「変更が発生したらすぐに情報を更新するクローズドソースバッテリウィジェットはたくさんありました。これらのウィジェットは、常にサービスをメモリに保存してRAMを無駄にしています。ユーザーは、これを行う開発者はばかだと思っています。なぜ、タスクキラーが普及しているのか、そしてOSはそのようなサービスを積極的に停止しなければなりません。 – CommonsWare

+0

@Nick:バッテリーレベルが特に頻繁に変化しないので、バッテリーレベルのウィジェットは常に正確であると思われます。ポーリングアーキテクチャーは、RAMのヒットを避けながら十分に正確であり、すべての時間。 – CommonsWare

0

をアップし、ユーザーがタスクキラーであなたを攻撃する可能性が低くなって、半恒久的混乱、ポーリングの間でNAT変換まあ、あなたにonUpdateはbatteryinfo意図のための受信機として、独自のクラスを登録しています。このインテントは、最初の情報に対してすぐにトリガーされます。 あなたのonReceiveから再びあなたのonUpdateが呼び出されています。これをループと呼びます。したがって、100秒に1秒を記録します...

関連する問題