【Android小范例教程】
第2期
很多人都看过用过andorid的桌面小工具,比如可监视电池电量Widget、实时天气情况等等。这些都属于AndroidAppWIdget。要编写这样的小工具,其实不难。
设计思路一般是这样的:利用AppWIdgetProvider对象来构建自己的桌面工具,其中搭配BroadCastReceiver,用来监听其他应用程序发送的广播信息等。比如,电池电量一有变化就更新桌面的AppWidget。由于AppWidget可以被User新增,也可以被User丢进资源垃圾箱,所以AppWIdget也有生命周期。
当重写onUpdate()方法的时候,就会第一次进入AppWIdget的更新周期中。又因为在AndroidManifest.xml里是定义在<receiver>TAG当中,所以手机对操作系统广播"android.appwidget.action.APPWIDGET_UPDATE"信息的时候,就会被AppWidgetProvider获取。
一般流程,在AppWidget的onUpdate的时候,启动自己的系统服务,再到Service里面注册一个BroadcastReceiver。每个AppWidget都有更新时间设置,时间一到,就会更新到AppWidget的RemoteView对象。最后当AppWidget被拖放到资源垃圾箱的时候,onDelete就会被调用。
示例代码:
AppWidgetDemo.java
import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.widget.RemoteViews;
public class AppWidgetDemo extends AppWidgetProvider
{
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds)
{
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);
context.startService(new Intent(context, UpdateService.class));
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++)
{
int appWidgetId = appWidgetIds[i];
Intent configIntent = new Intent(context, MyActivity.class);
PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0,
configIntent, 0);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.main);
remoteViews.setOnClickPendingIntent(R.id.Button01, configPendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
}
}
public static class UpdateService extends Service
{
@Override
public IBinder onBind(Intent intent)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
/* 取得Widget的View */
RemoteViews updateViews = new RemoteViews(this.getPackageName(),
R.layout.main);
updateViews.setTextViewText(R.id.TextView01, "" + MyActivity.text);
/* 更新widget */
ComponentName thisWidget = new ComponentName(this, EX04_28_1.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, updateViews);
}
}
}
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MyActivity extends Activity
{
EditText EditText01;
Button Button02;
public static String text = "";
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.config);
EditText01 = (EditText) findViewById(R.id.EditText01);
Button Button02 = (Button) findViewById(R.id.Button02);
Button02.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0)
{
// TODO Auto-generated method stub
final Context context = MyActivity.this;
context
.startService(new Intent(context, EX04_28_1.UpdateService.class));
text = "" + EditText01.getText();
Intent resultValue = new Intent();
setResult(RESULT_OK, resultValue);
finish();
}
});
}
}
<TableLayout android:id="@+id/TableLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@android:color/white">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/EditText01"/>
<Button
android:text="OK"
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</TableLayout>
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:text=""
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black">
</TextView>
<Button
android:text="set"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</LinearLayout>