バッテリー残量ウィジェットの作り方 (3/4)

~ バッテリー残量の取得と表示 ~

前へ   1  2  3  4   次へ
前回で下準備も終わったので、今回は、バッテリー残量を取得して、ウィジェットに表示します。バッテリー残量を取得するために、ブロードキャストレシーバーを使います。

12.バッテリー残量を取得する手順

システムから飛んでくるインテントを、ブロードキャストレシーバーで受け取ります。そして、そのインテントからバッテリー情報を引き出します。手順は、こんな感じです。

(1)ブロードキャストレシーバーを準備します。
(2)インテントからバッテリー残量の情報を引き出します。
(3)ウィジェットに表示します。
(4)マニフェストを設定します。

それでは1つ1つ作って行きましょう。

13.ブロードキャストレシーバーを準備する

BroadcastReceiverを継承したクラスを作りますが、クラスそのものは必要ないので、抽象クラスとします。このクラスは、onReceiveメソッドをオーバーライドする必要があります。また、このメソッドでインテントを受け取ります。

SampleBatteryWidget.java

package sample.android.battery.widget;

import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;

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) {
        }
        
        @Override
        public IBinder onBind(Intent in) {
            return null;
        }
    }
    
    private static BroadcastReceiver batteryReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context c, Intent in) {
        }
    };
}

このままでは、まだインテントを受け取れないので、インテントフィルターを設定します。

package sample.android.battery.widget;

import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;

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) {
        }
    };
}

これで、インテントを受け取れるようになりました。

14.インテントからバッテリー残量の情報を引き出す

onReceiveメソッドで受け取ったインテントから、getIntExtraメソッドでバッテリー情報を引き出します。

SampleBatteryWidget.java

package sample.android.battery.widget;

import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;

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() {
        int scale = 100;
        int level = 0;
        
    @Override
    public void onReceive(Context c, Intent in) {
            String ac = in.getAction();
            if (ac.equals(Intent.ACTION_BATTERY_CHANGED)) {
                level = in.getIntExtra("level", 0);
                scale = in.getIntExtra("scale", 0);
            }
        }
    };
}

getIntExtraメソッドの引数に、"level"や"scale"とあります。"level"が残量で、"scale"が最大値です。他に、電圧"voltage"や温度"temperature"などが取得できます。

15.ウィジェットに表示する

ウィジェットへの表示には、ViewやSurfaceViewは使えません。TextViewやImageViewは使えるので、これらを使って描写します。

まずは、TextViewに名前を付けます。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	>
<TextView  
	android:id="@+id/textView"
	android:layout_width="fill_parent" 
	android:layout_height="wrap_content" 
	android:text="@string/hello"
	/>
</LinearLayout>

次に、TextViewの名前を指定して、RemoteViews経由で表示します。

SampleBatteryWidget.java

package sample.android.battery.widget;

import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.widget.RemoteViews;

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() {
        int scale = 100;
        int level = 0;
        
    @Override
    public void onReceive(Context c, Intent in) {
            String ac = in.getAction();
            if (ac.equals(Intent.ACTION_BATTERY_CHANGED)) {
                level = in.getIntExtra("level", 0);
                scale = in.getIntExtra("scale", 0);
            }
        }
        
        AppWidgetManager awm = AppWidgetManager.getInstance(c);
        ComponentName cn = new ComponentName(c, SampleBatteryWidget.class);
        RemoteViews rv = new RemoteViews(c.getPackageName(), R.layout.main);
        rv.setTextViewText(R.id.TextView, ""+(int)(level*100/scale));
        awm.updateAppWidget(cn, rv);
    };
}

16.実行する

これで、バッテリー残量ウィジェットが完成しました。さっそく実行してみます。

バッテリー残量ウィジェット完成

よし!ちゃんと表示されてます。バッテリー残量が変化したら、システムからインテントが送信されて、数字が変化するはずです。

これで基本は完成しましたが、デザインは超シンプルです。次は、参考までに、このウィジェットを少し改造してみます。

前へ   1  2  3  4   次へ