BroadcastReceiverのACTION_BATTERY_CHANGEDについて

562 views
Skip to first unread message

斉藤

unread,
Jun 14, 2014, 2:48:16 AM6/14/14
to android-g...@googlegroups.com

バッテリー残量を表示するウィジェットを作成していますが、
onReceiveの動きについて、分からない事があります。

ウィジェット実行中にACTION_BATTERY_CHANGEDをBroadcastReceiverが
受け取り、onReceiveが実行される事は理解できます。
しかし、ウィジェットを初回起動(ホーム画面に表示)した時もonReceive
が実行されるのはなぜでしょうか。
バッテリーの残量が減った時以外でもACTION_BATTERY_CHANGEDが通知される
のでしょうか。

プログラムを作る側としては、初回起動でonReceiveが実行される方が
バッテリー残量を表示出来て良いのですが、不思議なので質問します。


public class SampleBatteryWidget extends AppWidgetProvider {
    @Override
    public void onUpdate(Context c, AppWidgetManager awm, int[] awi) {
        Intent in = new Intent(c, WidgetService.class);
        c.startService(in);
    }
   
    public static class WidgetService extends Service {
        @Override
        public void onStart(Intent in, int si) {
            IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_BATTERY_CHANGED);
            registerReceiver(batteryReceiver, filter);
        }
       
        @Override
        public IBinder onBind(Intent in) {
            return null;
        }
    }
   
    private static BroadcastReceiver batteryReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context c, Intent in) {
        }
    };
}

Makoto Yamazaki

unread,
Jun 14, 2014, 9:05:51 AM6/14/14
to android-g...@googlegroups.com
zaki  です。

のコメントに書かれているように、ACTION_BATTERY_CHANGED として送信される
Broadcast Intent  は sticky broadcast  と呼ばれるものだからです。

等のメソッドで送信されるもので、Action 毎に最後に送信されたものがシステムによって
保持され、registerReceiver されるとその最後の intent  が自動的に送信されます。
今回バッテリー残量に変化がなくても受け取れているのはこのためです。

また、sticky なものは、 registerReceiver よ呼んだ際の返り値としても
返されます。なので、もし現在の値が欲しいだけれあれば Receiver をつくらなくても
受け取ることができます。








--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
YAMAZAKI Makoto

斉藤

unread,
Jun 14, 2014, 9:01:48 PM6/14/14
to android-g...@googlegroups.com

zaki様

大変ご丁寧な回答ありがとうございます。
疑問が解けました。
Reply all
Reply to author
Forward
0 new messages