あんざいゆき
2011年12月5日
バッテリー表示ウィジェットを作ろう! by あんざいゆき is licensed
under a Creative Commons 表示 - 非営利 - 改変禁止 3.0 非移植 License.
docs.google.comにある作品に基づいている。
第4回 GTUG Girls Meetup バッテリー表示ウィジェットを作ろう! |
この資料のURL :
1-2. AppWidgetProvider を継承したクラスを作る
1-4. MyBatteryWidgetProvider とウィジェットの定義ファイルを AndroidManifest に登録する
2-1. バッテリーの情報を受取るための BroadcastReceiver を作成する
2-2. 2-1で作ったバッテリー情報を受取る BatteryHandler を登録するためのサービスを作成する
2-3. 2-2で作ったサービスをAndroidManifest.xml に登録する
3-1. バッテリーの情報を表示するための TextView に ID をつける
3-2. ウィジェットのバッテリーの情報を更新するためのメソッドを作成する
3-3. RemoteViews を使ってウィジェットの TextView を更新する
1. テキスト表示するだけのウィジェットを作る |
[File] - [New] - [Android Project] を選択
ProjectName に MyBatteryWidget と入力して Next をクリック
Android 2.1 を選択して Next をクリック
ApplicationName に MyBatteryWidget、Package Name に com.example.android.mybatterywidget と入力し、CreateActivity のチェックボックスを外して Finish をクリック
パッケージを選択して右クリック - [New] - [Class] を選択
Name に MyBatteryWidgetProvider と入力し、Superclass の Browse... をクリック
AppWidgetProvider を選択して OK をクリック
先ほどのダイアログで Finish をクリック
res フォルダを選択して右クリック - [New] - [Folder] を選択
Folder name に xml と入力して Finish をクリック
xml フォルダーを選択して右クリック - [New] - [Android XML File] を選択
Resource Type に AppWidget Provider を選択し、File に widget と入力して Finish をクリック
widget.xml をダブルクリックして開き、Min width と Min height に 146dip と入力し、initial layout の Browser... をクリック
[Layout] - [main] を選択して OK をクリック
Ctrl キー (Mac だと Command キー) + s キーでファイルを保存する
AndroidManifest.xml ファイルをダブルクリックして開く
下の Application タグをクリックし、Application Nodes の Add... ボタンをクリックする。
Receiver を選択して OK を押す。
Attributes for Provider の Name の Receiver... をクリックする
MyBatteryWidgetProvider を選択して OK をクリック
下のタブの AndroidManifest.xml を選択
<receiver> タグの間に <intent-filter> を <meta-data> を追加
AndroidManifest.xml
---
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.mybatterywidget"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver android:name="MyBatteryWidgetProvider" >
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget" />
</receiver>
</application>
</manifest>
---
実行してみよう!
ホーム画面でロングタップ - Widget - MyBatteryWidget を選択
Hello World! とでればOK!
res/layout/main.xml をダブルクリックして開く。
下の main.xml タブをクリックする
LinearLayout に android:background=”#ff99ffff” を入れる。
main.xml
---
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#ff99ffff" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
---
* やってみよう : #ff99ffff の部分をいろんなカラーコードに変えてみよう。
(#aarrggbb の形式 : aa = alpha, rr = red, gg = green, bb = blue)
main.xml
---
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#ff99ffff" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:textColor="#ff336666"
android:textSize="26dp" />
</LinearLayout>
---
文字の色 android:textColor=”#aarrggbb”
文字の大きさ android:textSize=”**dp”
2. バッテリーの情報を取得する |
MyBatteryWidgetProvider.java をダブルクリックして開く
MyBatteryWidgetProvider.java
---
public class MyBatteryWidgetProvider extends AppWidgetProvider {
static final BatteryHandler mReceiver = new BatteryHandler();
static final class BatteryHandler extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
int batteryLevel = level * 100 / scale;
Log.d("MyBatteryWidgetProvider", "batteryLevel = " + batteryLevel);
}
}
}
---
MyBatteryWidgetProvider.java
---
public class MyBatteryWidgetProvider extends AppWidgetProvider {
static final BatteryHandler mReceiver = new BatteryHandler();
static final class BatteryHandler extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
int batteryLevel = level * 100 / scale;
Log.d("MyBatteryWidgetProvider", "batteryLevel = " + batteryLevel);
}
}
static boolean mAttached = false;
public static class MyBatteryWidgetService extends Service {
@Override
public void onCreate() {
super.onCreate();
if (!mAttached) {
mAttached = true;
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
getApplicationContext().registerReceiver(mReceiver, filter);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onDestroy() {
if (mAttached) {
mAttached = false;
getApplicationContext().unregisterReceiver(mReceiver);
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
}
---
AndroidManifest.xml をダブルクリックして開き、下の方の Application タグを選択する。
Application Nodes の Add... ボタンをクリックし、Serivice を選択して OK をクリックする。
Attribute for Service の Name の Browse... ボタンをクリックし、MyBatteryWidgetService を選択して OK を押す。
Attribute for Service の Process の Browse... ボタンを押し、ダイアログ内の New String... ボタンを押す。
String と New R.string. に remote と入力して OK をクリック。
remote を選択して OK をクリック。
Ctrl キー (Mac だと Command キー) + s キー を押して AndroidManifest.xml ファイルの変更を保存する。
MyBatteryWidgetProvider.java
---
public class MyBatteryWidgetProvider extends AppWidgetProvider {
static final BatteryHandler mReceiver = new BatteryHandler();
static final class BatteryHandler extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
int batteryLevel = level * 100 / scale;
Log.d("MyBatteryWidgetProvider", "batteryLevel = " + batteryLevel);
}
}
static boolean mAttached = false;
public static class MyBatteryWidgetService extends Service {
@Override
public void onCreate() {
super.onCreate();
if (!mAttached) {
mAttached = true;
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
getApplicationContext().registerReceiver(mReceiver, filter);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onDestroy() {
if (mAttached) {
mAttached = false;
getApplicationContext().unregisterReceiver(mReceiver);
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Intent intentService = new Intent(context, MyBatteryWidgetService.class);
context.startService(intentService);
}
}
---
実行してみよう!
Logcat 画面を開いて、batteryLevel がでていれば OK!
* Logcat の開き方
右上の Open Perspective ボタンをクリック
DDMS を選択
Logcat ウィンドウを選択
3. バッテリーの情報をウィジェットに表示する |
res/layout/main.xml をダブルクリックして開き、TextView に android:id=”@+id/battery_info” を追加する
---
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#ff99ffff" >
<TextView
android:id="@+id/battery_info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:textColor="#ff336666"
android:textSize="26dip" />
</LinearLayout>
---
MyBatteryWidgetProvider.java をダブルクリックして開く
MyBatteryWidgetProvider.java
---
public class MyBatteryWidgetProvider extends AppWidgetProvider {
static final BatteryHandler mReceiver = new BatteryHandler();
static final class BatteryHandler extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
int batteryLevel = level * 100 / scale;
Log.d("MyBatteryWidgetProvider", "batteryLevel = " + batteryLevel);
updateAppWidget(context, batteryLevel);
}
}
static boolean mAttached = false;
public static class MyBatteryWidgetService extends Service {
@Override
public void onCreate() {
super.onCreate();
if (!mAttached) {
mAttached = true;
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
getApplicationContext().registerReceiver(mReceiver, filter);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onDestroy() {
if (mAttached) {
mAttached = false;
getApplicationContext().unregisterReceiver(mReceiver);
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Intent intentService = new Intent(context, MyBatteryWidgetService.class);
context.startService(intentService);
updateAppWidget(context, -1);
}
private static void updateAppWidget(Context context, int batteryLevel) {
}
}
---
MyBatteryWidgetProvider.java
---
public class MyBatteryWidgetProvider extends AppWidgetProvider {
….
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Intent intentService = new Intent(context, MyBatteryWidgetService.class);
context.startService(intentService);
updateAppWidget(context, -1);
}
private static final ComponentName WIDGET_COMPONENT_NAME = new ComponentName(
"com.example.android.mybatterywidget",
"com.example.android.mybatterywidget.MyBatteryWidgetProvider");
private static void updateAppWidget(Context context, int batteryLevel) {
RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.main);
views.setTextViewText(R.id.battery_info, "batteryLevel =" + batteryLevel);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(WIDGET_COMPONENT_NAME, views);
}
}
---
実行してみよう!
おまけ. レイアウトを変更したり、画像を入れたり、表示する文字を変えてみよう!
第4回 GTUG Girls Meetup /