【Android小范例教程】【2】手机桌面小工具

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

MyActivity.java


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

}

config.xml
<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>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值